iOSDC Japan 2020 เป็นงานสัมมนาของ iOS Developer ที่ญี่ปุ่นซึ่งจัดขึ้นปีละครั้งตั้งแต่ปี 2016 ส่วนปีนี้จัดขึ้นในวันที่ 19-21 กันยายน 2020

iOSDC Japan 2020

iOSDC Japan 2020は2020年9月19日(土)~9月21日(月・祝)に開催される、エンジニアが主役の、iOSと周辺技術を題材としたカンファレンスです。

เนื่องจากสถานการณ์ระบาดของไวรัสโควิด 19 ทำให้งานปีนี้เปลี่ยนมาจัดออนไลน์แทน ค่าตั๋ว 2500 เยน รับชมผ่านทาง Niconico Live ทั้งหมด บล็อกนี้ก็จะขอแชร์บันทึก session ที่น่าสนใจๆ ครับ

Timetable

ตารางอัดแน่นสามวัน รวม 68 เซชชั่น ครอบคลุมทุกอย่างที่เกี่ยวกับ iOS Development เลยก็ว่าได้ ตั้งแต่การเขียนโค้ด ดีไซน์ การบริหารองค์กร การส่งแอพขึ้นสโตร์ ดีบั๊ก iOS14/SwiftUI ฯลฯ คนที่เป็น iOS Developer ไม่ว่าจะอยู่ตำแหน่งไหนประสบการณ์เท่าไร ก็ต้องสนใจซักเรื่องในนี้แน่นอน

ส่วนตัวผม ปีนี้ย้ายบริษัทไปทำแอพใหม่เอี่ยม เลือกใช้ SwiftUI/Combine เป็นเฟรมเวิร์กหลัก เลยถือเป็นโอกาสดีที่จะได้ทำความเข้าใจเกี่ยวกับสองหัวข้อนี้ในงานนี้ครับ

สรุปเซชชั่นที่น่าสนใจแบบคร่าวๆ

ชื่อไตเติลภาษาอังกฤษผมแปลเองนะครับ จะได้เข้าใจหัวข้อกันแบบคร่าวๆ

1. How to Use Background Notification to Preload Newspaper Files

Background Notificationで新聞紙面の大きい画像の自動ダウンロードを実現する

iOSDC2020 Day 1 Track A 10:50〜 Background Notificationで新聞紙面の大きい画像の自動ダウンロードを実現する 本セッションでは、大きい画像コンテンツを対象にした自動ダウンロード機能について説明します。 実装の過程で直面した問題への対策やアプリやサーバーサイドを含めた全体のアーキテクチャを解説するとともに、日本経済新聞 紙面ビューアーにおける新聞紙面画像での運用事例を紹介します。 大規模サービスにおける運用を通じて得られた安定して自動ダウンロードを成功させるための課題の解決方法を説明します。 https://fortee.jp/iosdc-japan-2020/proposal/6bb15eb4-09f9-4fb9-b451-ae8fbd530790 https://iosdc.jp/2020/
  • อธิบายแอพหนังสือพิมพ์ Nikkei Shinbun https://www.nikkei.com/ ว่าต้องดาวน์โหลดหนังสือพิมพ์ไว้ล่วงหน้าเพื่อให้ผู้ใช้งานเปิดอ่านได้ตอนเช้าโดยไม่ต้องมีเน็ต
  • เนื่องจากผู้ใช้ส่วนใหญ่อ่านบนไอแพดซึ่งมักใช้ได้แค่ Wi-Fi การดาวน์โหลดมาอ่านแบบออฟไลน์จึงเป็นเรื่องสำคัญมากๆ ยิ่งถ้าต้องอ่านบนรถไฟระหว่างทำงาน หากไม่โหลดมาอัตโนมัติแอพก็จะไม่มีประโยชน์เลย
  • วิธีเรียกแอพ iOS มาทำงานตอนอยู่ใน background มีหลายวิธี แต่แอพนี้ใช้ Background Notification ในการแจ้งให้แอพไป fetch ไฟล์หนังสือพิมพ์มาเก็บไว้ เพราะสามารถกำหนดเวลาจาก server ได้
    • แอพควรจะไปโหลดหนังสือพิมพ์ก็ต่อเมื่อหนังสือพิมพ์ถูกตีพิมพ์เสร็จเรียบร้อยแล้ว จึงต้องให้ server เป็นคนกำหนดเวลาให้ ไม่ใช่ random โหลดให้เสียเปล่า
      • แต่ Notification ใช่ว่าจะส่งให้แอพรับได้ 100% ต้องลองส่งหลายรอบหน่อยนะ
    • การใช้ Background Notification ไม่จำเป็นต้องโชว์ dialog ขออนุญาตส่ง Push
    • ข้อเสียคือถ้า User ปิดแอพ (swipe ทิ้ง) จาก background แอพจะรับ notification ไม่ได้ จึงต้องแจ้งเตือนไว้ในหน้า setting ว่าอย่าปิดนะ
  • คำเตือน: เมื่อส่ง Notification ไปยัง client แล้ว รีเควสจะพุ่งมาที่ server แบบ spike ต้องเตรียมระบบ CDN/Cache ไว้ให้ดี

2. Let’s Use Combine

そろそろCombine

iOSDC2020 presentation about Combine.framework
  • อธิบายว่า Combine คืออะไรแบบที่มือใหม่ก็เข้าใจ
  • นี่เป็น Topic ที่ผมยังอธิบายไม่ค่อยได้ งงๆ อยู่ ถ้าสนใจเชิญอ่านบทความภาษาอังกฤษได้ที่นี่
  • ระหว่างฟังไปก็เปรียบเทียบกับ RxSwift ที่เคยใช้ไป คอนเซ็ปต์คล้ายๆ กัน แต่ต้องจำ modifier เฉพาะของ Swift เพิ่มเติม
  • Session นี้อธิบายให้เข้าใจง่ายมาก สอนตั้งแต่ต้นว่า Publisher คืออะไร Subscriber, Subscription สัมพันธ์กันอย่างไร และจบที่การใช้ Operator เพื่อประยุกต์ใช้กับ Framework ต่างๆ เคลียร์ขึ้นเยอะ ควรเก็บสไลด์ไว้อ้างอิงทีหลังมาก

ทุกอีเวนต์คือ Publisher

3. The Pain and Gain from Migrating an app to Flutter

Flutter移行の苦労と、乗り越えた先に得られたもの

じゃらんにおいてFlutter移行を行った際の知見の共有
  • เล่าเรื่องการนำ Flutter มาใช้กับแอพ Jalan แอพจองโรงแรม-หาสถานที่ท่องเที่ยวที่โด่งดังในญี่ปุ่น
  • ใช้ฟีเจอร์ Add-to-app ของ Flutter เพื่อนำ Flutter มาเป็นส่วนหนึ่งของ Native App ที่มีอยู่แล้ว
    • เพิ่งรู้ว่าทำอย่างนี้ได้ด้วย สุดยอด เหมาะกับการทดลองเริ่มใช้ Flutter ในแอพที่ให้บริการอยู่แล้วมากเลย
  • อธิบายปัญหาที่เจอและวิธีแก้
    • Tab กระตุกมากเพราะ re-layout ตลอดเวลาที่สลับ tab → ให้ใช้ AutomaticKeepAliveClientMixin แก้
    • ปิดหน้าจอที่ทำจาก Flutter แล้วเปิดขึ้นใหม่ ปรากฏว่า state เก่ายังคงค้างอยู่ → เพราะข้อมูลถูกเก็บไว้ใน FlutterEngine ทั้งหมด ต้องเขียนฟังก์ชั่นให้ฝั่ง Flutter pop กลับมาที่หน้าแรกแล้วเรียกก่อนจะเปิดจอขึ้นใหม่อีกรอบ
    • Redirect Network ผ่าน Charles (Proxy Server) แล้ว แต่ไม่สามารถดู packet ของแอพฝั่ง Flutter ได้ → ต้องเขียนบอกให้แอพ Flutter ใช้ proxy ของเครื่อง ใช้ pub system_proxy แก้ https://pub.dev/packages/system_proxy
  • พอ migration แล้วพบว่าเขียนแอพได้ง่ายขึ้น เร็วขึ้น ประหยัดเวลาขึ้น (เขียน 1 ได้ทั้งสอง OS)
    • แต่ก็มีคำเตือนว่าทำได้เพราะแอพ Jalan เป็นแอพสื่อ ไม่มีฟีเจอร์เฉพาะของแต่ละ OS มากนัก

คอนเซ็ปต์การใช้ Flutter เป็น Add-to-app addon

4. iOS Rejection Diary

iOSDC2020 - iOSリジェクト戦記

~リジェクトされないための課金ページ~ 課金ページの実装を専属で担当し、課金ページのレイアウト改変やA/Bテストを頻繁に行った結果、毎月のようにAppleからのリジェクトを経験しました。 メッセージで多くのやりとりを行ない、一般的には公開されていないような課金ページの細かなアンチパターンが蓄積してきたので、紹介していきたいと思います。 - iOSDC2020の登壇と裏話 https://note.com/hcrane/n/nfc4832602c6f
  • เล่าเรื่องปวดตับของนักพัฒนา iOS ทุกคน การส่งแอพให้ Apple ตรวจนั่นเอง
  • แน่นอนว่าทุกคนต้องเคยโดน Reject กันทั้งนั้น มันคือการรบกับ Apple อย่างแท้จริง…
    • แถมคำอธิบายจากคนรีวิวก็ไม่ค่อยจะละเอียดอีก
  • รวมเหตุการณ์ที่ทำให้โดน Reject (เกี่ยวกับเรื่องเงินเป็นหลัก) เช่น
    • เขียนคำว่า “ฟรี” ไว้เด่นๆ
    • เขียนค่า subscription ด้วยตัวอักษรเล็กๆ ไม่เด่น
    • หาทางให้ User ไปใช้ระบบจ่ายเงินอื่นนอกจาก In-App Purchase (IAP)
  • ถูกใจภาพศาสดาสตีฟจ็อบส์มาก ใช่ Apple คือพระเจ้าจริงๆ ในเรื่องการอนุญาตให้แอพไหนขึ้นหรือไม่ขึ้นสโตร์เนี่ย โดนมาเยอะ… (เกลียด process นี้จนไม่คิดจะเขียนแอพ iOS ส่วนตัวอีกต่อไป)

ศาสดา Steve Jobs แห่งศาสนา Apple

5. WebAR on iOS

iOSDC Japan 2020 - iOSではじめるWebAR / WebAR in iOS

2020-09-20 iOSDC Japan 2020 Day 2 14:00~14:20 の枠で話した登壇資料です。 プロポーザルはこちら https://fortee.jp/iosdc-japan-2020/proposal/2e3d39d3-8cf3-4b7b-b449-519ec7c2ecef --- * 2020-09-20 v2 LiDAR 搭載 iPad Pro にモノのオクルージョンの補足を追加 * 2020-09-20 v1 初版公開
  • พูดถึง Framework ที่ใช้ทำแอพ AR บนเว็บในวัตถุประสงค์ต่างๆ ตั้งแต่โชว์โมเดลง่ายๆ จนถึง Face recognition ถ้าจะลองเขียนเว็บแอพเพื่อโชว์ object ด้วย AR ก็น่าดูไว้ จะได้เลือกใช้ให้ถูกวัตถุประสงค์
  • ตัวอย่าง Framework ที่พูดถึง
    • AR Quick Look
    • model-viewer
    • AR.js
    • 8th Wall (paid framework)
  • ทั้งหมดรันบนเว็บ ดังนั้นจึงไม่ต้องทำแอพ ไม่ต้องผ่าน Store ให้ยุ่งยาก เหมาะกับการทดสอบคอนเซ็ปต์มาก

ตัวอย่าง QR Marker App

6. Optimize Battery Consumption on iOS App

  • ปัญหาแอพใช้งานแบตเตอรี่เยอะ นักพัฒนาแอพทุกคนต้องเจอ และเป็นเรื่องใหญ่เพราะส่งผลต่อระบบทั้งหมด แอพแครชมีผลแค่แอพตัวเอง แต่แอพใช้แบตเยอะ มีผลต่อเครื่องของ user (แบตหมดทำอะไรไม่ได้เลย)
    • ตอนนี้ user สามารถดูได้ว่าแอพไหนใช้งานแบตเตอรี่เยอะ เพราะงั้นถ้าแอพไหนใช้แบตเยอะผิดปกติ ก็มีโอกาสโดนลบทิ้งได้
  • ปัจจัยที่ใช้งานแบตเตอรี่เยอะมีสี่อย่าง ยิ่ง Optimize ให้ใช้งานได้น้อยเท่าไรยิ่งลดการใช้งานแบตเตอรี่ได้เยอะ
    • Processing
    • Networking
    • Location
    • Graphics
  • ยิ่งแอพ Active นานเท่าไรก็ยิ่งกินแบตเยอะด้วย หากประมวลผลเสร็จเร็ว รีบปิดได้ก็จะกินแบตน้อย
  • เครื่องมือที่ใช้ Debug ก็คือ Xcode Energy Gauges
  • หลัง Publish แอพไปแล้วก็สามารถดูรีพอร์ตจาก Xcode Energy Logs ได้

ตัวอย่าง Xcode Energy Gauges

7. Storyboard in Detail

詳解Storyboard

2019年、SwiftUIという新しいUI記述方法が導入されました。 SwiftUIでは宣言型シンタックスを導入し、Appleの各プラットフォームに対し、シンプルなUIコードの記述ができるようになりました。 しかしながら、SwiftUIにない機能を使いたい、あるいはサポートするOSの関係でSwiftUIの導入ができないなど、他の手段でUIを構築することはまだあるかと思います。 そのUIの構築方法の一つであるStoryboardは、GUIベースでのUIデザインツールとしてのイメージを持たれている方が多いと思いますが、UIデザインツールとしての側面だけでなく、様々な機能が盛り込まれています。 - リストア機能を使って、バックグラウンド状態からKillされても元の状態に戻し、ユーザー体験を損なわない - FirstResponderを使って、手軽にUndo、Redoなどを実装する - 言語だけではない、ロケールごとの画面遷移方法の設定 - コードとデザインを分離し、iPhone、iPadなどの様々な画面サイズや、tvOSなどのプラットフォームでコードを共通化する - OSバージョン別にUIをデザインする - Objectを使って、ViewControllerにコードをFatに書かない、あるいはViewControllerを全く用意しないアプリを作る など、UIの作成にとどまらない、あなたのコードライティング時間をより多くビジネスロジックに回せるようなStoryboardの活用法をお伝えします。
  • อธิบายฟีเจอร์ต่างๆ ของ Storyboard ยุคใหม่ พร้อมตัวอย่างโค้ดชัดเจน
    • หากซัพพอร์ตฟีเจอร์เหล่านี้ ก็จะ migrate ไป SwiftUI ง่ายขึ้น ควรรู้ไว้
  • Topic ที่ยกตัวอย่างถึง
    • การซัพพอร์ต @IBSegueAction ที่เพิ่มเข้ามาตั้งแต่ iOS13
    • coder: NSCoder ที่ใช้สำหรับกู้สถานะ (Restoration) ตัวอย่างเช่นกู้ข้อมูลฟอร์มที่กรอกไว้ก่อนปิดแอพ
      • เพิ่งรู้ว่าใช้งี้ นึกว่าเป็น boilerplate code ที่จำเป็นต้องเขียนเฉยๆ
    • Localization สร้าง Storyboard แยกสำหรับแต่ละภาษา และสลับพรีวิวแต่ละภาษาได้อย่างรวดเร็ว
    • First Responder ใช้ซัพพอร์ต Undo action ได้โดยอัตโนมัติ
    • Custom Segue เปลี่ยน Storyboard ตาม iOS Version
      • เช่น ARView ซัพพอร์ต iOS13 ขึ้นไปเท่านั้น สำหรับ iOS12 ลงไปให้เปิด webview ธรรมดาแทน
    • Size Classes = Vary for Traits ซัพพอร์ต device ที่ขนาดหน้าจอแตกต่างกัน
    • สร้าง Object สำหรับ action ต่างๆ เช่น sound, haptic feedback, loading indicator แล้วผูกกับ IBAction จะเข้าใจง่ายและชัดเจนการเขียนทุก function ไว้ใน ViewController ที่เดียว

8. Make a decision between Web App and Native App

Webとネイティブアプリの付き合い方を改めて考える / Native apps and web

iOSDC Japan 2020 Day2 Proposal: https://fortee.jp/iosdc-japan-2020/proposal/d996c43a-834b-4bfe-b15a-67457725da02
  • ปัญหาที่ทุกทีมโปรดักต์ต้องเจอเวลาจะตัดสินใจพัฒนาแอพนั่นคือ จะเลือกทำแอพบนเว็บหรือ Native ดี
    • ปัจจุบันเทคโนโลยีเว็บพัฒนาไปเยอะมาก หลายอย่างทำได้บนเว็บ ไม่คุ้มที่จะต้องทำแอพแยกสำหรับ iOS & Android และยังต้องเจอการ review จาก store, ต้องอัพเดตทุกปีตาม OS version, เสียค่าธรรมเนียม In-app purchase 30% อีก
  • สิ่งที่ Native App เท่านั้นทำได้คือ
    • Work offline
    • Push notification
    • Store traffic (โหลดจาก store ได้)
    • OS-level feature เช่น ARKit, Widgets, Custom animation
  • เปรียบเทียบ PWA, App Clips ด้วย แต่ก็สรุปได้ว่าฟีเจอร์ยังเทียบไม่เท่า Native App
    • แต่มีไว้เสริมก็ดี เพิ่ม engagement ได้จริง
  • สรุปคือถ้าไม่คิดจะใช้ฟีเจอร์ของ Native App ทำแค่ Web App ก็พอ ต้นทุนต่ำกว่าเยอะ

ตารางเปรียบเทียบฟีเจอร์ Web/PWA/Native/App Clips

9. Long Road to Apple Silicon

  • ไม่มีสไลด์เผยแพร่ เล่าประวัติ Apple Chips ตั้งแต่ iPhone รุ่นแรกยัน A13 ล่าสุดปี 2020 พัฒนามาไกลมาก จากขนาด transistor รุ่นแรก 90nm จนเหลือแค่ 7nm ในปี 2018
    • เล่าถึงจุดเปลี่ยนต่างๆ ที่มีผลต่อวงการ เช่นการใช้ชิป 64-bit ครั้งแรกใน A7 (iPhone 5s)
    • เพิ่งรู้ว่าประสิทธิภาพของชิปที่ใช้ใน iPhone 4 จริงๆ คือไม่พอที่จะประมวลผลจอ Retina ในตอนนั้น เครื่องเลยหน่วงๆ มาก แต่ Apple ก็ยังกล้าออก product มาเพื่อเปลี่ยนวงการ

Evolution ของ Apple Chip กราฟประสิทธิภาพการประมวลผลของชิป

  • ดูจากกราฟ FLOPS คือประสิทธิภาพเพิ่มแบบ exponential ตลอด Apple ทุ่มเทพัฒนามาก
    • จนถึงจุดที่ประสิทธิภาพแข่งกับ Core i5 สถาปัตยกรรม Ice Lake ล่าสุดได้แล้ว Apple จึงเลือกที่จะทำ Apple Silicon ของตัวเอง

สรุป

iOSDC2020 Japan เป็นงาน developer conference ที่ผมรับชมแบบออนไลน์ครั้งแรก ข้อมูลอัดแน่นเป็นประโยชน์สำหรับ iOS developer อย่างมาก และยังสามารถดูย้อนหลัง เก็บตกจุดที่ไม่เข้าใจได้ด้วย คิดว่าดีกว่าอีเวนต์แบบออฟไลน์อีก เพราะไม่ต้องวิ่งเปลี่ยนห้องประชุมไปมาเวลาเปลี่ยน track ฟัง session ต่างๆ (มี session ดีๆ ที่ไม่ได้พูดถึงอีกเยอะมากๆ)

ส่วนตัวคิดว่าทีมงานหาวิธีแก้ปัญหาของ online event ได้เยอะมาก เช่น

  • ใช้ niconico live เป็น platform เผยแพร่ เพื่อให้เห็นคอมเมนต์ผู้ชมวิ่งกันสดๆ บนจอ
  • presentation ใช้วิธีอัดคลิปล่วงหน้ามาฉาย เพื่อไม่ให้เกิดปัญหา network หรืออุปกรณ์ ซึ่งเป็นเรื่องที่เกิดขึ้นบ่อยในอีเวนต์ออนไลน์แบบนี้
  • จัดเซชชั่น ask the speaker แยกใน discord เพื่อให้ผู้ชมถามข้อสงสัยกับผู้พูดได้ (อันนี้ผมไม่ได้เข้าไปฟัง)
  • เตรียม hashtag #iosdc และพื้นที่เผยแพร่ blog ของผู้ชมที่เขียนบล็อกถึง เพื่อรวบรวมข้อมูลผู้ชมในภายหลัง

หวังว่าปีหน้าก็จะมี iOSDC จัดขึ้นอีก ได้ความรู้ขนาดนี้ เข้าฟังอีกแน่นอนครับ!