iOSDC Japan 2020 เป็นงานสัมมนาของ iOS Developer ที่ญี่ปุ่นซึ่งจัดขึ้นปีละครั้งตั้งแต่ปี 2016 ส่วนปีนี้จัดขึ้นในวันที่ 19-21 กันยายน 2020
iOSDC Japan 2020
เนื่องจากสถานการณ์ระบาดของไวรัสโควิด 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で新聞紙面の大きい画像の自動ダウンロードを実現する
- อธิบายแอพหนังสือพิมพ์ 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 ว่าอย่าปิดนะ
- แอพควรจะไปโหลดหนังสือพิมพ์ก็ต่อเมื่อหนังสือพิมพ์ถูกตีพิมพ์เสร็จเรียบร้อยแล้ว จึงต้องให้ server เป็นคนกำหนดเวลาให้ ไม่ใช่ random โหลดให้เสียเปล่า
- คำเตือน: เมื่อส่ง Notification ไปยัง client แล้ว รีเควสจะพุ่งมาที่ server แบบ spike ต้องเตรียมระบบ CDN/Cache ไว้ให้ดี
2. Let’s Use Combine
そろそろCombine
- อธิบายว่า 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 มาใช้กับแอพ 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
- Tab กระตุกมากเพราะ re-layout ตลอดเวลาที่สลับ tab → ให้ใช้
- พอ migration แล้วพบว่าเขียนแอพได้ง่ายขึ้น เร็วขึ้น ประหยัดเวลาขึ้น (เขียน 1 ได้ทั้งสอง OS)
- แต่ก็มีคำเตือนว่าทำได้เพราะแอพ Jalan เป็นแอพสื่อ ไม่มีฟีเจอร์เฉพาะของแต่ละ OS มากนัก
คอนเซ็ปต์การใช้ Flutter เป็น Add-to-app addon
4. iOS Rejection Diary
iOSDC2020 - iOSリジェクト戦記
- เล่าเรื่องปวดตับของนักพัฒนา 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
- พูดถึง 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
- อธิบายฟีเจอร์ต่างๆ ของ 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
- ปัญหาที่ทุกทีมโปรดักต์ต้องเจอเวลาจะตัดสินใจพัฒนาแอพนั่นคือ จะเลือกทำแอพบนเว็บหรือ 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 จัดขึ้นอีก ได้ความรู้ขนาดนี้ เข้าฟังอีกแน่นอนครับ!