Sign In With Apple — あなたのアプリに実装してください!
公開: 2020-01-14Apple でサインイン — 昨年の WWDC で Apple が発表した新機能は、iOS 13 から利用できるようになりました。この機能は、アプリケーションまたは Web サイトでのシンプルで安全なアカウント登録とログインを提供します。 登録フォームに記入したり、ソーシャル メディア経由でログインしたりする代わりに、アカウントを作成して Apple ID でログインし、Face ID、Touch ID、またはパスコードで確認できるようになりました。
Sign In With Apple の簡単な説明:
- すばやく簡単なアカウント設定とサインイン
- 確認済みのメールアドレス
- 組み込みのセキュリティ
- 不正防止
- クロスプラットフォーム ️
- iOS 13+
この記事では、Web バージョンとの統合やバックエンドとの統合を行わない、iOS デバイスでの Sign In With Apple の基本的な実装に焦点を当てます。
「Apple でサインイン」機能はどのように機能しますか?

「Apple でサインイン」または「Apple で続行」(アプリケーションに実装するために選択されたボタンによって異なります) をタップすると、このソリューションの可能性を示す情報ウィンドウが表示されます (2 番目のスクリーンショット)。 次に、「続行」をタップすると、アプリケーションの所有者と共有されるデータに関する情報が表示されます。
ここでは、Sign In With Apple を使用してアプリケーションにアカウントを登録するための 2 つのオプションがあります。
- メールアドレスを共有すると、実際のメールアドレスがアプリケーションまたはウェブサイトと共有されます。
- メールアドレスを非表示にすると、実際のメールはアプリケーションや Web サイトに共有されません。 Apple は、@privaterelay.appleid.com ドメインを使用して一意の電子メールを生成します。 メールは実際のメールアドレスに転送されるため、アプリの所有者からのメールはすべて受信トレイに転送されます。 アプリの所有者は、Apple ドメインで生成されたメール アドレスしか知りません。
いずれかのオプションを選択して [続行] をタップすると、電話のロックを解除する場合と同様に、Face ID、Touch ID、またはパスコードを入力して Apple ID を確認します。 この時点で、ユーザーの一意の識別子を使用してアプリケーション/Web サイトにアカウントを作成する必要があります。

アプリケーションで以前に「Apple でサインイン」を使用した場合は、このログイン方法の詳細をプレビューして、この機能の使用を停止できます。 これを行うには、[設定] > [Apple ID] > [パスワードとセキュリティ] > [Apple ID を使用するアプリ] > [アプリを選択] に移動します。
「Apple でサインイン」を実装するには?
「Sign In With Apple」の理論的な部分を読んだ後、実装に進むことができます

まず、プロジェクトで「署名と機能」を開き、+ を押して「Apple でサインイン」機能を追加する必要があります。

Apple は WWDC キーノートで、この機能を実装するプロセスを 4 つの段階に分けています。 すべての段階について以下に説明します。
1. ボタン
最初に、画面にボタンを追加する必要があります。 これは、 AuthenticationService
フレームワークのASAuthorizationAppleIDButton
ボタンである必要があります。 タイトル違いで白と黒の2色展開です。 ボタンには、タップ後に呼び出されるアクションを追加する必要があります。 2 番目のポイントで承認アクションについて説明します。
認証サービスのインポート let ボタン = ASAuthorizationAppleIDButton(タイプ: .signIn、スタイル: .white) button.addTarget(self、アクション: #selector(appleIdButtonClicked)、for: .touchUpInside) stackView.addArrangedSubview(ボタン)
2.承認️
ここでは、アプリケーションまたは Web サイトでアカウントを作成するために必要な情報のみをrequestedScopes
として提供する承認リクエストを作成します。 私の場合、これはフルネームとメールアドレスです。 次に、デリゲートを設定してリクエストを行います。
@objc func appleIdButtonClicked() { let request = ASAuthorizationAppleIDProvider().createRequest() request.requestedScopes = [.fullName, .email] let controller = ASAuthorizationController(authorizationRequests: [リクエスト]) controller.delegate = 自己 controller.presentationContextProvider = 自己 controller.performRequests() }
3.検証
Face ID、Touch ID、またはパスコードによる簡単なチェックの後、認証結果が返されます。 認証が成功すると、 didCompleteWithAuthorization
メソッドはAppleIdCredential
型のオブジェクトを返します。 次に、それらがASAuthorizationAppleIdCredential
タイプの資格情報であるかどうかを確認する必要があります。そうである場合、このオブジェクトで、一意のユーザー ID、氏名、電子メール アドレス (ユーザーが以前に要求した)。 この時点で、必要な情報のみを提供することで、システムにアカウントを作成することができます。 エラーが発生した場合は、このエラーを処理できるdidCompleteWithError
メソッドで返されます。

func authorizationController(コントローラー: ASAuthorizationController, didCompleteWithAuthorization 承認: ASAuthorization) { AppleIDCredential = authorization.credential を許可する場合は? ASAuthorizationAppleIDCredential { // システムにアカウントを作成します。 そうでなければ、passwordCredential = authorization.credential を許可しますか? ASPasswordCredential { // 既存の iCloud キーチェーン資格情報を使用してサインインします。 } } func authorizationController(コントローラー: ASAuthorizationController, didCompleteWithError エラー: エラー) { 印刷(エラー) }
4. 変更の取り扱い
たとえば、ユーザーが Apple ID を使用したアプリケーション ログインの使用を停止した場合に備える必要があります。 これは、ユーザーがアプリケーションを再起動した後に適切に処理する必要があります。
アカウント登録時に受け取ったユーザー ID を使用して、 getCredentialState
メソッドを非常に迅速に呼び出すことで、Apple ID クレデンシャルの現在の状態を取得できます。 このメソッドは、次の 3 つの状態を返すことができます。
-
authorized
— アプリケーションを引き続き使用できる承認済みユーザー。 -
revoked
— ユーザーをログアウトし、オプションでログイン画面に誘導して再度ログインすることができます。 -
notFound
— ユーザーが以前に「Apple でサインイン」を使用したことがないことを意味します。 この時点で、ユーザーにログイン画面も表示します。
getCredentialState
メソッドの呼び出しは、 didFinishLaunchingWithOptions
メソッドのAppDelegate
にある必要があります。
さらに、Apple は通知を提供します。この通知では、資格情報が取り消されたときに通知され、このステータスに対して上記の方法で処理する必要があります。
appleIDProvider.getCredentialState(forUserID: userId) { credentialState、エラー 資格情報の状態を切り替えます { ケース.認可: // Apple ID クレデンシャルは有効です。 ケース .revoked: // Apple ID クレデンシャルが取り消され、ログアウトします。 ケース.notFound: // 資格情報が見つからなかったため、サインイン UI を表示します。 デフォルト: 壊す } } // 失効通知登録 NotificationCenter.default.addObserver(forName: NSNotification.Name.ASAuthorizationAppleIDProviderCredentialRevoked, オブジェクト: なし 待ち行列: nil) { _ in // ユーザーをサインアウトし、必要に応じて再度サインインするように案内します }
サンプル アプリケーションに 4 つのステージすべてを実装すると、すべてが機能し、次のようになります。

アプリに「Apple でサインイン」を追加する必要がありますか?
アプリケーションで Facebook、Google、LinkedIn などのサードパーティのログイン方法を使用している場合は、新しいガイドラインに従って Sign In With Apple も追加する必要があります。 追加しないと、申請が却下され、Apple による審査が行われない可能性があります。 以下は、ニュースへのリンクとガイドラインからの引用です。
Apple でサインインするための新しいガイドライン — 2019 年 9 月 12 日 ️
本日より、App Store に提出される新しいアプリは、これらのガイドラインに従う必要があります。 既存のアプリとアプリの更新は、2020 年 4 月までにそれに従う必要があります。
以下は、新しい Apple の機能を使用してログインを提供するアプリケーションです。もちろん、それらのアプリケーションは毎日ますます増えています。

プロジェクト全体は、こちらの GitHub で確認できます。
ソース:
- https://developer.apple.com/videos/play/wwdc2019/706/
- https://developer.apple.com/videos/play/wwdc2019/516
- https://developer.apple.com/sign-in-with-apple/get-started/
- https://developer.apple.com/news/?id=09122019b
- https://developer.apple.com/app-store/review/guidelines/#sign-in-with-apple