Catch up on everything we announced at this year's Firebase Summit. Learn more

Authentifizieren Sie sich bei Firebase auf Apple-Plattformen mithilfe einer Telefonnummer

Sie können Firebase Authentication verwenden, um einen Benutzer anzumelden, indem Sie eine SMS-Nachricht an das Telefon des Benutzers senden. Der Benutzer meldet sich mit einem Einmalcode an, der in der SMS-Nachricht enthalten ist.

Der einfachste Weg , Telefonnummer Sign-in hinzufügen , um Ihre Anwendung verwenden FirebaseUI , die ein Drop-in beinhaltet Anmelde-Widget , dass Geräte-Anmeldeströme für Telefonnummer Sign-in, sowie Passwort-basierte und föderierte Zeichen -in. In diesem Dokument wird beschrieben, wie Sie mit dem Firebase SDK einen Anmeldevorgang für eine Telefonnummer implementieren.

Bevor Sie beginnen

Verwenden Sie den Swift Package Manager, um Firebase-Abhängigkeiten zu installieren und zu verwalten.

  1. In Xcode, mit Ihrem App - Projekt zu öffnen, navigieren Sie zu Datei> Swift Packages> Paket hinzufügen Abhängigkeit.
  2. Wenn Sie dazu aufgefordert werden, fügen Sie das SDK-Repository der Firebase Apple Platforms hinzu:
  3.   https://github.com/firebase/firebase-ios-sdk
      
  4. Wählen Sie die Firebase Authentication-Bibliothek aus.
  5. Wenn Sie fertig sind, beginnt Xcode automatisch, Ihre Abhängigkeiten im Hintergrund aufzulösen und herunterzuladen.
Und überprüfen Sie einen Konfigurationsschritt:
  1. Wenn Sie noch nicht Ihre App auf Ihr Projekt verbunden Firebase, tun Sie dies aus der Firebase Konsole .

Sicherheitsbedenken

Die Authentifizierung mit nur einer Telefonnummer ist zwar bequem, aber weniger sicher als die anderen verfügbaren Methoden, da der Besitz einer Telefonnummer leicht zwischen Benutzern übertragen werden kann. Außerdem kann sich auf Geräten mit mehreren Benutzerprofilen jeder Benutzer, der SMS-Nachrichten empfangen kann, mit der Telefonnummer des Geräts bei einem Konto anmelden.

Wenn Sie die telefonnummernbasierte Anmeldung in Ihrer App verwenden, sollten Sie diese neben sichereren Anmeldemethoden anbieten und die Benutzer über die Sicherheitsabwägungen bei der Verwendung der Telefonnummernanmeldung informieren.

Aktivieren Sie die Telefonnummern-Anmeldung für Ihr Firebase-Projekt

Um Benutzer per SMS anzumelden, müssen Sie zunächst die Anmeldemethode Telefonnummer für Ihr Firebase-Projekt aktivieren:

  1. In der Firebase Konsole öffnen den Abschnitt Authentication.
  2. Auf der Sign-in - Methode Seite, aktivieren Sie die Telefonnummer Anmelde-Verfahren.

Das Kontingent von Firebase-Anmeldeanfragen für Telefonnummern ist hoch genug, sodass die meisten Apps nicht betroffen sind. Wenn Sie jedoch eine sehr große Anzahl von Benutzern mit Telefonauthentifizierung anmelden müssen, müssen Sie möglicherweise Ihren Preisplan aktualisieren. Siehe die Preisseite.

App-Überprüfung aktivieren

Damit Sie die Telefonnummerauthentifizierung verwenden können, muss Firebase überprüfen können, ob von Ihrer App Anmeldeanfragen für Telefonnummern stammen. Firebase Authentication kann dies auf zwei Arten erreichen:

  • Silent - APNs - Benachrichtigungen: Wenn Sie mit ihrer Telefonnummer zum ersten Mal auf einem Gerät in einem Benutzer anmelden, Firebase - Authentifizierung sendet ein Token an das Gerät einer stille Push - Benachrichtigung verwenden. Wenn Ihre App die Benachrichtigung von Firebase erfolgreich erhält, kann die Anmeldung über die Telefonnummer fortgesetzt werden.

    Für iOS 8.0 und höher erfordern stille Benachrichtigungen keine ausdrückliche Zustimmung des Benutzers und sind daher nicht betroffen, wenn ein Benutzer den Empfang von APNs-Benachrichtigungen in der App ablehnt. Daher muss die App bei der Implementierung der Firebase-Telefonnummernauthentifizierung keine Benutzerberechtigung zum Empfangen von Push-Benachrichtigungen anfordern.

  • reCAPTCHA Prüfung: Für den Fall , dass das Senden oder eine stille Push - Benachrichtigung Empfang nicht möglich ist, wie zum Beispiel , wenn der Benutzer deaktiviert Hintergrundaktualisierung für Ihre App hat, oder wenn Ihre Anwendung auf einem iOS - Simulator zu testen, Firebase - Authentifizierung verwendet reCAPTCHA Überprüfung das Telefon abgeschlossen Anmeldeablauf. Die reCAPTCHA-Challenge kann oft abgeschlossen werden, ohne dass der Nutzer etwas lösen muss.

Wenn stille Push-Benachrichtigungen richtig konfiguriert sind, erlebt nur ein sehr kleiner Prozentsatz der Benutzer den reCAPTCHA-Flow. Sie sollten jedoch sicherstellen, dass die Anmeldung über die Telefonnummer korrekt funktioniert, unabhängig davon, ob stille Push-Benachrichtigungen verfügbar sind oder nicht.

Beginne, stumme Benachrichtigungen zu erhalten

So aktivieren Sie APNs-Benachrichtigungen für die Verwendung mit Firebase Authentication:

  1. In Xcode, ermöglicht Push - Benachrichtigungen für Ihr Projekt.
  2. Laden Sie Ihren APNs-Authentifizierungsschlüssel in Firebase hoch. Wenn Sie nicht bereits über einen APNs Authentifizierungsschlüssel haben, stellen Sie sicher , dass man in der erstellen Apple Developer Member Center .

    1. In Ihrem Projekt in der Firebase - Konsole, wählen Sie das Zahnradsymbol, Projekteinstellungen auswählen und anschließend die Cloud Messaging Registerkarte.

    2. In APNs Authentifizierungsschlüssel unter iOS - App - Konfiguration, klicken Sie auf die Schaltfläche Hochladen.

    3. Wechseln Sie zu dem Ort , an dem Sie Ihren Schlüssel gespeichert, wählen Sie aus und klicken Sie auf Öffnen. Fügen Sie den Schlüssel - ID für den Schlüssel (erhältlich im Apple Developer Member Center ) und klicken Sie auf Hochladen.

    Wenn Sie bereits über ein APNs-Zertifikat verfügen, können Sie stattdessen das Zertifikat hochladen.

reCAPTCHA-Verifizierung einrichten

So aktivieren Sie das Firebase SDK für die Verwendung der reCAPTCHA-Verifizierung:

  1. Fügen Sie Ihrem Xcode-Projekt benutzerdefinierte URL-Schemas hinzu:
    1. Öffnen Sie Ihre Projektkonfiguration: Doppelklicken Sie in der linken Baumansicht auf den Projektnamen. Wählen Sie Ihre App aus dem Abschnitt VORGABEN, wählen Sie dann die Registerkarte Info, und erweitern Sie den URL - Typen Abschnitt.
    2. Klicken Sie auf die Schaltfläche +, und fügen Sie eine URL - Schema für die Reversed - Client - ID. Um diesen Wert zu finden, öffnen Sie die GoogleService-Info.plist Konfigurationsdatei, und suchen Sie nach dem REVERSED_CLIENT_ID Schlüssel. Kopieren Sie den Wert dieses Schlüssels, und fügen Sie ihn in das URL - Schemata auf der Konfigurationsseite Feld. Lassen Sie die anderen Felder leer.

      Nach Abschluss sollte Ihre Konfiguration in etwa wie folgt aussehen (aber mit Ihren anwendungsspezifischen Werten):

  2. Optional: Wenn Sie die Möglichkeit , Ihre App präsentiert die anpassen SFSafariViewController oder UIWebView , wenn die reCAPTCHA für den Benutzer, eine benutzerdefinierte Klasse erstellen , das entspricht das FIRAuthUIDelegate Protokoll und übergibt es an verifyPhoneNumber:UIDelegate:completion: .

Senden Sie einen Bestätigungscode an das Telefon des Benutzers

So initiieren Telefonnummer Sign-in, präsentieren dem Anwender eine Schnittstelle , die Aufforderungen sie ihre Telefonnummer zur Verfügung zu stellen, und rufen Sie dann verifyPhoneNumber:UIDelegate:completion: auf Anfrage , dass Firebase einen Authentifizierungscode an das Telefon des Benutzers per SMS senden:

  1. Rufen Sie die Telefonnummer des Benutzers ab.

    Die rechtlichen Anforderungen variieren, aber als Best Practice und um die Erwartungen Ihrer Benutzer zu erfüllen, sollten Sie sie darüber informieren, dass sie bei der telefonischen Anmeldung möglicherweise eine SMS-Nachricht zur Bestätigung erhalten und Standardtarife gelten.

  2. Rufen Sie verifyPhoneNumber:UIDelegate:completion: , vorbei an ihm die Telefonnummer des Benutzers.

    Schnell

    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
          // ...
      }

    Ziel 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
      // ...
    }];

    Wenn Sie anrufen verifyPhoneNumber:UIDelegate:completion: sendet Firebase eine stille Push - Benachrichtigung auf Ihre App oder Probleme eine reCAPTCHA Herausforderung für den Benutzer. Nachdem Ihre App die Benachrichtigung erhalten hat oder der Benutzer die reCAPTCHA-Herausforderung abgeschlossen hat, sendet Firebase eine SMS-Nachricht mit einem Authentifizierungscode an die angegebene Telefonnummer und übergibt eine Verifizierungs-ID an Ihre Abschlussfunktion. Sie benötigen sowohl den Verifizierungscode als auch die Verifizierungs-ID, um den Benutzer anzumelden.

    Die SMS - Nachricht von Firebase gesendet werden , können auch durch die Angabe der Auth - Sprache über die lokalisiert werden languageCode Eigenschaft auf Ihrer Auth - Instanz.

    Schnell

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

    Ziel c

     // Change language code to french.
     [FIRAuth auth].languageCode = @"fr";
    
  3. Speichern Sie die Verifizierungs-ID und stellen Sie sie wieder her, wenn Ihre App geladen wird. Auf diese Weise können Sie sicherstellen, dass Sie weiterhin über eine gültige Verifizierungs-ID verfügen, wenn Ihre App beendet wird, bevor der Benutzer den Anmeldevorgang abgeschlossen hat (z. B. beim Wechsel zur SMS-App).

    Sie können die Verifizierungs-ID beliebig beibehalten. Ein einfacher Weg ist es, die Überprüfung - ID mit dem speichern NSUserDefaults Objekt:

    Schnell

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

    Ziel c

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

    Anschließend können Sie den gespeicherten Wert wiederherstellen:

    Schnell

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

    Ziel c

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

Wenn der Aufruf von verifyPhoneNumber:UIDelegate:completion: erfolgreich ist , können Sie den Benutzer auffordern , den Bestätigungscode einzugeben , wenn sie es in der SMS - Nachricht empfangen.

Melden Sie den Benutzer mit dem Bestätigungscode an

Nachdem der Benutzer der App mit dem Bestätigungscode aus der SMS - Nachricht liefert, unterzeichnet den Benutzer in durch die Schaffung eines FIRPhoneAuthCredential Objekts aus dem Bestätigungscode und Verifikation ID und vorbei , das Objekt zu signInWithCredential:completion: .

  1. Holen Sie sich den Bestätigungscode vom Benutzer.
  2. Erstellen Sie ein FIRPhoneAuthCredential Objekt aus dem Bestätigungscode und Überprüfung ID.

    Schnell

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

    Ziel c

    FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
        credentialWithVerificationID:verificationID
                    verificationCode:userInput];
  3. Anmeldung der Benutzer mit dem FIRPhoneAuthCredential Objekt:

    Schnell

    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
        // ...
    }

    Ziel 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;
      // ...
    }];

Test mit fiktiven Telefonnummern

Sie können über die Firebase-Konsole fiktive Telefonnummern für die Entwicklung einrichten. Das Testen mit fiktiven Telefonnummern bietet folgende Vorteile:

  • Testen Sie die Authentifizierung der Telefonnummer, ohne Ihr Nutzungskontingent zu verbrauchen.
  • Testen Sie die Authentifizierung der Telefonnummer, ohne eine tatsächliche SMS-Nachricht zu senden.
  • Führen Sie aufeinanderfolgende Tests mit derselben Telefonnummer durch, ohne gedrosselt zu werden. Dadurch wird das Risiko einer Ablehnung während des Überprüfungsprozesses im App Store minimiert, wenn der Prüfer zufällig dieselbe Telefonnummer zum Testen verwendet.
  • Testen Sie problemlos in Entwicklungsumgebungen ohne zusätzlichen Aufwand, z. B. die Möglichkeit, in einem iOS-Simulator oder einem Android-Emulator ohne Google Play-Dienste zu entwickeln.
  • Schreiben Sie Integrationstests, ohne durch Sicherheitsprüfungen blockiert zu werden, die normalerweise auf echte Telefonnummern in einer Produktionsumgebung angewendet werden.

Fiktive Telefonnummern müssen diese Anforderungen erfüllen:

  1. Stellen Sie sicher, dass Sie Telefonnummern verwenden, die tatsächlich fiktiv sind und noch nicht existieren. Firebase Authentication ermöglicht es Ihnen nicht, vorhandene Telefonnummern, die von echten Benutzern verwendet werden, als Testnummern festzulegen. Eine Option ist 555 Präfix Zahlen als US Test Telefonnummern zu verwenden, zum Beispiel: +1 650-555-3434
  2. Telefonnummern müssen hinsichtlich Länge und anderen Einschränkungen korrekt formatiert sein. Sie durchlaufen weiterhin dieselbe Überprüfung wie die Telefonnummer eines echten Benutzers.
  3. Sie können bis zu 10 Telefonnummern für die Entwicklung hinzufügen.
  4. Verwenden Sie schwer zu erratende Testtelefonnummern/Codes und ändern Sie diese häufig.

Erstelle fiktive Telefonnummern und Bestätigungscodes

  1. In der Firebase Konsole öffnen den Abschnitt Authentication.
  2. Im Zeichen in Verfahren Registerkarte, aktivieren Sie die Telefonanbieter , wenn Sie nicht bereits haben.
  3. Öffnen Sie die Telefonnummern für die Prüfung Akkordeon - Menü.
  4. Geben Sie die Telefonnummer , die Sie testen möchten, zum Beispiel: +1 650-555-3434.
  5. Geben Sie den 6-stelligen Bestätigungscode für die jeweilige Nummer, zum Beispiel: 654.321.
  6. Fügen Sie die Nummer. Bei Bedarf können Sie die Telefonnummer und ihren Code löschen, indem Sie mit der Maus über die entsprechende Zeile fahren und auf das Papierkorbsymbol klicken.

Manuelle Prüfung

Sie können direkt eine fiktive Telefonnummer in Ihrer Bewerbung verwenden. Auf diese Weise können Sie während der Entwicklungsphase manuelle Tests durchführen, ohne auf Kontingentprobleme oder Drosselung zu stoßen. Sie können auch direkt von einem iOS-Simulator oder Android-Emulator testen, ohne dass Google Play Services installiert ist.

Wenn Sie die fiktive Telefonnummer angeben und den Bestätigungscode senden, wird keine eigentliche SMS gesendet. Stattdessen müssen Sie den zuvor konfigurierten Bestätigungscode angeben, um die Anmeldung abzuschließen.

Nach Abschluss der Anmeldung wird ein Firebase-Benutzer mit dieser Telefonnummer erstellt. Der Benutzer hat dasselbe Verhalten und dieselben Eigenschaften wie ein echter Telefonnummernbenutzer und kann auf dieselbe Weise auf Realtime Database/Cloud Firestore und andere Dienste zugreifen. Der während dieses Vorgangs geprägte ID-Token hat die gleiche Signatur wie ein echter Telefonnummernbenutzer.

Eine weitere Möglichkeit ist eine Test Rolle festgelegt über benutzerdefinierte Ansprüche auf diesem Benutzer sie als gefälschten Benutzer zu unterscheiden , wenn Sie den Zugriff weiter einschränken mögen.

Integrationstests

Zusätzlich zu manuellen Tests bietet Firebase Authentication APIs, mit denen Sie Integrationstests für Telefonauthentifizierungstests schreiben können. Diese APIs deaktivieren die App-Überprüfung, indem sie die reCAPTCHA-Anforderung im Web und stille Push-Benachrichtigungen in iOS deaktivieren. Dies macht Automatisierungstests in diesen Flows möglich und einfacher zu implementieren. Darüber hinaus bieten sie die Möglichkeit, sofortige Überprüfungsabläufe auf Android zu testen.

Auf iOS - Geräten, die appVerificationDisabledForTesting hat Einstellung gesetzt werden TRUE vor dem Aufruf verifyPhoneNumber . Dies wird verarbeitet, ohne dass ein APNs-Token erforderlich ist oder im Hintergrund stille Push-Benachrichtigungen gesendet werden, was das Testen in einem Simulator erleichtert. Dadurch wird auch der reCAPTCHA-Fallback-Flow deaktiviert.

Beachten Sie, dass bei deaktivierter App-Bestätigung die Anmeldung mit einer nicht-fiktionalen Telefonnummer fehlschlägt. Mit dieser API können nur fiktive Telefonnummern verwendet werden.

Schnell

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
    }];
}];

Ziel 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;
    }];
}];

Anhang: Telefonische Anmeldung ohne Swizzling verwenden

Firebase Authentication verwendet Methodenumleitung, um automatisch das APNs-Token Ihrer App abzurufen, um die stillen Push-Benachrichtigungen zu verarbeiten, die Firebase an Ihre App sendet, und um die benutzerdefinierte Schemaweiterleitung von der reCAPTCHA-Verifizierungsseite während der Überprüfung automatisch abzufangen.

Wenn Sie nicht zu verwenden Swizzling bevorzugen, können Sie es deaktivieren , indem Sie die Flagge Hinzufügen FirebaseAppDelegateProxyEnabled zu Ihrer App Info.plist - Datei und der Einstellung NO . Beachten Sie, dass dieser Flag auf Einstellung NO deaktiviert auch für andere Produkte Firebase Swizzling, einschließlich Firebase Cloud Messaging.

Wenn Sie die Umleitung deaktivieren, müssen Sie das APNs-Gerätetoken, die Push-Benachrichtigungen und die Umleitungs-URL des benutzerdefinierten Schemas explizit an Firebase Authentication übergeben.

Um den APNs Gerät Token zu erhalten, implementieren die application:didRegisterForRemoteNotificationsWithDeviceToken: Methode, und darin, übergeben Sie das Gerät Token FIRAuth ‚s setAPNSToken:type: Methode.

Schnell

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
  // ...
}

Ziel 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.
}

Um Griff Push - Benachrichtigungen, in der application:didReceiveRemoteNotification:fetchCompletionHandler: Methode, die Prüfung für Firebase Auth bezogene Benachrichtigungen durch den Aufruf FIRAuth ‚s canHandleNotification: Methode.

Schnell

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, developer should handle it.
}

Ziel 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, developer should handle it.
}

Um die benutzerdefinierte Schema Umleitungs - URL zu behandeln, implementieren die application:openURL:sourceApplication:annotation: Verfahren für Geräte mit iOS 8 und älter, und die application:openURL:options: Verfahren für Geräte mit iOS 9 und höher, und in ihnen passieren die URL zu FIRAuth ‚s canHandleURL Methode.

Schnell

// For iOS 9+
func application(_ application: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  if Auth.auth().canHandle(url) {
    return true
  }
  // URL not auth related, developer should handle it.
}

// For iOS 8-
func application(_ application: UIApplication,
                 open url: URL,
                 sourceApplication: String?,
                 annotation: Any) -> Bool {
  if Auth.auth().canHandle(url) {
    Return true
  }
  // URL not auth related, developer should handle it.
}

Ziel c

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

// For iOS 8-
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
  if ([[FIRAuth auth] canHandleURL:url]) {
    return YES;
  }
  // URL not auth related, developer should handle it.
}

Wenn Sie SwiftUI oder verwenden UISceneDelegate , die Umleitungs - URL zu handhaben , implementieren die scene:openURLContexts: Methode, und in ihnen, übergeben Sie die URL zu FIRAuth ‚s canHandleURL Methode.

Schnell

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

Ziel c

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

Nächste Schritte

Nachdem sich ein Benutzer zum ersten Mal anmeldet, wird ein neues Benutzerkonto erstellt und mit den Anmeldeinformationen – d. h. Benutzername und Kennwort, Telefonnummer oder Authentifizierungsanbieterinformationen – verknüpft, mit denen sich der Benutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Benutzer in jeder App in Ihrem Projekt zu identifizieren, unabhängig davon, wie sich der Benutzer anmeldet.

  • In Ihren Anwendungen können Sie die Benutzerprofilgrundinformationen aus dem bekommen FIRUser Objekt. Siehe Benutzer verwalten .

  • In Ihrer Datenbank und Firebase Realtime Cloud Storage Sicherheitsregeln , können Sie die angemeldeten Nutzer die eindeutige Benutzer - ID aus der bekommen auth Variable, und es verwenden , um steuern kann ein Benutzer Zugriff , welche Daten.

Sie können Benutzer erlauben , durch mehrere Authentifizierungsanbieter anmelden, um Ihre App Verknüpfung Auth - Provider - Anmeldeinformationen zu einem vorhandenen Benutzerkonto.

Um einen Benutzer abzumelden, rufen signOut: .

Schnell

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

Ziel c

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

Möglicherweise möchten Sie auch einen Fehlerbehandlungscode für alle Authentifizierungsfehler hinzufügen. Siehe Handle Fehler .