หลาย ๆ คนที่เขียน iOS Application ถึงจุดหนึ่งก็ต้องเคยทำเรื่อง Authentication กันสินะครับ บางคนก็ทำเอง หรือ บางคนก็ใช้ของ 3rd Party อย่าง Google, Facebook, หรือ Twitter เป็นต้น
และในที่สุด Apple ก็มีกับเค้าบ้างซะที โดยใช้ชื่อว่า Sign in with Apple นั่นเอง โดยทำให้ Application ของเราสามารถใช้บัญชี Apple ที่ Sign in อยู่ในเครื่อง iPhone iPad ณ ขณะนั้นมา Sign in Application ของเราได้ทันที เพื่อที่จะทำให้ user นั้นสะดวก รวดเร็ว ไม่ต้องทำหลายขั้นตอน เพิ่มประสบการณ์ผู้ใช้ท่ีลื่นไหลสุด ๆ ไปเลย
โดยสามารถเข้าไปดูวีดีโอ Sign in with Apple ได้ที่
แล้วต้องใช้ไหม ?
ถ้าเกิดว่าใน Application ของคุณมีการ Sign in ด้วย 3rd Party ก็จะต้องเอา Sign in with Apple ใส่เข้าไปด้วย ไม่งั้น Apple จะไม่ Approve Application ของเรา โดย Application ใหม่ที่จะเอาขึ้น App Store จะต้องทำตามกฎนี้เลย
ส่วน Application ที่อยู่บน App Store อยู่แล้ว ก็จะต้องใส่เข้าไปภายในเดือนมิถุนายน 2020 นี้ ไม่งั้นก็จะโดน Reject
มาเริ่มกันเลยดีกว่า
การทำ Sign in with Apple นั้น ไม่ได้ยุ่งยากอย่างที่คิด ซึ่งในบทความนี้ ผมจะอธิบายการ Implement Sign in with Apple มาใช้ใน Application ของเรา ถ้างั้นเรามาเริ่มกันเลยดีกว่าาาาาาาาาา
ต้องใช้ Xcode 11 และ iOS 13 ขึ้นไปนะ
1. เพิ่ม Sign in with Apple Capability
ไปที่ Project ของเรา เลือกที่ Tab Signing & Capabilities -> กดที่ +
Capability -> เลือก Sign in with Apple
2. สร้างปุ่ม Sign in with Apple
วิธีสร้างปุ่ม Sign in with Apple นั้นไม่สามารถลากวางลงใน storyboard หรือ xib ได้ ฉะนั้นเราก็ต้องมาสร้างผ่าน code เท่านั้น
โดยอันดับแรกจะต้อง import module AuthenticationServices
ด้วย แล้วสร้าง object ปุ่มจาก ASAuthorizationAppleIDButton
ที่สำคัญ อย่าลืม set action ให้กับปุ่มด้วยนะ ไม่งั้นกดให้ตายก็ไม่ติด จากนั้นก็ add ตัวปุ่มเข้า Sub view
เมื่อลอง run ก็ได้ปุ่ม Sign in with Apple แบบหะรูหะรามาแล้วววววววว
แต่ถ้าใครอยากจะรู้ว่าปุ่ม Sign in with Apple สามารถ custom อะไรได้บ้าง สามารถไปอ่านเพิ่มเติมใน Human Interface Guidelines ของ Apple Developer ได้
3. Show dialog for sign in
ต่อไป set action โดยให้เวลากดปุ่มจะต้อง show dialog ขึ้นมาเพื่อให้ sign in ได้ โดยมีขั้นตอนดังนี้
- สร้าง instance ของ
ASAuthorizationAppleIDProvider
โดยตัว provider นี้จะทำการสร้าง request สำหรับการ authentication ด้วย Apple ID - set request scope ของการ request ว่าเราจะขอข้อมูลอะไรบ้างจาก user โดยปกติแล้วจะขอแค่ email กับ full name
- สร้าง
ASAuthorizationController
พร้อมใส่ request ที่สร้างแล้วเข้าไป แล้วก็ setdelegate
และpresentationContentProvider
ด้วย แล้วก็อย่าลืม implement delegate ด้วยนะ - ทำการ show dialog ด้วย
performRequests
method
จะได้ code ดังนี้
เมื่อลอง run แล้วกดที่ปุ่ม Sign in with Apple ก็มี dialog ขึ้นดังรูป
โดย user ที่เห็น dialog นี้จะสามารถให้ข้อมูลต่าง ๆ ไม่ว่าจะเป็น name ของตัวเอง ซึ่งสามารถแก้ไขได้ และกำหนดว่าจะให้ email จริง หรือ fake email ก็ได้โดย fake email ระบบมันจะ generate ให้เอง
เมื่อ user กด continue แล้ว ถ้า sign in สำเร็จ Application ของเราจะได้รับ response จาก user ผ่าน delegate method didCompleteWithAuthorization
ของ ASAuthorizationControllerDelegate
ซึ่งเราจะได้ object ของ ASAuthorization
จาก method นี้มาซึ่งก็คือ authorization
โดย authorization
จะเก็บ credential เอาไว้ โดยเราสามารถดึงข้อมูลต่าง ๆ ของ user ได้ เช่น user id, email, full name เอาไปใช้ทำอย่างอื่นได้ ดัง Code ด้านล่าง
ในกรณีนี้เราจะทำให้เมื่อ sign in ผ่านแล้วเปิดอีกหน้าและแสดงข้อมูลที่ได้มา ดังรูป
จะเห็นว่าเราได้ข้อมูลจาก User เช่น user id, email (ซึ่งในกรณีนี้ให้ fake email ไป) และ full name
ข้อมูลพื้นฐาน ที่ได้จาก user ไม่ว่าจะเป็น email หรือ full name นั้นจะได้แค่ครั้งแรกที่ user ทำการ sign in เท่านั้น ซึ่งครั้งแรกมันเปรียบเสมือนการ sign up เมื่อ user คนเดิม sign in ครั้งต่อไปจะได้แค่ User id อย่างเดียว ส่วน email และ full name จะกลายเป็น nil ฉะนั้นเราควรจะต้อง cache ข้อมูลนั้นไว้ก่อนจนกว่า user จะทำการ sign in สำเร็จในครั้งแรก
3. Handle Apple ID State
เราสามารถรู้ได้ว่า user ทำการ sign out จาก Apple ID หรือปิดไม่ให้ Application ของเราใช้ข้อมูลจาก Apple ID ของ user ด้วยการเพิ่ม Notification ที่ชื่อว่า ASAuthorizationAppleIDProvider.credentialRevokedNotification
ตัวนี้เข้าไป และจัดการ action ว่าจะทำอะไรต่อ โดยเขียน Code ได้ดังนี้
4. Handle Existing Account
ในกรณีที่ user เคย sign in ด้วย email หรือ password ใน Application ของเรา มาก่อน และ password นั้นได้ถูกเก็บใน Keychain มาแล้ว ตัว Sign in with Apple ก็จะ Show Dialog ขึ้นมาให้ sign in ว่าจะ sign in ด้วย email หรือ password ด้วย Account เดิมได้ โดยเขียน Code ได้ดังนี้
และก็ต้องไป handle case เพิ่มใน delegate method didCompleteWithAuthorization
ของ ASAuthorizationControllerDelegate
ด้วยว่าถ้า sign in ด้วย password จะให้ทำอะไรต่อ โดยเขียน code เพิ่มได้ดังนี้
สรุป
Sign in with Apple เป็นอีกหนึ่งในตัวช่วย (แกมบังคับ) ที่ทำให้การเข้าสู่ระบบของ Application เรานั้นง่ายต่อทั้งเราเอง และ User มากยิ่งขึ้น ทั้งความปลอดภัย ความสะดวกรวดเร็ว และ User เองก็คงคาดหวังให้เรามีมันในทุก ๆ Application ที่อยู่บน App Store
สำหรับที่ใครอาจจะงง ๆ จากที่เขียนมาทั้งหมด T^T ก็สามารถเข้าไปดู final project ที่ผมทำไว้ได้เลยครับ