はじめに
【SwiftUI】LINEログインの実装 - Swift・iOSの続きです。今回はSign in with Appleを実装していきます。
※ログイン機能については以下の記事でも取り上げています。
・【SwiftUI】IDとパスワードでログインする画面を実装する - Swift・iOS
・【SwiftUI】ログイン画面の実装まとめ - Swift・iOS
開発環境
・Xcode 12.0.1
・Swift 5.3
実装
※Apple Developer Program - Apple Developerへの登録が必要です。
設定手順
Apple DeveloperのAccountからログイン
Certificates, Identifiers & ProfilesのIdentifiersを追加します
※Certificatesの生成手順と、Deviceの登録手順に関しては省略します。
App IDsを選択してContinueを選択
DescriptionとBundle IDを入力し、Sign In with Appleにチェックを入れてContinueを選択
秘密鍵を作成するためにKeysの+かCreate a keyを選択
Sign in with Appleにチェックを入れて、Configureを選択
Primary App IDを選択してSaveを選択
Key Nameを入力してContinueを選択
Registerを選択
Downloadを選択
※注意:Keyをダウンロードした後に再ダウンロードすることはできません。そのため、ダウンロードしたKeyは必ず安全な場所に保存してください。
Provisioning Profileを生成するため、Profilesに移動して+を選択
今回は動作テスト用を想定しているので、DevelopmentのiOS Developmentを選択した状態で、Continueを選択
App IDを選択し、Continueを選択
Certificatesを選択し、Continueを選択
Deviceを選択し、Continueを選択
Provisioning Profileの名前を入力してGenerateを選択
Downloadを選択してダウンロード
ダウンロード完了後、ファイルをダブルクリックして取り込む
取り込んだProvisioning Profileを設定
(右にある"!"を選択するとSign In with Appleが有効になっていることが確認できる)
Provisioning Profileを設定した画面にある+Capabilityを選択し、Sign In with Appleを選択
コード
LoginView.swift
AuthenticationServicesをimport
import AuthenticationServices
body内にTextとSignInWithAppleButtonを追加
Text("Sign In with Apple") .bold() SignInWithAppleButton(.signIn) { request in request.requestedScopes = [.fullName, .email] } onCompletion: { authResults in viewModel.appleAuthResults = authResults } .signInWithAppleButtonStyle(.black) .frame(width: 200, height: 45)
LoginViewModel.swift
AuthenticationServicesをimport
import AuthenticationServices
変数を追加
@Published var appleAuthResults: Result<ASAuthorization, Error>?
initに以下を追加
$appleAuthResults .sink(receiveValue: { results in switch results { case .success(let authResults): switch authResults.credential { case let appleIDCredential as ASAuthorizationAppleIDCredential: print("userIdentifier:\(appleIDCredential.user)") print("fullName:\(String(describing: appleIDCredential.fullName))") print("email:\(String(describing: appleIDCredential.email))") print("authorizationCode:\(String(describing: appleIDCredential.authorizationCode))") print("ここでログイン処理を呼び出す") default: break } case .failure(let error): print(error.localizedDescription) default: break } }) .store(in: &disposables)
メールアドレスとフルネームの取得条件である「初回」の定義
メールアドレスとフルネームは初回のみ取得できます。
実機で動かしてみたところ、以下の動作が確認できました。
・ユーザーがアプリをインストールして初めてSign In with Appleを実行した時はメールアドレスとフルネームを取得できる
・Sign In with Appleを実行後、ユーザーが設定 > パスワードとセキュリティ > Apple IDを使用中のApp > アプリを選択 > Apple IDの使用を停止する、を選択し、再度Sign In with Appleを実行した時はメールアドレスとフルネームを取得できる
・Sign In with Appleを実行後、ユーザーがアプリを削除し再ダウンロードしてSign In with Appleを実行してもメールアドレスとフルネームは取得できない(=初回扱いではない)
上記の事象から、「初回」の定義は「該当アプリでSign In with Appleで認証をしたことがない状態でSign In with Appleを実行した時」、もしくは、「Sign In with Appleで認証後、該当アプリでのApple IDの使用を停止して再度Sign In with Appleを実行した時」となります。そのため、「初回」以降は該当のアプリの削除や再インストールの操作に関係なく、該当のアプリでApple IDの使用を停止するまで、「初回」状態に戻ることはありません。
おわりに
ログイン機能について、これまでID・パスワードでのログイン、LINEログイン、Sign In with Appleを実装してきました。次回は、これらを全て実装した全体のコードのまとめ記事を書こうと思います。
参考
・https://help.apple.com/developer-account/#/dev04f3e1cfc
・https://help.apple.com/developer-account/#/dev77c875b7e