Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

電話番号を使用してAppleプラットフォームでFirebaseを認証する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

SMS メッセージをユーザーの電話に送信することで、Firebase Authentication を使用してユーザーをサインインさせることができます。ユーザーは、SMS メッセージに含まれるワンタイム コードを使用してサインインします。

アプリに電話番号サインインを追加する最も簡単な方法は、 FirebaseUIを使用することです。これには、電話番号サインインのサインイン フローを実装するドロップイン サインイン ウィジェットと、パスワード ベースのフェデレーション サインが含まれています。 -の。このドキュメントでは、Firebase SDK を使用して電話番号ログイン フローを実装する方法について説明します。

あなたが始める前に

Swift Package Manager を使用して、Firebase の依存関係をインストールおよび管理します。

  1. Xcode で、アプリ プロジェクトを開いた状態で、 File > Add Packagesに移動します。
  2. プロンプトが表示されたら、Firebase Apple プラットフォーム SDK リポジトリを追加します。
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Firebase Authentication ライブラリを選択します。
  5. 完了すると、Xcode はバックグラウンドで依存関係の解決とダウンロードを自動的に開始します。
そして、構成手順を確認します。
  1. アプリを Firebase プロジェクトにまだ接続していない場合は、 Firebase コンソールから接続します。

セキュリティ上の懸念

電話番号のみを使用した認証は便利ですが、電話番号の所有権がユーザー間で簡単に譲渡される可能性があるため、他の使用可能な方法よりも安全性が低くなります。また、複数のユーザー プロファイルを持つデバイスでは、SMS メッセージを受信できるユーザーは、デバイスの電話番号を使用してアカウントにサインインできます。

アプリで電話番号ベースのサインインを使用する場合は、より安全なサインイン方法と一緒に提供し、電話番号によるサインインの使用によるセキュリティのトレードオフについてユーザーに通知する必要があります。

Firebase プロジェクトの電話番号ログインを有効にする

ユーザーを SMS でサインインするには、最初に Firebase プロジェクトで電話番号によるサインイン方法を有効にする必要があります。

  1. Firebase コンソールで、[認証]セクションを開きます。
  2. [サインイン方法]ページで、電話番号によるサインイン方法を有効にします。

Firebase の電話番号サインイン リクエスト クォータは十分に高いため、ほとんどのアプリは影響を受けません。ただし、電話認証を使用して大量のユーザーをサインインさせる必要がある場合は、料金プランのアップグレードが必要になる場合があります。料金ページをご覧ください。

アプリの確認を有効にする

電話番号認証を使用するには、電話番号サインイン リクエストがアプリからのものであることを Firebase が確認できる必要があります。 Firebase Authentication がこれを実現する方法は 2 つあります。

  • サイレント APNs 通知: デバイスでユーザーが電話番号を使用して初めてサインインすると、Firebase Authentication はサイレント プッシュ通知を使用してデバイスにトークンを送信します。アプリが Firebase からの通知を正常に受信した場合は、電話番号によるサインインを続行できます。

    iOS 8.0 以降では、サイレント通知は明示的なユーザーの同意を必要としないため、ユーザーがアプリで APNs 通知の受信を拒否しても影響を受けません。したがって、アプリは、Firebase 電話番号認証を実装するときに、プッシュ通知を受信するためにユーザーの許可を要求する必要はありません。

  • reCAPTCHA 検証: ユーザーがアプリのバックグラウンド更新を無効にしている場合や、iOS シミュレーターでアプリをテストしている場合など、サイレント プッシュ通知の送受信ができない場合、Firebase Authentication は reCAPTCHA 検証を使用して電話を完了します。サインインの流れ。多くの場合、reCAPTCHA チャレンジは、ユーザーが何も解決しなくても完了できます。

サイレント プッシュ通知が適切に構成されている場合、reCAPTCHA フローを経験するユーザーはごくわずかです。それでも、サイレント プッシュ通知が利用可能かどうかにかかわらず、電話番号によるサインインが正しく機能することを確認する必要があります。

サイレント通知の受信を開始する

Firebase Authentication で使用する APNs 通知を有効にするには:

  1. Xcode で、プロジェクトのプッシュ通知を有効にします。
  2. APNs 認証キーを Firebase にアップロードします。 APNs 認証キーをまだ持っていない場合は、 Apple Developer Member Centerで必ず作成してください。

    1. Firebase コンソールのプロジェクト内で、歯車アイコンを選択し、[プロジェクト設定]を選択してから、[クラウド メッセージング] タブを選択します。

    2. [ iOS アプリの構成] の [ APNs 認証キー] で、[アップロード] ボタンをクリックします。

    3. キーを保存した場所を参照して選択し、[開く] をクリックします。キーのキー ID ( Apple Developer Member Centerで入手可能) を追加し、[アップロード] をクリックします。

    APNs 証明書が既にある場合は、代わりに証明書をアップロードできます。

reCAPTCHA 検証を設定する

Firebase SDK で reCAPTCHA 検証を使用できるようにするには:

  1. カスタム URL スキームを Xcode プロジェクトに追加します。
    1. プロジェクト構成を開きます。左側のツリー ビューでプロジェクト名をダブルクリックします。 [ターゲット] セクションからアプリを選択し、[情報] タブを選択して、[ URL の種類] セクションを展開します。
    2. [ + ] ボタンをクリックし、反転したクライアント ID の URL スキームを追加します。この値を見つけるには、 GoogleService-Info.plist構成ファイルを開き、 REVERSED_CLIENT_IDキーを探します。そのキーの値をコピーして、構成ページの [ URL スキーム]ボックスに貼り付けます。他のフィールドは空白のままにします。

      完了すると、構成は次のようになります (ただし、アプリケーション固有の値があります)。

  2. オプション: reCAPTCHA をユーザーに表示するときにアプリがSFSafariViewControllerを表示する方法をカスタマイズする場合は、 AuthUIDelegateプロトコルに準拠するカスタム クラスを作成し、それをverifyPhoneNumber(_:uiDelegate:completion:)に渡します。

ユーザーの電話に確認コードを送信する

電話番号によるサインインを開始するには、ユーザーに電話番号の入力を求めるインターフェースを提示し、 verifyPhoneNumber(_:uiDelegate:completion:)を呼び出して、Firebase がユーザーの電話に SMS で認証コードを送信するように要求します。

  1. ユーザーの電話番号を取得します。

    法的要件はさまざまですが、ベスト プラクティスとして、またユーザーの期待を設定するために、ユーザーが電話によるサインインを使用する場合、確認のために SMS メッセージを受信する可能性があり、標準料金が適用されることをユーザーに通知する必要があります。

  2. verifyPhoneNumber(_:uiDelegate:completion:)を呼び出し、ユーザーの電話番号を渡します。

    迅速

    PhoneAuthProvider.provider()
      .verifyPhoneNumber(phoneNumber, uiDelegate: nil) { verificationID, error in
          if let error = error {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // Sign in using the verificationID and the code sent to the user
          // ...
      }

    Objective-C

    [[FIRPhoneAuthProvider provider] verifyPhoneNumber:userInput
                                            UIDelegate:nil
                                            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
      if (error) {
        [self showMessagePrompt:error.localizedDescription];
        return;
      }
      // Sign in using the verificationID and the code sent to the user
      // ...
    }];

    verifyPhoneNumberメソッドは再入可能です。ビューのonAppearメソッドなどで複数回呼び出すと、元の要求がタイムアウトしない限り、 verifyPhoneNumberメソッドは 2 番目の SMS を送信しません。

    verifyPhoneNumber(_:uiDelegate:completion:)を呼び出すと、Firebase はサイレント プッシュ通知をアプリに送信するか、ユーザーに reCAPTCHA チャレンジを発行します。アプリが通知を受け取るか、ユーザーが reCAPTCHA チャレンジを完了すると、Firebase は認証コードを含む SMS メッセージを指定された電話番号に送信し、確認 ID を完了関数に渡します。ユーザーをサインインするには、確認コードと確認 ID の両方が必要です。

    Firebase から送信される SMS メッセージは、Auth インスタンスのlanguageCodeプロパティを介して認証言語を指定することで、ローカライズすることもできます。

    迅速

     // Change language code to french.
     Auth.auth().languageCode = "fr";
    

    Objective-C

     // Change language code to french.
     [FIRAuth auth].languageCode = @"fr";
    
  3. 検証 ID を保存し、アプリの読み込み時に復元します。そうすることで、ユーザーがサインイン フローを完了する前にアプリが終了した場合 (たとえば、SMS アプリへの切り替え中) に、有効な確認 ID を引き続き保持することができます。

    検証 ID は任意の方法で永続化できます。簡単な方法は、検証 ID をNSUserDefaultsオブジェクトで保存することです。

    迅速

    UserDefaults.standard.set(verificationID, forKey: "authVerificationID")
    

    Objective-C

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:verificationID forKey:@"authVerificationID"];
    

    次に、保存した値を復元できます。

    迅速

    let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
    

    Objective-C

    NSString *verificationID = [defaults stringForKey:@"authVerificationID"];
    

verifyPhoneNumber(_:uiDelegate:completion:)の呼び出しが成功した場合、ユーザーが SMS メッセージで確認コードを受信したときに確認コードを入力するように求めることができます。

確認コードを使用してユーザーにサインインします

ユーザーが SMS メッセージからアプリに確認コードを提供したら、確認コードと確認 ID からFIRPhoneAuthCredentialオブジェクトを作成し、そのオブジェクトをsignInWithCredential:completion:に渡すことで、ユーザーをサインインさせます。

  1. ユーザーから確認コードを取得します。
  2. 検証コードと検証 ID からFIRPhoneAuthCredentialオブジェクトを作成します。

    迅速

    let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationID,
      verificationCode: verificationCode
    )

    Objective-C

    FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
        credentialWithVerificationID:verificationID
                    verificationCode:userInput];
  3. FIRPhoneAuthCredentialオブジェクトを使用してユーザーにサインインします。

    迅速

    Auth.auth().signIn(with: credential) { authResult, error in
        if let error = error {
          let authError = error as NSError
          if isMFAEnabled, authError.code == AuthErrorCode.secondFactorRequired.rawValue {
            // The user is a multi-factor user. Second factor challenge is required.
            let resolver = authError
              .userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver
            var displayNameString = ""
            for tmpFactorInfo in resolver.hints {
              displayNameString += tmpFactorInfo.displayName ?? ""
              displayNameString += " "
            }
            self.showTextInputPrompt(
              withMessage: "Select factor to sign in\n\(displayNameString)",
              completionBlock: { userPressedOK, displayName in
                var selectedHint: PhoneMultiFactorInfo?
                for tmpFactorInfo in resolver.hints {
                  if displayName == tmpFactorInfo.displayName {
                    selectedHint = tmpFactorInfo as? PhoneMultiFactorInfo
                  }
                }
                PhoneAuthProvider.provider()
                  .verifyPhoneNumber(with: selectedHint!, uiDelegate: nil,
                                     multiFactorSession: resolver
                                       .session) { verificationID, error in
                    if error != nil {
                      print(
                        "Multi factor start sign in failed. Error: \(error.debugDescription)"
                      )
                    } else {
                      self.showTextInputPrompt(
                        withMessage: "Verification code for \(selectedHint?.displayName ?? "")",
                        completionBlock: { userPressedOK, verificationCode in
                          let credential: PhoneAuthCredential? = PhoneAuthProvider.provider()
                            .credential(withVerificationID: verificationID!,
                                        verificationCode: verificationCode!)
                          let assertion: MultiFactorAssertion? = PhoneMultiFactorGenerator
                            .assertion(with: credential!)
                          resolver.resolveSignIn(with: assertion!) { authResult, error in
                            if error != nil {
                              print(
                                "Multi factor finanlize sign in failed. Error: \(error.debugDescription)"
                              )
                            } else {
                              self.navigationController?.popViewController(animated: true)
                            }
                          }
                        }
                      )
                    }
                  }
              }
            )
          } else {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // ...
          return
        }
        // User is signed in
        // ...
    }

    Objective-C

    [[FIRAuth auth] signInWithCredential:credential
                              completion:^(FIRAuthDataResult * _Nullable authResult,
                                           NSError * _Nullable error) {
        if (isMFAEnabled && error && error.code == FIRAuthErrorCodeSecondFactorRequired) {
          FIRMultiFactorResolver *resolver = error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey];
          NSMutableString *displayNameString = [NSMutableString string];
          for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
            [displayNameString appendString:tmpFactorInfo.displayName];
            [displayNameString appendString:@" "];
          }
          [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Select factor to sign in\n%@", displayNameString]
                               completionBlock:^(BOOL userPressedOK, NSString *_Nullable displayName) {
           FIRPhoneMultiFactorInfo* selectedHint;
           for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
             if ([displayName isEqualToString:tmpFactorInfo.displayName]) {
               selectedHint = (FIRPhoneMultiFactorInfo *)tmpFactorInfo;
             }
           }
           [FIRPhoneAuthProvider.provider
            verifyPhoneNumberWithMultiFactorInfo:selectedHint
            UIDelegate:nil
            multiFactorSession:resolver.session
            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
              if (error) {
                [self showMessagePrompt:error.localizedDescription];
              } else {
                [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Verification code for %@", selectedHint.displayName]
                                     completionBlock:^(BOOL userPressedOK, NSString *_Nullable verificationCode) {
                 FIRPhoneAuthCredential *credential =
                     [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID
                                                                  verificationCode:verificationCode];
                 FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
                 [resolver resolveSignInWithAssertion:assertion completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
                   if (error) {
                     [self showMessagePrompt:error.localizedDescription];
                   } else {
                     NSLog(@"Multi factor finanlize sign in succeeded.");
                   }
                 }];
               }];
              }
            }];
         }];
        }
      else if (error) {
        // ...
        return;
      }
      // User successfully signed in. Get user data from the FIRUser object
      if (authResult == nil) { return; }
      FIRUser *user = authResult.user;
      // ...
    }];

架空の電話番号でテストする

Firebase コンソールを介して、開発用の架空の電話番号を設定できます。架空の電話番号を使用したテストには、次の利点があります。

  • 使用クォータを消費せずに電話番号認証をテストします。
  • 実際の SMS メッセージを送信せずに電話番号認証をテストします。
  • 調整されることなく、同じ電話番号で連続してテストを実行します。これにより、レビュー担当者がたまたま同じ電話番号をテストに使用した場合に、App Store のレビュー プロセス中に拒否されるリスクが最小限に抑えられます。
  • Google Play Services を使用せずに iOS シミュレーターや Android エミュレーターで開発する機能など、追加の労力を必要とせずに開発環境で簡単にテストできます。
  • 本番環境で実際の電話番号に通常適用されるセキュリティ チェックによってブロックされることなく、統合テストを記述します。

架空の電話番号は、次の要件を満たす必要があります。

  1. 実際に架空のものであり、まだ存在していない電話番号を使用していることを確認してください。 Firebase Authentication では、実際のユーザーが使用する既存の電話番号をテスト番号として設定することはできません。 1 つのオプションは、555 のプレフィックス番号を米国のテスト用電話番号として使用することです。たとえば、 +1 650-555-3434 です。
  2. 電話番号は、長さやその他の制約に合わせて正しくフォーマットする必要があります。実際のユーザーの電話番号と同じ検証が行われます。
  3. 開発用に最大 10 個の電話番号を追加できます。
  4. 推測しにくいテスト用の電話番号/コードを使用し、頻繁に変更してください。

架空の電話番号と確認コードを作成する

  1. Firebase コンソールで、[認証]セクションを開きます。
  2. [サインイン方法] タブで、電話プロバイダーをまだ有効にしていない場合は有効にします。
  3. アコーディオン メニューをテストするための電話番号を開きます。
  4. テストする電話番号を入力します (例: +1 650-555-3434 )
  5. その特定の番号の 6 桁の確認コードを入力します (例: 654321 )
  6. 番号を追加します。必要に応じて、対応する行にカーソルを合わせてゴミ箱アイコンをクリックすると、電話番号とそのコードを削除できます。

手動テスト

アプリケーションで架空の電話番号の使用を直接開始できます。これにより、割り当ての問題やスロットリングに遭遇することなく、開発段階で手動テストを実行できます。 Google Play サービスがインストールされていない iOS シミュレーターまたは Android エミュレーターから直接テストすることもできます。

架空の電話番号を入力して確認コードを送信すると、実際の SMS は送信されません。代わりに、以前に構成した確認コードを入力してサインインを完了する必要があります。

サインインが完了すると、その電話番号を使用して Firebase ユーザーが作成されます。ユーザーは、実際の電話番号ユーザーと同じ動作とプロパティを持ち、Realtime Database/Cloud Firestore やその他のサービスに同じ方法でアクセスできます。このプロセスで作成された ID トークンには、実際の電話番号ユーザーと同じ署名があります。

別のオプションとして、これらのユーザーにカスタム クレームを介してテスト ロールを設定し、アクセスをさらに制限する場合に偽のユーザーとして区別することもできます。

統合テスト

手動テストに加えて、Firebase Authentication は、電話認証テスト用の統合テストを作成するのに役立つ API を提供します。これらの API は、Web の reCAPTCHA 要件と iOS のサイレント プッシュ通知を無効にすることで、アプリの検証を無効にします。これにより、これらのフローで自動化テストが可能になり、実装が容易になります。さらに、Android で即時確認フローをテストする機能を提供するのに役立ちます。

iOS では、 appVerificationDisabledForTestingを呼び出す前にverifyPhoneNumber設定をTRUEに設定する必要があります。これは、APNs トークンを必要とせず、バックグラウンドでサイレント プッシュ通知を送信することなく処理されるため、シミュレーターでのテストが容易になります。これにより、reCAPTCHA フォールバック フローも無効になります。

アプリの確認が無効になっている場合、架空の電話番号を使用するとサインインが完了しないことに注意してください。この API で使用できるのは架空の電話番号のみです。

迅速

let phoneNumber = "+16505554567"

// This test verification code is specified for the given test phone number in the developer console.
let testVerificationCode = "123456"

Auth.auth().settings.isAppVerificationDisabledForTesting = TRUE
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate:nil) {
                                                            verificationID, error in
    if (error) {
      // Handles error
      self.handleError(error)
      return
    }
    let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "",
                                                               verificationCode: testVerificationCode)
    Auth.auth().signInAndRetrieveData(with: credential) { authData, error in
      if (error) {
        // Handles error
        self.handleError(error)
        return
      }
      _user = authData.user
    }];
}];

Objective-C

NSString *phoneNumber = @"+16505554567";

// This test verification code is specified for the given test phone number in the developer console.
NSString *testVerificationCode = @"123456";

[FIRAuth auth].settings.appVerificationDisabledForTesting = YES;
[[FIRPhoneAuthProvider provider] verifyPhoneNumber:phoneNumber
                                        completion:^(NSString *_Nullable verificationID,
                                                     NSError *_Nullable error) {
    if (error) {
      // Handles error
      [self handleError:error];
      return;
    }
    FIRAuthCredential *credential =
        [FIRPhoneAuthProvider credentialWithVerificationID:verificationID
                                          verificationCode:testVerificationCode];
    [FIRAuth auth] signInWithAndRetrieveDataWithCredential:credential
                                                completion:^(FIRUser *_Nullable user,
                                                             NSError *_Nullable error) {
      if (error) {
        // Handles error
        [self handleError:error];
        return;
      }
      _user = user;
    }];
}];

付録: スウィズルなしで電話サインインを使用する

Firebase Authentication はメソッド スウィズリングを使用して、アプリの APNs トークンを自動的に取得し、Firebase がアプリに送信するサイレント プッシュ通知を処理し、検証中に reCAPTCHA 検証ページからのカスタム スキーム リダイレクトを自動的にインターセプトします。

スウィズリングを使用したくない場合は、フラグFirebaseAppDelegateProxyEnabledをアプリの Info.plist ファイルに追加してNOに設定することで無効にできます。このフラグをNOに設定すると、Firebase Cloud Messaging を含む他の Firebase 製品のスウィズリングも無効になることに注意してください。

スウィズリングを無効にする場合は、APNs デバイス トークン、プッシュ通知、およびカスタム スキームのリダイレクト URL を Firebase Authentication に明示的に渡す必要があります。

SwiftUI アプリケーションを構築している場合は、APNs デバイス トークン、プッシュ通知、およびカスタム スキームのリダイレクト URL を明示的に Firebase Authentication に渡す必要もあります。

APNs デバイス トークンを取得するには、 application(_:didRegisterForRemoteNotificationsWithDeviceToken:)メソッドを実装し、その中でデバイス トークンをAuthsetAPNSToken(_:type:)メソッドに渡します。

迅速

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  // Pass device token to auth
  Auth.auth().setAPNSToken(deviceToken, type: .prod)

  // Further handling of the device token if needed by the app
  // ...
}

Objective-C

- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  // Pass device token to auth.
  [[FIRAuth auth] setAPNSToken:deviceToken type:FIRAuthAPNSTokenTypeProd];
  // Further handling of the device token if needed by the app.
}

プッシュ通知を処理するには、 application(_:didReceiveRemoteNotification:fetchCompletionHandler:):メソッドで、 AuthcanHandleNotification(_:)メソッドを呼び出して、Firebase 認証関連の通知を確認します。

迅速

func application(_ application: UIApplication,
    didReceiveRemoteNotification notification: [AnyHashable : Any],
    fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  if Auth.auth().canHandleNotification(notification) {
    completionHandler(.noData)
    return
  }
  // This notification is not auth related; it should be handled separately.
}

Objective-C

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)notification
          fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // Pass notification to auth and check if they can handle it.
  if ([[FIRAuth auth] canHandleNotification:notification]) {
    completionHandler(UIBackgroundFetchResultNoData);
    return;
  }
  // This notification is not auth related; it should be handled separately.
}

カスタム スキームのリダイレクト URL を処理するには、 application(_:open:options:)メソッドを実装し、その中で URL をAuthcanHandleURL(_:)メソッドに渡します。

迅速

func application(_ application: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  if Auth.auth().canHandle(url) {
    return true
  }
  // URL not auth related; it should be handled separately.
}

Objective-C

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
  if ([[FIRAuth auth] canHandleURL:url]) {
    return YES;
  }
  // URL not auth related; it should be handled separately.
}

SwiftUI またはUISceneDelegateを使用している場合、リダイレクト URL を処理するには、 scene(_:openURLContexts:)メソッドを実装し、その中で URL をAuthcanHandleURL(_:)メソッドに渡します。

迅速

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
  for urlContext in URLContexts {
      let url = urlContext.url
      Auth.auth().canHandle(url)
  }
  // URL not auth related; it should be handled separately.
}

Objective-C

- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
  for (UIOpenURLContext *urlContext in URLContexts) {
    [FIRAuth.auth canHandleURL:urlContext.url];
    // URL not auth related; it should be handled separately.
  }
}

次のステップ

ユーザーが初めてサインインすると、新しいユーザー アカウントが作成され、サインインに使用したユーザーの資格情報 (ユーザー名とパスワード、電話番号、または認証プロバイダー情報) にリンクされます。この新しいアカウントは Firebase プロジェクトの一部として保存され、ユーザーのサインイン方法に関係なく、プロジェクト内のすべてのアプリでユーザーを識別するために使用できます。

  • アプリでは、ユーザーの基本的なプロファイル情報をFIRUserオブジェクトから取得できます。ユーザーの管理を参照してください。

  • Firebase Realtime Database と Cloud Storageセキュリティ ルールでは、サインインしているユーザーの一意のユーザー ID をauth変数から取得し、それを使用してユーザーがアクセスできるデータを制御できます。

認証プロバイダーの資格情報を既存のユーザー アカウントにリンクすることで、ユーザーが複数の認証プロバイダーを使用してアプリにサインインできるようにすることができます。

ユーザーをサインアウトするには、 signOut:を呼び出します。

迅速

    let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}
  

Objective-C

    NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

認証エラーの全範囲に対してエラー処理コードを追加することもできます。エラーの処理を参照してください。