1 điểm bởi GN⁺ 2024-01-23 | 1 bình luận | Chia sẻ qua WhatsApp
  • Ứng dụng radar iOS cá nhân Aviator 2.0 là bản cập nhật hoạt động trở lại sau sự cố kéo dài từ đầu tháng 12 của OpenSky Network, đồng thời xử lý một loạt bất tiện lộ ra trong quá trình sử dụng thực tế
  • Menu điều khiển mới dùng cấu trúc tiết lộ dần để tách các thao tác chính và công cụ nâng cao, đồng thời được thiết kế để ít che màn hình radar hơn nhờ SwiftUI modal detent và tương tác với nền
  • Vấn đề bắt cả những máy bay ở quá xa được giảm bằng công tắc zoom nhị phân, triển khai bằng cách đổi MapKit camera distance sang 70 km hoặc 100 km
  • Tận dụng dữ liệu origin_country, độ cao và category của OpenSky Network API để thêm hiển thị cờ, bộ lọc độ cao thấp cho ngày nhiều mây, cùng phân biệt biểu tượng cho trực thăng, vệ tinh và kích thước máy bay
  • Người dùng có thể dùng xác thực HTTP Basic bằng thông tin đăng nhập OpenSky Network, nhưng trong bản 2.0 mật khẩu được lưu trong User Defaults nên cần tránh tái sử dụng mật khẩu nhạy cảm

Bối cảnh cập nhật Aviator 2.0

  • Aviator — Radar on your Phone là ứng dụng radar iOS được tạo ra để cùng con tìm máy bay
  • Sau bài viết trước, lẽ ra có thể nghĩ đến bản phát hành mới và cơ hội kiếm tiền, nhưng từ đầu tháng 12 ứng dụng đã báo lỗi cho người dùng do sự cố của OpenSky Network
  • Khi mở lại ứng dụng, thay vì lỗi 502 vẫn hiện liên tục, âm báo phát hiện máy bay vang lên, xác nhận ứng dụng đã hoạt động bình thường
  • Sau đó, trong hai buổi tối, tác giả đã tiến hành làm Aviator 2.0 bằng cách đưa các ý tưởng trước đó vào sản phẩm

UI điều khiển mới ít che radar hơn

  • Trong bản 2.0, các điều khiển được chuyển sang một menu riêng: thao tác quan trọng đặt ở phía trên, còn các công cụ nâng cao ít dùng hơn đặt ở phía dưới
  • Cấu trúc này dùng tiết lộ dần (progressive disclosure)
  • Menu được triển khai bằng SwiftUI modal và có hai presentationDetents
    • primary: 0.15 chiều cao màn hình
    • extended: 0.4 chiều cao màn hình
  • Chỉ báo kéo cho thấy có thể mở rộng menu, và presentationBackgroundInteraction(.enabled) giúp UI radar chính không bị phủ trong bóng mờ
  • presentationBackground áp dụng emboss effect của Paul Hudson để thêm chất liệu kim loại giống bảng điều khiển radar thật
  • Trong bản 2.1, tác giả dự định dùng TipKit để cả những người dùng Apple nhỏ tuổi cũng nhận ra cấu trúc tiết lộ dần

Điều chỉnh mức zoom và phạm vi radar

  • Ở bản 1.0, radar hoạt động quá tốt, đến mức bắt cả những máy bay ở bên kia đường chân trời hoặc sau địa hình nên không thể nhìn thấy
  • Ở những khu vực như ngoại ô London, nơi có địa hình bậc thang và môi trường kéo dài như các đảo nối tiếp nhau, điều này trở thành bất tiện trong sử dụng thực tế
  • Vì ở không gian mở vẫn có thể nhìn thấy máy bay ở xa, nên khó coi đây chỉ đơn giản là vấn đề độ nhạy
  • Giải pháp là thêm chức năng zoom
  • Việc phóng to/thu nhỏ bề mặt được triển khai bằng cách truyền distance theo mét vào camera của MapKit SDK
    • nếu zoomed là true thì 70 * 1_000
    • nếu false thì 100 * 1_000
  • Khi triển khai nhanh để kịp bản phát hành cuối tuần, tác giả đã bỏ một vòng radar để nhấn mạnh UI đang được phóng to
  • Ban đầu tác giả định xử lý mức zoom bằng Slider, nhưng ngay cả trên chip A17 cũng không đạt đủ frame rate, nên hiện tại dùng công tắc zoom nhị phân

Các tính năng được thêm bằng dữ liệu OpenSky Network

  • Hiển thị cờ

    • OpenSky Network API thu thập nhiều thông tin khác nhau từ transponder của máy bay, nhưng bản 1.0 chưa tận dụng đầy đủ dữ liệu này
    • Trong bản 2.0, một công tắc được thêm để hiển thị quốc gia xuất phát dưới mỗi biểu tượng máy bay dưới dạng cờ emoji
    • Việc triển khai dựa trên giá trị origin_country
    • Nhận chuỗi văn bản quốc gia xuất phát do API cung cấp
    • Chuyển đổi sang mã quốc gia 2 chữ cái bằng danh sách tên quốc gia tìm thấy trên mạng
    • Chuyển mã quốc gia thành Unicode scalar để tạo emoji cờ
    • Khi người dùng bật tính năng, flight.flag được hiển thị dưới dạng văn bản của MapKit annotation
  • Chế độ ngày nhiều mây

    • Vào những ngày nhiều mây ở Anh, nhiều máy bay hiển thị trong ứng dụng bị mây che nên thực tế không nhìn thấy
    • Một nút ẩn máy bay ở độ cao lớn được thêm vào để có thể chuyển giữa chế độ trời quang và chế độ trời mưa
    • Tính năng dùng dữ liệu độ cao nhận từ OpenSky Network, với 2,5 km làm giá trị đáy tham chiếu cho mây thấp
    • Nếu geo_altitude < 2500.0 thì isLowAltitude là true
    • Khi thiết lập cloudy được bật, chỉ máy bay ở độ cao thấp được hiển thị trên MapKit annotation

Cải tiến biểu tượng máy bay

  • Khi thử nghiệm trong công viên, một trực thăng bay qua ngay phía trên, nhưng Aviator lại hiển thị nó bằng biểu tượng máy bay thông thường
  • OpenSky Network API cung cấp thuộc tính category, thể hiện loại máy bay mà transponder thuộc về, nếu thêm tham số truy vấn
  • Danh mục này có thể bao gồm các mục như sau
    • Máy bay hạng nhẹ dưới 15.500 pound
    • Máy bay hạng nặng trên 300.000 pound
    • Tàu bay cánh quay như trực thăng
    • Phương tiện đi qua không gian/khí quyển
    • Dù hoặc người nhảy dù
  • Trong bản cập nhật mới nhất, ứng dụng phân biệt hạng kích thước máy bay và hiển thị vệ tinh cùng trực thăng bằng biểu tượng riêng
  • Trong enum AircraftCategory, hình ảnh, emoji và giá trị scale được tách riêng
    • rotorcraft dùng SFSymbol xmark.circle.fill
    • spaceTransatmospheric dùng emoji 🛰️
    • small, large, heavy lần lượt áp dụng scale 0.6, 1, 1.5
  • Emoji trực thăng trông quá tròn khi chuyển thành mặt phẳng đơn sắc, nên tác giả chọn SFSymbol hình chữ thập trong vòng tròn mang tính trừu tượng hơn
  • Để xử lý emoji như hình ảnh, tác giả scale Text rồi dùng làm mask cho Rectangle, sau đó áp dụng màu sắc và hiệu ứng màn hình CRT

Đăng nhập OpenSky Network của người dùng

  • Đã thêm tính năng cho phép người dùng tự nhập thông tin xác thực OpenSky Network
  • Đây là một trong những tính năng được yêu cầu nhiều nhất sau phiên bản Android, nhằm tránh rate limiting khi dùng API không xác thực
  • Người dùng có thể nhập tài khoản trong menu điều khiển đầy đủ, đồng thời có liên kết tới trang đăng ký
  • Tính năng được triển khai bằng TextFieldSecureField của SwiftUI
    • @AppStorage("username")
    • @AppStorage("password")
  • Trong bản 2.0, do đưa nhanh lên production, mật khẩu được lưu trong User Defaults
  • Bản phát hành tiếp theo sẽ lưu vào Keychain; hiện tại không nên tái sử dụng mật khẩu nhạy cảm
  • Tên người dùng và mật khẩu đã nhập được mã hóa Base64 rồi gắn vào header Authorization của yêu cầu API dưới dạng xác thực Basic

Kết

  • Aviator 2.0 là bản cập nhật tiếp tục cải thiện ứng dụng để có thể chơi cùng con
  • Tác giả mời bình luận ý tưởng tính năng hoặc mẹo ASO, đồng thời đề nghị tải và đánh giá Aviator — Radar on your Phone 2.0

1 bình luận

 
GN⁺ 2024-01-23
Ý kiến trên Hacker News
  • Đây là phần tiếp theo của một bài viết khá nổi tiếng cách đây hai tháng
    0: https://news.ycombinator.com/item?id=38435908 My toddler loves planes, so I built her a radar (1304 points, 56 days ago)

  • Nhìn ứng dụng làm tôi nhớ đến vấn đề từng gặp thời còn lập trình DVD. Với nút bật/tắt, không rõ hiện đang kích hoạt chế độ nào
    Dễ nhầm không biết biểu tượng lá cờ hay đám mây đang hiển thị chế độ hiện tại, hay là thứ cần bấm để chuyển sang chế độ đó. Nút bật/tắt thời tiết cũng cho cảm giác ngược lại: bấm vào đám mây là để xem chế độ nhiều mây, hay để chuyển sang màn hình trời quang?
    Trong dự án tôi đang làm hiện nay cũng có nút +/- để điều chỉnh kích thước cửa sổ phạm vi thời gian; ở thời điểm bắt đầu thì + làm giảm giá trị giây, còn - làm tăng. Ở thời điểm kết thúc thì ngược lại. Nếu nhìn từ góc độ kích thước cửa sổ thì cả hai đều đúng như kỳ vọng, nên rốt cuộc cần làm rõ góc nhìn của người dùng

    • Đây chính là phần tôi ghét nhất trong UX hiện đại, đặc biệt tệ trên ứng dụng TV. Nếu trong hai mục menu, một mục là chữ trắng đậm còn mục kia là chữ đen đậm, tôi không biết mình đang định bấm vào cái gì
      Nút bật/tắt phụ đề YouTube cũng chuyển qua lại giữa chữ trắng nền đen và chữ đen nền trắng, nên phải bấm thử trước; nếu thấy miệng vẫn mấp máy mà phụ đề không hiện thì lại thử chế độ biểu tượng khác
      Từ khi chuyển sang màn hình cảm ứng, có cảm giác những hiểu biết thông thường về phản hồi nhập liệu theo vị trí có trạng thái đã biến mất
    • Nhận xét đúng. Có lẽ tôi hơi bị ám ảnh với việc làm cho nó trông giống bảng điều khiển hơn là tạo UX tốt
      Hơn nữa đúng là nó gây nhầm lẫn. Trong lần sửa lỗi phút chót, tôi đã đưa biểu tượng đám mây vào ngược với các biểu tượng khác rồi phát hành như vậy
  • Sẽ rất tuyệt nếu khi tia quét radar đi qua máy bay thì nó nhấp nháy đánh dấu, rồi giữ nguyên vị trí và mờ dần cho đến lần quét tiếp theo
    Ngoài ra, nếu dùng độ cao GPS và vị trí hiện tại của thiết bị, kết hợp các tòa nhà, đồi núi và cao độ xung quanh từ OpenStreetMap để tính đường chân trời nhìn thấy theo từng phương vị thì cũng hay. Khi đó có thể hiển thị trên bản đồ như một dạng che khuất radar. Cảm giác giống máy dò cá quét qua khúc gỗ, hoặc radar tàu biển bị các tàu khác che khuất
    Nếu làm vậy, chắc người trong ngành sẽ vò đầu bứt tai tự hỏi điện thoại quét xuyên tâm kiểu gì
    [1] https://www.researchgate.net/figure/Occlusion-percentage-for...

    • Tất cả những ý tưởng này đều hay. Ứng dụng hiện tại gần giống phiên bản Pareto của một bản hoàn chỉnh 100% về tiềm năng
  • Tôi từng để lại suy nghĩ này trên blog, nhưng với tư cách phụ huynh có con nhỏ, tôi đồng cảm rằng phần chọn màu là quan trọng nhất
    Vì đây là một dự án phụ thú vị, có vài ý tưởng tính năng có thể chưa được triển khai. Thứ nhất là chế độ xem trực tiếp dùng camera điện thoại và tính năng AR của iPhone để hiển thị một chấm ở vị trí xấp xỉ của máy bay. Tôi từng viết thử một ít mã tính toán từ vị trí người dùng và thông tin ADS-B
    Thứ hai, có thể đánh dấu máy bay là “đã thấy” hoặc “bỏ lỡ”, rồi dùng phản hồi đó để điều chỉnh nội dung hiển thị
    Thứ ba là huy hiệu và thống kê. Nếu con gái anh giống con tôi, bé sẽ thích nhận huy hiệu trong ứng dụng. Có thể lưu lịch sử quan sát trước đây vào DB cục bộ để theo dõi những thứ như “số hãng bay đã thấy”, “số mẫu máy bay đã thấy”, “thời gian bay xa nhất”, “thời gian bay ngắn nhất”. Dù vậy, tôi hoàn toàn hiểu các vấn đề đi kèm với việc game hóa ứng dụng dành cho trẻ em

    • Nghe có thể hơi cổ hủ, nhưng tôi vẫn cố nói với con rằng hãy mong trở thành người tạo ra công nghệ, thay vì chỉ là người tiêu dùng công nghệ
      Tôi thường nói vì sao không nên chi 30 đô la cho các loại tiền kỹ thuật số như Robux. Tôi giải thích rằng nó khác với những món đồ có giá trị thực như vợt tennis hay giày
      Vì vậy tôi chống lại game hóa, và cố đưa cho con công cụ để không bị hút vào việc lặp đi lặp lại hàng giờ chỉ để kiếm huy hiệu hay hiện vật số vô giá trị
      Với ứng dụng dành cho trẻ em, tôi nghĩ tốt hơn là không nên đưa những tính năng này vào. Có thể cho trẻ thấy rằng vẫn tồn tại những ứng dụng không có quảng cáo, không bị game hóa, nhưng đem lại giá trị thực cho cuộc sống
    • Rất cảm ơn các ý tưởng. Tôi tò mò liệu có thể kiếm được Vision Pro cho ý tưởng số 1 không
  • Trong số người trên HN, có ai muốn làm một dự án nguồn mở crowdsourcing để port ứng dụng này sang Android không?
    Về giấy phép thì tôi đoán, người tạo kho GitHub ban đầu có thể dùng câu của tác giả: “đang chờ một kỹ sư Android đầy tinh thần tiên phong tự port nó. Tôi đã đưa đủ chi tiết vào bài viết. Miễn là cung cấp miễn phí cho mọi người thì cứ làm”

    • Cảm ơn đề xuất này. Tôi chưa từng làm ứng dụng di động, nhưng muốn học
      Ngay cả nếu không đóng góp được một ứng dụng Android chất lượng cao cho ứng dụng radar này, tôi nghĩ dành thời gian port một thứ gì đó phù hợp với mô hình “An app can be a home-cooked meal”[0] cũng rất đáng. Nó được xây dựng theo một tầm nhìn và mô hình duy nhất, không cồng kềnh, không quảng cáo, không theo dõi, nên có khả năng mã nguồn sẽ dễ hiểu
      Đề xuất này có thể dẫn tôi trở lại con đường tìm thấy niềm vui lập trình
      0: https://news.ycombinator.com/item?id=38877423
    • Tôi không có sức duy trì lâu dài, nhưng có lẽ có thể đóng góp một chút. Email có trong hồ sơ của tôi
  • Hơi lạc đề một chút, nhưng với tư cách là người có cảm giác phương hướng kém, tính năng quan trọng nhất trên điện thoại với tôi là mũi tên nhỏ trên bản đồ cho thấy chính xác đến đâu việc tôi đang nhìn về hướng nào
    Tôi dùng Android, và khi không chắc chắn, nó hiển thị hình nón bất định màu xanh, thỉnh thoảng còn bảo tôi di chuyển điện thoại theo hình số 8 hoặc chỉ vào các tòa nhà xung quanh để hiệu chỉnh
    Về mặt kỹ thuật, giới hạn ở đây là gì? iPhone có tốt hơn Android không? Vấn đề nằm ở phần cứng, gia tốc kế, la bàn, tín hiệu GPS hay phần mềm? Nó vẫn khá thường xuyên làm tôi bối rối khi hiển thị hình nón theo hướng sai. Nếu iPhone chắc chắn làm tốt hơn thì điều này quan trọng đến mức tôi gần như sẽ chuyển máy

    • Rất vui vì bạn nói điều này. Trong bài gốc tôi cũng đã quan sát như vậy
      Tôi từng nghĩ sẽ có giới hạn ở phía GPS, nhưng delegate hướng của CoreLocation trả về hướng hoàn hảo, ít nhất là ở tốc độ khung hình 120Hz trên thiết bị của tôi
      Có thể Google Maps đơn giản là không tốt lắm
    • Với tư cách là người dùng cả hai khá thường xuyên, tôi thấy Android có xu hướng truyền thẳng giá trị cảm biến thô, còn iOS có vẻ thêm một kiểu độ trễ debounce và suy đoán nào đó
      Cả hai đều sai hướng với tần suất tương tự nhau. Tuy vậy đây chỉ là phỏng đoán dựa trên trải nghiệm sử dụng, không phải sự thật chắc chắn
    • Sản phẩm Apple và animation nhìn chung đưa vào nhiều làm mượt và hysteresis hơn. Có vẻ họ che giấu độ chính xác với người dùng để mũi tên không rung lắc quá mạnh, còn UI Android thì có vẻ hiển thị thẳng hơn các artifact sinh ra từ hợp nhất GPS/IMU đầy nhiễu và sự thiếu chính xác vốn có của từ kế
      Trên iOS ngày xưa, mũi tên chậm khá gây khó chịu, nhưng giờ phần cứng nhanh hơn thì mũi tên giật nhảy trên các nền tảng khác lại nổi bật hơn
      Tóm lại, phần lớn phần cứng hiện đại có năng lực xác định vị trí của mình trong không gian và thời gian khá chính xác và tương đương nhau. Nhưng việc dùng dữ liệu hiện tại để định vị quán tính và ước tính tư thế tốt đến đâu, cũng như xử lý lọc nhiễu theo cách người dùng kỳ vọng khi cầm trên tay ra sao, thì khác nhau tùy phần mềm dẫn đường
  • Tôi mê heavy metal nhờ các game Tony Hawk. Motörhead “Ace of Spades” trong THPS3 và Iron Maiden “Number of the Beast” trong THPS4 là cơ duyên, nên có thể tồn tại một đường mòn vụn bánh mì dẫn từ game platformer tới heavy metal

  • Làm tốt ở chỗ đã chắc chắn khiến người dùng quan trọng nhất hài lòng

  • Tuyệt. Nhân tiện, tôi thấy muốn đặt !remindme để 18 năm nữa kiểm tra xem con gái có vượt qua kỳ thi kiểm soát không lưu không

    • Giờ bé 2 tuổi, mà giấy phép phi công học viên có thể lấy từ 16 tuổi, nên chỉ cần đặt nhắc sau 14 năm là được
    • Nếu con gái trở thành phi công thì có được bay miễn phí không? Có lẽ bạn đang bỏ lỡ cơ hội khéo léo hướng bé sang STEM đấy
  • Tôi thắc mắc liệu trong thế giới hậu 11/9, trẻ em vẫn có thể được mời vào buồng lái không

    • Bố tôi là phi công, và gia đình tôi thường sắp xếp kỳ nghỉ theo lịch bay của ông. Khi còn nhỏ, không có gì khiến tôi tự hào hơn khoảnh khắc được mời vào buồng lái sau khi máy bay được đẩy lùi và “khởi động động cơ”
      Tôi mang máng nhớ mình đã nhấn nút và bố chỉ cho tôi các đồng hồ đang chuyển động. Cảm giác khi quay lại ghế, như thể mình là đứa trẻ lớn nhất thế giới, thì vẫn rất rõ
      Sau 11/9, chắc chắn những chuyện như vậy khó xảy ra hơn
    • Tôi từng thấy một mẹo trên Internet rằng nếu con bạn muốn xem buồng lái thì tốt nhất đừng hỏi trước khi cất cánh. Lúc đó phi công có rất nhiều việc phải làm với checklist và chuẩn bị
      Ngược lại, nếu hỏi sau khi hạ cánh rằng trẻ có thể xem buồng lái không, khả năng thành công sẽ cao hơn nhiều
    • Con tôi vẫn đã được vào buồng lái sau 11/9. Nhưng phải là trước khi cất cánh
      Trong khi bay, ngay cả tiếp viên cũng hầu như không được vào, thỉnh thoảng chỉ có tiếp viên trưởng mới có thể vào. Bọn trẻ sẽ hỏi lúc lên máy bay nếu cửa buồng lái vẫn đang mở
    • Ngày 1 tháng 1 năm 2024, đứa trẻ sáu tuổi của tôi lần đầu tiên được mời vào buồng lái. Cho đến khoảnh khắc đó tôi cũng có cùng thắc mắc
      Đó là chuyến bay nội địa Mỹ của JetBlue
    • Tôi từng thấy chuyện đó xảy ra khi máy bay đang ở cổng. Các phi công thường để cửa mở, nên bạn có thể lại gần nói chuyện. Tệ nhất thì chỉ bị từ chối, nên cũng đáng hỏi
      Tôi vẫn còn đâu đó chiếc ghim cánh Delta được tặng khi xem buồng lái trên đường bay lúc nhỏ. Đó là một trải nghiệm tuyệt vời mà tôi vẫn nhớ, và tôi hy vọng những đứa trẻ khác cũng có thể trải nghiệm được dù chỉ một phần