はじめに
こんにちは、nukkyです。
今回は新しいAppleのサインインシステム「Sign In with Apple」について書いていこうと思います。
Sign in with Appleとは
News and Updates より意訳
すでに発行済の Apple ID を使って、ユーザがアプリやウェブサイトに簡単にサインインできるようになります。Sign in with Apple はプライバシーやセキュリティに関する機能が備わっており、アカウントを作成したりサインインしたりするにも、アプリを素早く簡単に操作してもらうにも、優れた方法だと言えます。すべてのアカウントは優れたセキュリティにより2段階認証で保護されており、Apple と言えどもアプリやウェブサイト上でのユーザの行動を追跡することはありません。
Sign in with Apple を使う必要がある場合の基準を App Store Review Guidelines で公開しています。今日から App Store に新規アプリを提出する場合はこのガイドラインに従う必要があります。既存アプリは2020年4月までに従う必要があります。また、ウェブサイトや他のプラットフォームで Sign in with Apple を使う場合のガイドラインも公開しています。
iOS レビューガイドライン
サードパーティのログインサービス、もしくは ソーシャルログインサービス( Facebook ログイン、Goole サインイン、Twitter サインイン、Linked-In サインイン、Amazon ログイン、WeChat ログインなど)のみを使ってユーザの設定、プライマリアカウントの認証を行うアプリは、Sign in with Apple も提供しなくてはなりません。プライマリアカウントとは自分自身を識別したり、サインインしたり、ある機能や関連サービスにアクセスするためにアプリ内で開設するアカウントのことを指します。
以下の場合、Sign in with Apple は必要ありません。
- 自社独自のサインアップ、サインインシステムのみを使用している場合
- すでに存在する教育、エンタープライズアカウントでサインインする必要がある、教育、エンタープライズ、ビジネスアプリの場合
- 認証手段として、政府、業界が支援する国民認証システムや電子 ID を使うアプリの場合
- サードパーティサービスのクライアントであり、コンテンツにアクセスするには直接メール、ソーシャルメディア、他のサードパーティアカウントにサインインする必要があるアプリの場合
つまり
Sign In with AppleとはAppleが用意した新しいサインインシステムであり。
- 新規で登録するアプリはこのガイドラインを守らなければならない
- 現在リリース済みのアプリは「2020年4月」までにこのガイドラインを守らなければならない
- 自社独自の認証システムのみ使っている場合は対応しなくても問題ない
準備
Sign In with Appleを使用するにはXcode11が必要になります。お使いのXcodeをバージョンアップするか以下のリンクからXcode11を入手してください。
https://developer.apple.com/download/more/
実装
Sign In with Appleの対応にはAuthenticationServicesフレームワークを使用します。
AuthenticationServicesをインポートします。
1 | import AuthenticationServices |
ViewContorollerでボタンの設置やデリゲートの設定を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | class LoginViewController: UIViewController { @IBOutlet weak var loginProviderStackView: UIStackView! override func viewDidLoad() { super.viewDidLoad() setupProviderLoginView() } func setupProviderLoginView() { let authorizationButton = ASAuthorizationAppleIDButton() authorizationButton.addTarget(self, action: #selector(handleAuthorizationAppleIDButtonPress), for: .touchUpInside) self.loginProviderStackView.addArrangedSubview(authorizationButton) } @objc func handleAuthorizationAppleIDButtonPress() { let appleIDProvider = ASAuthorizationAppleIDProvider() let request = appleIDProvider.createRequest() request.requestedScopes = [.fullName, .email] let authorizationController = ASAuthorizationController(authorizationRequests: [request]) authorizationController.delegate = self authorizationController.presentationContextProvider = self authorizationController.performRequests() } } |
ASAuthorizationAppleIDButtonを使用することにより、Appleが推奨するUIのボタンが生成されます。Appleが推奨するデザインに関しては後述。
デリゲートでログイン後のトークンを取得します。
1 2 3 4 5 6 | extension LoginViewController: ASAuthorizationControllerDelegate { func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential { } } } |
ASAuthorizationControllerPresentationContextProvidingプロトコルで
システムが認証プロセスをユーザに提供するためのUIWindowの指定をします。
1 2 3 4 5 | extension LoginViewController: ASAuthorizationControllerPresentationContextProviding { func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { return self.view.window! } } |
デザイン
ウェブサイトやアプリもアカウント作成、サインイン体験に関するデザインガイドラインに従う必要があります。
また、Human Interface Guidelines に記載されている Sign in with Apple のボタンを使う必要があります。
https://developer.apple.com/design/human-interface-guidelines/sign-in-with-apple/overview/
さいごに
Sign In with Appleは状況によっては必須対応なだけあって実装自体はそんなに難しくなく出来そうです。問題はその後のデータの扱いや既存へのつなぎ込みですね。