Appleとは?今年のWWDCで発表されたAppleアカウントでアプリのサインアップやサインインができる機能です。Appleの実装が必須になるようです。弊社のアプリでもFacebookログインなどを使用しており今後対応が必要になるだろうと思いまずどういうものか知るためにサンプルコードとセッション動画の内容から現状わかったことをまとめてみました。Apple(セッション動画)https://developer.apple.com/videos/play/wwdc2019/706/サンプルコードhttps://developer.apple.com/documentation/authenticationservices/adding_the_sign_in_with_apple_flow_to_your_appちなみにベータテストは今夏に正式版は今年の終わり近くに利用可能になる予定のようです。早く、簡単にアプリへのサインアップやサインインができるとのことです。主な特徴として下記の5つの点が挙げられていました。合理化されたアカウントセットアップすでにAppleのアカウントへはログイン状態にあることが多いのでタップだけでセットアップが完了できます。デバイスをまたがって同じ認証情報が使用可能です。認証されたメールアドレスAppleがすでに認証しているのでメールを受け取って->リンクをタップするなどの余計な認証プロセスが必要になることはありません。Email実際のメールアドレスとは異なる下記のようなメールアドレスを使うことができアプリに個人情報を渡すことを避けることができます。本物のメールアドレスと同じように使えます。Appleがメール内容を保持するということはないとも言っていました。ビルトインのセキュリティパスワードを忘れたとしてもAppleアカウントでは2段階認証を使っているため追加のパスワード認証プロセスや入力が必要ありません。Anti-Fraud(詐欺対策)ユーザが疑わしいかどうかをシステムがサポートしてくれます。内部的な情報とアカウント情報を照らし合わせて判断しているようです。Javascript実装することが可能です。処理の流れ下記の様な手順で行っていきます。具体的にどのような処理を行っていくかここからはサンプルのコードで見ていきたいと思います。Appleを使用するためにはAuthenticationServicesというフレームワークを用います。https://developer.apple.com/documentation/authenticationservicesこれを使用することでAppleIDを用いてログインをすることができるサインインフローの中で保存しているパスワードを使用することができるOAuthのような仕組みを使用してWebブラウザとアプリ間でデータを共有することができるエンタープライズアプリではシングルサインオン(SSO)のような体験を提供できるなどが実現できます。OAuthとは?https://ja.wikipedia.org/wiki/OAuthシングルサインオンとは?https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%AA%E3%83%B3では実際の中身に関してはサンプルのコードから見ていきたいと思います。Entitlementを用意する)まずはXcodeの設定が必要です。Appleを選択します。https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_applesigninサインアップボタンを用意するASAuthorizationAppleIDButtonを使用します。標準のものをそのまま使用することも可能です。カスタマイズも可能ですが、その際にはデザインガイドラインに従う必要があります。デザインガイドラインはこちらhttps://developer.apple.com/design/human-interface-guidelines/sign-in-with-apple/overview/ASAuthorizationAppleIDButtonhttps://developer.apple.com/documentation/authenticationservices/asauthorizationappleidbuttonAppleにユーザ情報を取得するためのリクエストを送る次にユーザの情報を取得するためにAppleへリクエストを送ります。ユーザにタップされた際の処理は下記のようになります。authorizationController.performRequests()}ここで出てくるいくつかのクラスについて見ていきます。ASAuthorizationAppleIDProviderASAuthorizationAppleIDProviderとASAuthorizationAppleIDRequestを用いてユーザのAppleIDを元にアプリが認証済みかどうかのリクエストを作成します。.email]fullNameとemailは取得したい情報を指定することができオプションで指定することができます。ASAuthorizationAppleIDProviderhttps://developer.apple.com/documentation/authenticationservices/asauthorizationappleidproviderASAuthorizationAppleIDRequesthttps://developer.apple.com/documentation/authenticationservices/asauthorizationappleidrequestASAuthorizationController次に上記で作成したリクエストを使ってASAuthorizationControllerを初期化しperformRequestsでAppleへリクエストを送ります。selfとありますがこれはASAuthorizationControllerDelegateというプロトコルです。ASAuthorizationControllerDelegatehttps://developer.apple.com/documentation/authenticationservices/asauthorizationcontrollerdelegateこれを設定するとリクエストのレスポンスを下記のデリゲートで取得することができます。取得できる情報はASAuthorizationAppleIDCredentialです。ASAuthorizationAppleIDCredentialhttps://developer.apple.com/documentation/authenticationservices/asauthorizationこの中の情報を使ってアカウントの作成などを行います。authorizationController(controller:didCompleteWithAuthorization:)https://developer.apple.com/documentation/authenticationservices/asauthorizationcontrollerdelegate/3153050-authorizationcontrollerエラーの場合は下記のデリゲートメソッドが呼ばれます。KeyChainのパスワード情報をリクエストした場合に取得できる情報です。ASPasswordCredentialhttps://developer.apple.com/documentation/authenticationservices/aspasswordcredential実はサンプルコードの中ではユーザのタップする場合以外にもviewDidAppearの中でも認証情報のリクエストを送っています。ASAuthorizationPasswordProvider().createRequest()]ASAuthorizationPasswordProviderを使っています。Keychainのクレデンシャル情報を使ってアカウントの作成などが可能になります。※複数設定した場合の優先順位などに関しては何も言及がありませんでしたのでこれは今後調べたいと思います。今回は割愛させていただきますがシングルサインオン用の入り口もあります。ASAuthorizationSingleSignOnProviderhttps://developer.apple.com/documentation/authenticationservices/asauthorizationsinglesignonproviderASAuthorizationSingleSignOnCredentialhttps://developer.apple.com/documentation/authenticationservices/asauthorizationsinglesignoncredentialASAuthorizationControllerPresentationContextProvidingリクエストを送る際に下記のコードがありました。selfこれはASAuthorizationControllerPresentationContextProvidingプロトコルでシステムが認証プロセスをユーザに提供するためのUIWindowの指定をします。いくつかのリクエストでは必須となっているようです。ASAuthorizationControllerPresentationContextProvidinghttps://developer.apple.com/documentation/authenticationservices/asauthorizationcontrollerpresentationcontextprovidingサンプルコードでは下記のようにアプリのUIWindowを設定しています。}}presentationAnchor(for:)https://developer.apple.com/documentation/authenticationservices/asauthorizationcontrollerpresentationcontextproviding/3237228-presentationanchorこのようにしてユーザのアカウント作成ができます。クレデンシャル情報の変更に対応する例えばアプリでAppleIDの使用をやめたデバイスでサインアウトをしたなどが起きた場合への対応も必要になります。サンプルのAppDelegateを見ていきます。true}発表のスライドとはやや異なりますが、Keychainに保存しているcurrentUserIdentifierをgetCredentialState(forUserID:completion:)の引数として設定しクレデンシャル情報を取得しています。getCredentialState(forUserID:completion:)https://developer.apple.com/documentation/authenticationservices/asauthorizationappleidprovider/3175423-getcredentialstateここで得られるcredentialStateがASAuthorizationAppleIDProvider.CredentialStateです。3}ASAuthorizationAppleIDProvider.CredentialStatehttps://developer.apple.com/documentation/authenticationservices/asauthorizationappleidprovider/credentialstateこのrevokedの際に対応していきます。発表スライドでは通知を受け取ることもできるとあり下記のような形でクレデンシャル情報が無効になった時の処理ができます。サインアウトして、再度サインインフローを表示するなど}ASAuthorizationAppleIDProviderCredentialRevokedhttps://developer.apple.com/documentation/foundation/nsnotification/name/3175424-asauthorizationappleidprovidercrサインイン後はワンタップでサインインできるサインアップのプロセスを見てきましたがAppleアカウントでアプリの認証がされていることでアプリ起動時に認証されているかどうかがわかり即座にサインイン状態だと判定することが可能です。上記AppDelegateのメソッド内の分岐をご参照ください。これはユーザにとっても不要な手順が省かれ楽になり個人情報を入力するリスクを避けられます。最後にサンプルコードとセッションの情報からまずまとめてみました。理解ができていない部分や知らないことは多々あると思いますので更新情報がありましたら追記したいと思います。独自技術ideagramを用いて、人々の「創造性」や「目利き力」の定量化を行い、イノベーター人材の発掘/育成、科学的イノベーション創発支援を行っています。upLoginユーザーは見つかりませんでした。