Sign In with Apple(Apple 登入)

法蘭克的 iOS 世界
10 min readFeb 10, 2020

Sign In with Apple 在 2019 的 WWDC 被發表了,它可以更簡單、更快速的使用 Apple ID 在 App 或網站上登入。但現在登入的方式何其多,為什麼 Apple 還要讓使用者多一種登入的選項呢?主要基於以下幾點:

  • 尊重使用者的隱私:當使用者使用 Sign In with Apple 登入時,僅僅只會開放姓名和 Email 給 App 開發者,且 Email 還可以選擇性的選擇真實的 Email 或 Apple 所建立的中介 Email。所謂中介 Email 是由 Apple 所隨機產生的一組 Email,假設要寄信給使用者,就得必須透過它,而且只有在 Apple Developer 後台所設定成白名單的 Email Domains 可以寄送
  • 內建的安全性機制:支援 Two-Factor Authentication(雙重驗證)、Face ID 和 Touch ID。
  • 可運行在任何平台:除了 iOS、macOS、tvOS、watchOS 外,也可支援 Web Browser。
  • 反詐欺: Apple 會使用機器語言學習方式來判斷登入的使用者是否為真人,假設說不是,Apple 會寄送警告訊息給開發者。

由以上幾點看來,相較於其它登入方式,Apple 最在意的是使用者隱私。就使用者角度來看的話,如不想透露太多個人資料給 App 開發者,Sign In with Apple 則會是首選。

然而,Apple 不改一貫的老大哥強勢作風,在上架審核的規範內加入了新的條款,強制開發者若是有使用第三方登入,就得必須也放上 Sign In with Apple 的選項,否則將會被 Reject;但有例外可以不須要實作 Sign In with Apple 的條件,例如:企業內部的登入、教育性質的 App 等等。

App Store Review Guidelines for Sign In with Apple

要實作 Sign In with Apple 有三種方式,其每種方式都有其優缺點,端看於使用情境為何來選擇之。

  • 使用 iOS13 的 SDK AuthenticationServices Framework:透過 Xcode11 的 AuthenticationServices Framework SDK 實作,但只限於在 iOS13 執行,開發上相對容易。
  • 使用 Sign In with Apple JS:透過撰寫 Java Script 達成,不侷限在 iOS13,因它是一個 WebView,通常由後端人員開發,前端人員只要將其嵌入 WebView。所以,不侷限在 iOS,連 Android 和 WebSite 都適用。
  • 使用 Sign In with Apple API:透過呼叫 Apple 提供的 API 實作,此方式因為安全性的考量,要多次呼叫不同的 API 方可達到,實作上並沒相像中的容易,同 JS 也不侷限在 iOS,連 Android 和 WebSite 都適用。

綜合以上,效益最好的就是 Sign In with Apple JS,通常由 Web Developer 開發完成後,不管在 iOS、Android、WebSite 都可以使用。

前言最後,法蘭克今天要介紹的是使用 iOS13 的 SDK AuthenticationServices Framework 來做登入。在開始教學之前,請確保已滿足以下條件。

請確定你的 MacOS 為 10.15+、Xcode 為 11+、測試裝置為 iOS13+、擁有 Apple 開發者帳號

流程

  1. 從 Apple Developer 後台開啟 Sign In with Apple 的 Capability。
  2. 從 Xcode 加入 Sign In with Apple 的 Capability。
  3. 使用 ASAuthorizationAppleIDButton 創建 Sign In with Apple 的 Button。
  4. 實作點擊 ASAuthorizationAppleIDButton 的事件。
  5. 依 Sing In with Apple 所返回的 User ID 檢查該 Apple ID 的狀態(視專案需求決定是否實作之)。
  6. 監聽 Apple ID 是否有登入、登出的狀況(視專案需求決定是否實作之)。

實作

開始前先看看成品為何

成品

左邊畫面的 Sign In with Apple 的按鈕是用 SDK 生成的;而右邊畫面則是 Apple 寫好的 ViewController ,開發者則只要遵從 Protocol 則會自行 Present。以下就按照前言的流程一步一步開始實作囉😀

從 Apple Developer 後台開啟 Sign In with Apple 的 Capability

在開始撰寫登入的程式碼之前,我們必須先從 Apple Developer 後台,還有 Xcode 上做一些設定🙂

企業帳號是沒有 Sign In with Apple 的 Capability 的

▼從 Apple Developer 後台確認此 App Identifier 是否有開啟 Sign In with Apple 的 Capability(APNSPush 只是示意,實際請依照自己的 Identifier)。

從 Xcode 加入 Sign In with Apple 的 Capability

▼從 Xcode 的 Signing & Capabilities → Capability → 加入 Sign In with Apple

使用 ASAuthorizationAppleIDButton 創建 Sign In with Apple 的 Button

在 Main.storyboard 建立一 View 以用來疊加使用 iOS13 的 SDK AuthenticationServices Framework 的 ASAuthorizationAppleIDButton 生成 Sign In with Apple 的 Button View。

▼在 Main.storyboard 建立一 View 後,並建立 Outlet

▼使用 iOS13 的 SDK AuthenticationServices Framework 的 ASAuthorizationAppleIDButton 生成 Sign In with Apple 的 Button View 並疊加到上步驟生成的 View 上

第 4~5 行 => 使用 ASAuthorizationAppleIDButton 創建 Sign In with Apple 的 Button(可參考 ASAuthorizationAppleIDButton 多種 Style 設定)。

第 7~8 行 => 設定 ASAuthorizationAppleIDButton 的 Frame,並疊加至 Main.storyboard 上的 View。

實作點擊 ASAuthorizationAppleIDButton 的事件

這小章節算是最複雜的部份,也是 Sign In with Apple 的 核心程式碼,包含要實作點擊 ASAuthorizationAppleIDButton 的事件、代理 ASAuthorizationController 並遵從其協議。

▼實作點擊 ASAuthorizationAppleIDButton 的事件

第 3~4 行 => 建立取得使用者資訊的請求。

第 6~11 行 => 生成 ASAutho第 3~4 行 =>rizationController 並代理其協議。包含 ASAuthorizationControllerDelegate(第8行)、ASAuthorizationControllerPresentationContextProviding(第9行),分別用來實作登入成功、失敗的邏輯、來告知 ASAuthorizationController 該呈現在哪個 Window 上

▼遵從 ASAuthorizationControllerDelegate(實作登入成功、失敗的邏輯)

第 7~15 行 => 登入成功的邏輯。只有第一次登入時,會取得除了 User ID 的資料。所以,必須得將其資料存放在 Server 端,以利後續使用。

  • user => Apple 唯一識別碼,該值在同一個開發者帳號下所有的 App 都會是一樣的。
  • fullName => 登入者全名。
  • email => 登入者 Email。
  • realUserStatus => 當前登入的用户是否為一真實用戶,回傳的值有 unsupported、unknown、likelyReal。

PS :登入、登出的定義。

  • 登入 => 透過 Sign In with Apple 的 SDK 登入成功。
  • 登出 => 設定 App → 點擊大頭貼 → 密碼與安全性 → 使用 Apple ID 的 App → 點擊要登出的 App → 停止使用 Apple ID
設定 App → 點擊大頭貼 → 密碼與安全性 → 使用 Apple ID 的 App
點擊要登出的 App → 停止使用 Apple ID

第 21~40 行 => 授權失敗。

▼遵從 ASAuthorizationControllerPresentationContextProviding(告知 ASAuthorizationController 該呈現在哪個 Window 上)

第 5 行 => 告知 ASAuthorizationController 該呈現在哪個 Window 上。

以上已完成 Sign In with Apple 的實作了,以下兩個議題可視專案需求決定是否要加入

依 Sing In with Apple 所返回的 User ID 檢查該 Apple ID 的狀態(視專案需求決定是否實作之)

在特定的情境,也許需要檢查此 Apple ID 的狀態,Apple 也提供了一個方法可供檢查。狀態包含已登入、已登出、無此用戶等等。

監聽 Apple ID 是否有登入、登出的狀況(視專案需求決定是否實作之)

Apple 除了提供主動的去檢查 Apple ID 的狀態外,也提供了被動的去監聽 Apple ID 的狀態。此方法,不管 Apple ID 在登入、登出時,都會被觸發。

如果您喜歡我的文章,請多按幾下「拍手」給我鼓勵,或是按「follow」讓我持續提供好文章給您。

--

--