Swift・iOS

Swiftを中心に学んだことを記録に残すブログです。技術に関係ない記事もたまに書いています。

【SwiftUI】Sign In with Appleの実装

 

はじめに

【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からログイン

f:id:hfoasi8fje3:20201030191448p:plain

 

Certificates, Identifiers & ProfilesのIdentifiersを追加します

※Certificatesの生成手順と、Deviceの登録手順に関しては省略します。

f:id:hfoasi8fje3:20201030202207p:plain

 

App IDsを選択してContinueを選択

f:id:hfoasi8fje3:20201030202339p:plain

 

DescriptionとBundle IDを入力し、Sign In with Appleにチェックを入れてContinueを選択

f:id:hfoasi8fje3:20201030202517p:plain

 

秘密鍵を作成するためにKeysの+かCreate a keyを選択

f:id:hfoasi8fje3:20201030204740p:plain

 

Sign in with Appleにチェックを入れて、Configureを選択

f:id:hfoasi8fje3:20201030205256p:plain

 

Primary App IDを選択してSaveを選択

f:id:hfoasi8fje3:20201030205504p:plain

 

Key Nameを入力してContinueを選択

f:id:hfoasi8fje3:20201030205951p:plain

 

Registerを選択

f:id:hfoasi8fje3:20201030210509p:plain

 

Downloadを選択

※注意:Keyをダウンロードした後に再ダウンロードすることはできません。そのため、ダウンロードしたKeyは必ず安全な場所に保存してください。

f:id:hfoasi8fje3:20201030210909p:plain

 

Provisioning Profileを生成するため、Profilesに移動して+を選択

f:id:hfoasi8fje3:20201030212158p:plain

 

今回は動作テスト用を想定しているので、DevelopmentのiOS Developmentを選択した状態で、Continueを選択

f:id:hfoasi8fje3:20201030212530p:plain

 

App IDを選択し、Continueを選択

f:id:hfoasi8fje3:20201030212902p:plain

 

Certificatesを選択し、Continueを選択

f:id:hfoasi8fje3:20201030213122p:plain

 

Deviceを選択し、Continueを選択

f:id:hfoasi8fje3:20201030213345p:plain

 

Provisioning Profileの名前を入力してGenerateを選択

f:id:hfoasi8fje3:20201030213652p:plain

 

Downloadを選択してダウンロード

ダウンロード完了後、ファイルをダブルクリックして取り込む

f:id:hfoasi8fje3:20201030214030p:plain

 

取り込んだProvisioning Profileを設定

(右にある"!"を選択するとSign In with Appleが有効になっていることが確認できる)

f:id:hfoasi8fje3:20201030221256p:plain

 

Provisioning Profileを設定した画面にある+Capabilityを選択し、Sign In with Appleを選択

f:id:hfoasi8fje3:20201030222303p:plain

 

Sign In with Appleが追加される

f:id:hfoasi8fje3:20201030222916p:plain

 

コード

 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

https://help.apple.com/developer-account/#/devcdfbb56a3

https://developer.apple.com/forums/thread/656784