ลูกยังชอบเครื่องบินอยู่ ผมเลยอัปเกรดเรดาร์
(jacobbartlett.substack.com)- แอปเรดาร์ iOS ส่วนตัว Aviator 2.0 เป็นอัปเดตที่กลับมาใช้งานได้อีกครั้งหลังปัญหาขัดข้องของ OpenSky Network ที่ต่อเนื่องมาตั้งแต่ต้นเดือนธันวาคม และปรับแก้ความไม่สะดวกที่พบจากการใช้งานจริงในคราวเดียว
- เมนูควบคุมใหม่ใช้โครงสร้าง การเปิดเผยแบบค่อยเป็นค่อยไป แยกการควบคุมหลักออกจากเครื่องมือขั้นสูง และใช้ SwiftUI modal detent กับการโต้ตอบกับพื้นหลัง เพื่อให้บังหน้าจอเรดาร์น้อยลง
- ปัญหาที่จับเครื่องบินที่อยู่ไกลเกินไปถูกลดลงด้วย สวิตช์ซูมแบบไบนารี โดยทำผ่านการเปลี่ยน MapKit camera distance เป็น 70 กม. หรือ 100 กม.
- ใช้ข้อมูล
origin_country, ความสูง และcategoryจาก OpenSky Network API เพื่อเพิ่ม การแสดงธงชาติ, ตัวกรองความสูงต่ำสำหรับวันที่มีเมฆมาก และการแยกไอคอนสำหรับเฮลิคอปเตอร์ ดาวเทียม และขนาดเครื่องบิน - ผู้ใช้สามารถใช้ HTTP Basic authentication ด้วย ข้อมูลล็อกอิน OpenSky Network ได้ แต่ในเวอร์ชัน 2.0 รหัสผ่านจะถูกเก็บใน User Defaults จึงควรหลีกเลี่ยงการใช้รหัสผ่านสำคัญซ้ำ
เบื้องหลังการอัปเดต Aviator 2.0
- Aviator — Radar on your Phone เป็นแอปเรดาร์ iOS ที่สร้างขึ้นเพื่อค้นหาเครื่องบินร่วมกับลูก
- หลังจากบทความก่อนหน้า อาจคิดถึงรีลีสใหม่และโอกาสในการหารายได้ได้ แต่แอปกำลังแสดงข้อผิดพลาดให้ผู้ใช้ตั้งแต่ต้นเดือนธันวาคม เนื่องจากปัญหาของ OpenSky Network
- เมื่อเปิดแอปอีกครั้ง ก็ได้ยินเสียงแจ้งเตือนการตรวจพบเครื่องบินแทนข้อผิดพลาด 502 ที่เห็นมาตลอด จึงยืนยันได้ว่าแอปกลับมาทำงานปกติ
- จากนั้นใช้เวลาสองช่วงเย็นทำงานกับ Aviator 2.0 โดยนำไอเดียเดิมมาปรับใช้
UI ควบคุมใหม่ที่บังเรดาร์น้อยลง
- ใน 2.0 ย้ายคอนโทรลไปไว้ในเมนูแยก โดยวางการควบคุมสำคัญไว้ด้านหน้า และวางเครื่องมือขั้นสูงที่ใช้น้อยกว่าไว้ด้านล่าง
- โครงสร้างนี้ใช้ การเปิดเผยแบบค่อยเป็นค่อยไป (progressive disclosure)
- เมนูนี้สร้างด้วย SwiftUI modal และมี
presentationDetentsสองแบบprimary:0.15ของความสูงหน้าจอextended:0.4ของความสูงหน้าจอ
- ใช้ตัวบ่งชี้การลากเพื่อแสดงว่าเมนูขยายได้ และใช้
presentationBackgroundInteraction(.enabled)เพื่อไม่ให้ UI เรดาร์หลักถูกเงาทับ - ใน
presentationBackgroundใช้ เอฟเฟกต์ emboss ของ Paul Hudson เพื่อเพิ่มพื้นผิวโลหะให้เหมือนแผงควบคุมเรดาร์จริง - ใน 2.1 มีแผนจะใช้ TipKit เพื่อให้ผู้ใช้ Apple วัยเด็กสังเกตเห็นโครงสร้างการเปิดเผยแบบค่อยเป็นค่อยไปได้
การปรับระดับซูมและระยะเรดาร์
- ใน 1.0 เรดาร์ทำงานดีเกินไป จนจับเครื่องบินที่อยู่เลยเส้นขอบฟ้าหรืออยู่หลังภูมิประเทศซึ่งมองไม่เห็นได้ด้วย
- ในสภาพแวดล้อมอย่างชานกรุงลอนดอนที่มีภูมิประเทศเป็นขั้น ๆ และเชื่อมต่อกันเหมือนเกาะ เรื่องนี้กลายเป็นความไม่สะดวกในการใช้งานจริง
- ในพื้นที่เปิดโล่ง ยังสามารถมองเห็นเครื่องบินที่อยู่ไกลได้ จึงมองว่าเป็นแค่ปัญหาความไวได้ยาก
- ทางแก้คือการใส่ ฟังก์ชันซูม
- ใช้
cameraของ MapKit SDK โดยส่งdistanceเป็นหน่วยเมตร เพื่อซูมเข้า-ออกบนพื้นผิวโลก- ถ้า
zoomedเป็น true จะเป็น70 * 1_000 - ถ้าเป็น false จะเป็น
100 * 1_000
- ถ้า
- ระหว่างทำให้เสร็จเร็วเพื่อรีลีสช่วงสุดสัปดาห์ ได้ลบวงเรดาร์ออกหนึ่งวงเพื่อเน้น UI ที่ซูมเข้า
- ตอนแรกตั้งใจใช้
Sliderจัดการระดับซูม แต่แม้บนชิป A17 ก็ยังได้เฟรมเรตไม่เพียงพอ จึงใช้ สวิตช์ซูมแบบไบนารี ในปัจจุบัน
ฟีเจอร์ที่เพิ่มด้วยข้อมูลจาก OpenSky Network
-
การแสดงธงชาติ
- OpenSky Network API รวบรวมข้อมูลหลากหลายจากทรานสปอนเดอร์ของเครื่องบิน แต่ใน 1.0 ยังไม่ได้ใช้ข้อมูลเหล่านี้อย่างเต็มที่
- ใน 2.0 เพิ่มสวิตช์สำหรับแสดงประเทศต้นทางเป็น อีโมจิธงชาติ ใต้ไอคอนเครื่องบินแต่ละลำ
- การใช้งานอิงจากค่า
origin_country - รับสตริงข้อความประเทศต้นทางที่ API ให้มา
- แปลงเป็นรหัสประเทศ 2 ตัวอักษรด้วยรายชื่อประเทศที่พบทางออนไลน์
- แปลงรหัสประเทศเป็น Unicode scalar เพื่อประกอบเป็นอีโมจิธงชาติ
- เมื่อผู้ใช้เปิดฟีเจอร์ จะแสดง
flight.flagเป็นข้อความของ MapKit annotation
-
โหมดวันที่มีเมฆมาก
- ในวันที่มีเมฆมากในสหราชอาณาจักร เครื่องบินจำนวนมากที่แสดงในแอปถูกเมฆบังจนมองไม่เห็นจริง
- เพิ่มปุ่มซ่อนเครื่องบินที่บินสูง เพื่อให้สลับระหว่างโหมดท้องฟ้าแจ่มใสกับโหมดฝนตกได้
- ใช้ข้อมูลความสูงที่ได้รับจาก OpenSky Network และใช้ 2.5 กม. เป็นค่าพื้นฐานของฐานเมฆต่ำ
- ถ้า
geo_altitude < 2500.0ค่าisLowAltitudeจะเป็น true - ถ้าเปิดการตั้งค่า
cloudyจะแสดงเฉพาะเครื่องบินความสูงต่ำใน MapKit annotation
การปรับปรุงไอคอนเครื่องบิน
- ระหว่างทดสอบในสวนสาธารณะ มีเฮลิคอปเตอร์บินผ่านเหนือศีรษะ แต่ Aviator แสดงเป็นไอคอนเครื่องบินทั่วไป
- OpenSky Network API จะให้พร็อพเพอร์ตี
categoryที่ระบุประเภทของอากาศยานที่ทรานสปอนเดอร์สังกัดอยู่ หากเพิ่ม query parameter - หมวดหมู่นี้อาจมีรายการเช่น
- อากาศยานเบาที่มีน้ำหนักต่ำกว่า 15,500 ปอนด์
- อากาศยานหนักที่มีน้ำหนักมากกว่า 300,000 ปอนด์
- อากาศยานปีกหมุน เช่น เฮลิคอปเตอร์
- ยานพาหนะอวกาศ/ผ่านชั้นบรรยากาศ
- ร่มชูชีพหรือสกายไดเวอร์
- อัปเดตล่าสุดแยก ระดับขนาดของอากาศยาน และแสดงดาวเทียมกับเฮลิคอปเตอร์ด้วยไอคอนแยกต่างหาก
- ใน enum
AircraftCategoryแยกค่ารูปภาพ อีโมจิ และสเกลออกจากกันrotorcraftใช้ SFSymbolxmark.circle.fillspaceTransatmosphericใช้อีโมจิ 🛰️small,large,heavyใช้สเกล0.6,1,1.5ตามลำดับ
- อีโมจิเฮลิคอปเตอร์เมื่อแปลงเป็นระนาบสีเดียวแล้วดูโค้งมนเกินไป จึงเลือก SFSymbol รูปกากบาทในวงกลมที่เป็นนามธรรมกว่า
- เพื่อจัดการอีโมจิเหมือนรูปภาพ จะสเกล
Textแล้วใช้เป็นมาสก์ของRectangleจากนั้นใส่สีและเอฟเฟกต์หน้าจอ CRT
การล็อกอิน OpenSky Network ของผู้ใช้
- เพิ่มฟีเจอร์ให้ผู้ใช้ป้อน ข้อมูลรับรอง OpenSky Network ของตนเองได้
- ฟีเจอร์นี้เป็นหนึ่งในฟีเจอร์ที่มีคนขอมากที่สุดรองจากเวอร์ชัน Android และมีเป้าหมายเพื่อหลีกเลี่ยง rate limiting ของการใช้งาน API แบบไม่ยืนยันตัวตน
- สามารถป้อนบัญชีได้ในเมนูควบคุมแบบเต็ม และมีลิงก์ไปยังหน้าลงทะเบียนให้ด้วย
- สร้างด้วย
TextFieldและSecureFieldของ SwiftUI@AppStorage("username")@AppStorage("password")
- ใน 2.0 ระหว่างเร่งนำขึ้นโปรดักชัน รหัสผ่านถูกเก็บไว้ใน User Defaults
- รีลีสถัดไปมีแผนจะเก็บใน Keychain และในตอนนี้ไม่ควรใช้รหัสผ่านสำคัญซ้ำ
- ชื่อผู้ใช้และรหัสผ่านที่ป้อนจะถูกเข้ารหัสเป็น Base64 แล้วแนบเป็นการยืนยันตัวตนแบบ
Basicในเฮดเดอร์Authorizationของคำขอ API
สรุป
- Aviator 2.0 เป็นอัปเดตที่ปรับปรุงแอปให้เล่นกับลูกได้ต่อไป
- ขอไอเดียฟีเจอร์หรือทิป ASO ในคอมเมนต์ และขอให้ดาวน์โหลดพร้อมรีวิว Aviator — Radar on your Phone 2.0
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
นี่เป็นภาคต่อของโพสต์ที่ค่อนข้างได้รับความนิยมเมื่อสองเดือนก่อน
0: https://news.ycombinator.com/item?id=38435908 My toddler loves planes, so I built her a radar (1304 points, 56 days ago)
พอเห็นแอปนี้ก็ทำให้นึกถึงปัญหาที่เคยเจอสมัยเขียนโปรแกรม DVD ขึ้นมาได้ ปัญหาคือ ปุ่มสลับ ทำให้ไม่ชัดเจนว่าโหมดไหนกำลังเปิดใช้อยู่
ไอคอนธงหรือเมฆกำลังบอกโหมดปัจจุบันอยู่ หรือเป็นปุ่มที่ต้องกดเพื่อเปลี่ยนไปโหมดนั้นกันแน่ มันชวนสับสน แม้แต่ตัวสลับสภาพอากาศก็ยังทำให้รู้สึกกลับกัน ว่าต้องกดเมฆเพื่อดูโหมดครึ้มหรือกดเพื่อเปลี่ยนกลับไปหน้าจอฟ้าใส
ในโปรเจกต์ที่กำลังทำอยู่ตอนนี้ ปุ่ม +/- ใช้ปรับขนาดช่วงเวลา โดยที่เวลาเริ่มต้น ปุ่ม + จะลดค่าหน่วยวินาที และปุ่ม - จะเพิ่มค่า แต่ที่เวลาสิ้นสุดกลับตรงกันข้าม เมื่อมองจากมุมของขนาดหน้าต่าง ทั้งสองแบบก็ถือว่าทำงานตามคาด ดังนั้นสุดท้ายต้องทำให้ มุมมองของผู้ใช้ ชัดเจน
ปุ่มสลับคำบรรยายของ YouTube ก็เหมือนกัน มันสลับไปมาระหว่างพื้นดำตัวอักษรขาวกับพื้นขาวตัวอักษรดำ สุดท้ายต้องกดดูก่อน แล้วถ้าปากขยับแต่ไม่มีซับ ก็ต้องลองอีกโหมดของไอคอน
พอโลกย้ายมาใช้หน้าจอสัมผัสกันหมด ก็เหมือนสามัญสำนึกเรื่อง การตอบสนองของตำแหน่งอินพุตที่มีสถานะ หายไป
แล้วมันก็สับสนจริง ๆ ด้วย ตอนแก้บั๊กนาทีสุดท้ายก่อนปล่อย ผมดันใส่ไอคอนเมฆกลับด้านจากตัวอื่นทั้งหมด
ถ้าตอนเรดาร์กวาดผ่านเครื่องบินแล้วมีการ กระพริบแสดงผล จากนั้นตำแหน่งคงที่ไว้และค่อย ๆ จางหายจนกว่าจะถึงรอบกวาดถัดไป น่าจะเท่มาก
อีกอย่าง ถ้าดูความสูงและตำแหน่ง GPS ปัจจุบันของอุปกรณ์ แล้วใช้ข้อมูลอาคาร เนินเขา และความสูงบริเวณรอบ ๆ จาก OpenStreetMap เพื่อคำนวณเส้นขอบฟ้าที่มองเห็นได้ตามแต่ละมุมทิศ ก็น่าจะดีมาก แบบนั้นจะสามารถแสดงบนแผนที่เป็นเหมือน การบดบังของเรดาร์ ได้ ให้อารมณ์เหมือนโซนาร์ตรวจปลาเวลามีท่อนไม้ขวาง หรือเรดาร์เรือที่มีเรือลำอื่นบังอยู่
ถ้าทำแบบนั้นได้ คนในวงการคงเกาหัวกันว่ามือถือสแกนแบบรัศมีได้ยังไง
[1] https://www.researchgate.net/figure/Occlusion-percentage-for...
ผมเคยเขียนความเห็นนี้ไว้ในบล็อก และในฐานะพ่อแม่ของเด็กเล็กก็เห็นด้วยว่าการเลือกสีนั้นสำคัญที่สุด
เพราะนี่เป็นไซด์โปรเจกต์ที่สนุก เลยมีไอเดียฟีเจอร์บางอย่างที่อาจยังไม่ได้ทำ อย่างแรกคือ มุมมองสด ที่ใช้กล้องมือถือกับความสามารถ AR ของ iPhone เพื่อแสดงจุดในตำแหน่งคร่าว ๆ ที่เครื่องบินอยู่ ผมเคยลองเขียนโค้ดคำนวณจากตำแหน่งผู้ใช้กับข้อมูล ADS-B ไว้นิดหน่อย
อย่างที่สองคือให้ทำเครื่องหมายว่าเห็นเครื่องบินแล้วหรือพลาดไปแล้ว และอาจเอาฟีดแบ็กนั้นไปใช้ปรับสิ่งที่แสดงผลได้
อย่างที่สามคือแบดจ์กับสถิติ ถ้าลูกสาวของคุณคล้ายลูกผม เธอน่าจะชอบการได้แบดจ์ในแอป สามารถเก็บประวัติการสังเกตย้อนหลังไว้ในฐานข้อมูลภายในเครื่อง เพื่อให้ติดตามอย่างเช่น “จำนวนสายการบินที่เคยเห็น”, “จำนวนรุ่นเครื่องบินที่เคยเห็น”, “เวลาบินที่ไกลที่สุด”, “เวลาบินที่สั้นที่สุด” ได้ แต่ก็เข้าใจดีถึงปัญหาที่ตามมากับการทำแอปสำหรับเด็กให้เป็นเกม
ผมพูดบ่อยว่าทำไมถึงไม่ควรเอาเงิน 30 ดอลลาร์ไปซื้อสกุลเงินดิจิทัลอย่าง Robux มันไม่เหมือนแร็กเก็ตเทนนิสหรือรองเท้าที่มีคุณค่าในโลกจริง
เพราะแบบนั้นผมเลยต่อต้านการทำให้เป็นเกม และอยากมอบเครื่องมือให้เขาเพื่อไม่ให้ถูกดูดเวลาไปกับการทำอะไรซ้ำ ๆ เป็นชั่วโมงเพียงเพื่อได้แบดจ์หรือของดิจิทัลไร้ค่า
ถ้าเป็นแอปสำหรับเด็ก ผมคิดว่าไม่ควรใส่ฟีเจอร์แบบนั้นเลย มันควรเป็นแอปที่ไม่มีโฆษณา ไม่มีการทำให้เป็นเกม แต่เพิ่มคุณค่าจริงให้ชีวิต และแสดงให้เห็นว่าแอปแบบนั้นมีอยู่จริง
มีใครใน HN อยากลองทำโปรเจกต์โอเพนซอร์สแบบคราวด์ซอร์สเพื่อ พอร์ตลง Android ไหม?
เรื่องไลเซนส์ผมก็เดาเอา แต่คนที่สร้าง GitHub repository แรกอาจใส่คำพูดของผู้เขียนนี้ไว้ได้ว่า “ผมกำลังรอ Android engineer ที่มีความมุ่งมั่นพอร์ตมันด้วยตัวเองอยู่ ผมใส่รายละเอียดไว้ในบทความมากพอแล้ว จะทำก็ได้ตราบใดที่ปล่อยให้ทุกคนใช้ฟรีเท่านั้น”
ถึงจะไม่ได้มีส่วนช่วยกับแอปเรดาร์นี้จนกลายเป็นแอป Android คุณภาพสูง แต่ก็น่าจะคุ้มที่จะใช้เวลาไปกับการพอร์ตอะไรบางอย่างที่เข้ากับแนวคิด “An app can be a home-cooked meal”[0] เพราะมันน่าจะมีวิสัยทัศน์และกระบวนทัศน์ที่เป็นหนึ่งเดียว ไม่มีความเทอะทะ ไม่มีโฆษณา ไม่มีการติดตาม และจึงน่าจะทำความเข้าใจโค้ดได้ง่ายกว่า
ข้อเสนอนี้อาจพาให้ผมกลับไปพบความสนุกของการเขียนโปรแกรมอีกครั้งก็ได้
0: https://news.ycombinator.com/item?id=38877423
พูดนอกเรื่องนิดหน่อย แต่ในฐานะคนที่มีเซนส์เรื่องทิศทางไม่ค่อยดี ฟีเจอร์ที่สำคัญที่สุดในมือถือสำหรับฉันคือ ลูกศรเล็ก ๆ บนแผนที่บอกได้แม่นแค่ไหนว่าฉันกำลังหันไปทางไหน
ฉันใช้ Android แล้วเวลามันไม่มั่นใจ มันจะแสดง กรวยความไม่แน่นอน สีฟ้า และบางทีก็บอกให้ขยับมือถือเป็นรูปเลข 8 หรือชี้ไปที่อาคารรอบ ๆ เพื่อคาลิเบรต
ในทางเทคนิค ข้อจำกัดตรงนี้คืออะไร? iPhone ดีกว่า Android ไหม? ปัญหาอยู่ที่ฮาร์ดแวร์, accelerometer, เข็มทิศ, สัญญาณ GPS หรือซอฟต์แวร์กันแน่? ฉันยังสับสนอยู่ค่อนข้างบ่อย และมันก็แสดงกรวยไปผิดทิศผิดทางอยู่เรื่อย ๆ ถ้า iPhone ดีกว่าอย่างชัดเจน เรื่องนี้สำคัญพอที่ฉันจะย้ายค่ายเลย
ตอนแรกคิดว่าน่าจะเป็นข้อจำกัดฝั่ง GPS แต่ direction delegate ของ CoreLocation อย่างน้อยบนอุปกรณ์ของฉันก็คืนค่าทิศทางได้สมบูรณ์แบบที่เฟรมเรต 120Hz
อาจเป็นไปได้ว่า Google Maps แค่ไม่ค่อยดี
ทั้งคู่พลาดเรื่องค่าทิศทางบ่อยพอ ๆ กัน เพียงแต่สิ่งนี้เป็นการคาดเดาจากประสบการณ์ใช้งาน ไม่ใช่ข้อเท็จจริงที่ยืนยันได้
ใน iOS สมัยก่อน ลูกศรที่หน่วงช้า น่ารำคาญพอสมควร แต่ตอนนี้พอฮาร์ดแวร์เร็วขึ้น ลูกศรที่กระโดดไปมา บนแพลตฟอร์มอื่นกลับเด่นชัดกว่า
สรุปคือ ฮาร์ดแวร์รุ่นใหม่ส่วนใหญ่มีความสามารถใกล้เคียงกันในการระบุตำแหน่งของตัวเองในอวกาศและเวลาได้ค่อนข้างแม่นยำ แต่ความเก่งในการทำ dead reckoning และการประเมินท่าทางจากข้อมูลปัจจุบัน รวมถึงวิธีจัดการการกรองสัญญาณรบกวนให้ตรงกับความคาดหวังของผู้ใช้เวลาถืออยู่ในมือ แตกต่างกันไปตามซอฟต์แวร์นำทางแต่ละตัว
ฉันติดเฮฟวีเมทัลเพราะเกม Tony Hawk ทั้งหลาย Motörhead “Ace of Spades” ใน THPS3 กับ Iron Maiden “Number of the Beast” ใน THPS4 คือจุดเริ่มต้น ดังนั้นอาจมี เส้นทางเศษขนมปังจากเกมแพลตฟอร์มไปสู่เฮฟวีเมทัล อยู่ก็ได้
ทำได้ดีในแง่ที่ทำให้ผู้ใช้ที่สำคัญที่สุดมีความสุขอย่างชัดเจน
เจ๋งมาก แถมยังทำให้อยากตั้ง
!remindmeไว้เพื่อกลับมาดูอีก 18 ปีว่าลูกสาวสอบผ่าน การสอบควบคุมการจราจรทางอากาศ หรือยังสงสัยว่าในโลกหลัง 9/11 เด็ก ๆ ยังถูกชวนเข้าไปดู ห้องนักบิน ได้อยู่ไหม
จำได้ลาง ๆ ว่ากดปุ่ม แล้วพ่อก็ชี้ให้ดูมาตรวัดที่ขยับ ความรู้สึกตอนเดินกลับไปที่นั่งเหมือนตัวเองเป็นเด็กที่ยิ่งใหญ่ที่สุดในโลกยังจำได้ชัด
หลัง 9/11 เรื่องแบบนั้นคงเกิดขึ้นได้ยากแน่นอน
กลับกัน ถ้าถามหลังลงจอดว่าเด็กขอดูห้องนักบินได้ไหม โอกาสสำเร็จจะสูงกว่ามาก
ระหว่างบิน แม้แต่ลูกเรือก็แทบไม่ได้เข้าไป และบางครั้งมีแค่หัวหน้าพนักงานต้อนรับที่เข้าได้ เด็ก ๆ จะถามตอนขึ้นเครื่องถ้าประตูห้องนักบินยังเปิดอยู่
เป็นเที่ยวบินภายในประเทศของ JetBlue ในสหรัฐฯ
ตอนเด็ก ๆ ฉันยังมีเข็มรูปปีกของ Delta ที่ได้มาตอนเดินทางและได้ดูห้องนักบินระหว่างบินอยู่ที่ไหนสักแห่ง มันเป็นประสบการณ์ที่ยอดเยี่ยมและยังจำได้จนทุกวันนี้ และหวังว่าเด็กคนอื่น ๆ จะได้สัมผัสอย่างน้อยสักส่วนหนึ่งของมัน