Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Xác thực với Firebase trên iOS bằng Số điện thoại

Bạn có thể sử dụng Xác thực Firebase để đăng nhập người dùng bằng cách gửi tin nhắn SMS đến điện thoại của người dùng. Người dùng đăng nhập bằng mã một lần có trong tin nhắn SMS.

Cách dễ nhất để thêm số điện thoại đăng nhập để ứng dụng của bạn là sử dụng FirebaseUI , trong đó bao gồm một thả trong đăng nhập widget mà cụ đăng nhập dòng cho số điện thoại đăng nhập, cũng như dựa trên mật khẩu và dấu hiệu liên -trong. Tài liệu này mô tả cách triển khai quy trình đăng nhập số điện thoại bằng SDK Firebase.

Trước khi bắt đầu

  1. Thêm căn cứ hỏa lực cho dự án iOS của bạn .
  2. Bao gồm vỏ sau trong bạn Podfile :
    pod 'Firebase/Auth'
    
  3. Nếu bạn chưa kết nối với ứng dụng của bạn để dự án căn cứ hỏa lực của bạn, làm như vậy từ các căn cứ hỏa lực console .

Lo ngại về bảo mật

Việc xác thực chỉ bằng một số điện thoại, mặc dù thuận tiện, nhưng lại kém an toàn hơn các phương pháp có sẵn khác, vì việc sở hữu một số điện thoại có thể dễ dàng được chuyển giữa những người dùng. Ngoài ra, trên các thiết bị có nhiều hồ sơ người dùng, bất kỳ người dùng nào có thể nhận tin nhắn SMS đều có thể đăng nhập vào tài khoản bằng số điện thoại của thiết bị.

Nếu bạn sử dụng đăng nhập dựa trên số điện thoại trong ứng dụng của mình, bạn nên cung cấp nó cùng với các phương pháp đăng nhập an toàn hơn và thông báo cho người dùng về sự cân bằng bảo mật của việc sử dụng đăng nhập bằng số điện thoại.

Bật đăng nhập bằng Số điện thoại cho dự án Firebase của bạn

Để đăng nhập người dùng bằng SMS, trước tiên bạn phải bật phương thức đăng nhập Số điện thoại cho dự án Firebase của mình:

  1. Trong căn cứ hỏa lực console , hãy mở phần xác thực.
  2. Trên Đăng trong Phương pháp trang, cho phép số điện thoại đăng nhập phương pháp.

Hạn ngạch yêu cầu đăng nhập số điện thoại của Firebase đủ cao để hầu hết các ứng dụng sẽ không bị ảnh hưởng. Tuy nhiên, nếu bạn cần một lượng lớn người dùng đăng nhập bằng xác thực điện thoại, bạn có thể cần phải nâng cấp gói định giá của mình. Xem giá trang.

Bật xác minh ứng dụng

Để sử dụng xác thực số điện thoại, Firebase phải có thể xác minh rằng các yêu cầu đăng nhập bằng số điện thoại đến từ ứng dụng của bạn. Có hai cách Xác thực Firebase thực hiện điều này:

  • Thông báo im lặng APN: Khi bạn đăng nhập vào một người dùng với số điện thoại của họ lần đầu tiên trên một thiết bị, căn cứ hỏa lực xác thực gửi một mã thông báo đến thiết bị sử dụng một thông báo push im lặng. Nếu ứng dụng của bạn nhận thành công thông báo từ Firebase, thì quá trình đăng nhập bằng số điện thoại có thể tiến hành.

    Đối với iOS 8.0 trở lên, thông báo im lặng không yêu cầu sự đồng ý rõ ràng của người dùng và do đó không bị ảnh hưởng bởi người dùng từ chối nhận thông báo APN trong ứng dụng. Do đó, ứng dụng không cần yêu cầu quyền của người dùng để nhận thông báo đẩy khi triển khai xác thực số điện thoại Firebase.

  • xác minh reCAPTCHA: Trong trường hợp khi gửi hoặc nhận được thông báo đẩy im lặng là không thể, chẳng hạn như khi người dùng có refresh background tàn tật cho ứng dụng của bạn, hoặc khi kiểm tra ứng dụng của bạn trên một mô phỏng iOS, căn cứ hỏa lực xác thực sử dụng xác minh reCAPTCHA để hoàn thành điện thoại quy trình đăng nhập. Thử thách reCAPTCHA thường có thể được hoàn thành mà người dùng không cần phải giải quyết bất cứ điều gì.

Khi thông báo đẩy im lặng được định cấu hình đúng cách, chỉ một tỷ lệ rất nhỏ người dùng sẽ trải nghiệm luồng reCAPTCHA. Tuy nhiên, bạn nên đảm bảo rằng đăng nhập số điện thoại hoạt động chính xác cho dù có thông báo đẩy im lặng hay không.

Bắt đầu nhận thông báo im lặng

Để bật thông báo APN để sử dụng với Xác thực Firebase:

  1. Trong Xcode, cho phép thông báo đẩy cho dự án của bạn.
  2. Tải khóa xác thực APN của bạn lên Firebase. Nếu bạn chưa có một chìa khóa APN xác thực, hãy chắc chắn để tạo ra một trong những nhà phát triển của Apple Trung tâm thành viên .

    1. Bên trong dự án của bạn trong căn cứ hỏa lực console, chọn biểu tượng bánh răng, chọn Cài đặt dự án, và sau đó chọn tab Cloud Messaging.

    2. Trong chính xác thực APN theo cấu hình ứng dụng iOS, nhấp vào nút Upload.

    3. Duyệt đến vị trí mà bạn đã lưu chìa khóa của bạn, chọn nó và nhấn Open. Thêm ID key cho phím (có sẵn trong các nhà phát triển của Apple Trung tâm thành viên ) và nhấn Upload.

    Nếu bạn đã có chứng chỉ APN, bạn có thể tải chứng chỉ lên để thay thế.

Thiết lập xác minh reCAPTCHA

Để bật SDK Firebase sử dụng xác minh reCAPTCHA:

  1. Thêm lược đồ URL tùy chỉnh vào dự án Xcode của bạn:
    1. Mở cấu hình dự án của bạn: bấm đúp vào tên dự án trong chế độ xem dạng cây bên trái. Chọn ứng dụng của bạn từ phần MỤC TIÊU, sau đó chọn tab Info, và mở rộng phần loại URL.
    2. Nhấp vào nút +, và thêm một thức truy cập URL cho ID khách hàng đảo ngược của bạn. Để tìm giá trị này, mở GoogleService-Info.plist tập tin cấu hình, và nhìn cho REVERSED_CLIENT_ID then chốt. Sao chép giá trị của key đó, và dán nó vào URL Schemes hộp tìm kiếm trên trang cấu hình. Để trống các trường khác.

      Khi hoàn tất, cấu hình của bạn sẽ trông giống như sau (nhưng với các giá trị dành riêng cho ứng dụng của bạn):

  2. Tùy chọn: Nếu bạn muốn tùy chỉnh cách trình bày ứng dụng của bạn SFSafariViewController hoặc UIWebView khi hiển thị reCAPTCHA cho người dùng, tạo ra một lớp tùy chỉnh mà phù hợp với những FIRAuthUIDelegate giao thức, và vượt qua nó để verifyPhoneNumber:UIDelegate:completion: .

Gửi mã xác minh đến điện thoại của người dùng

Để bắt đầu số điện thoại đăng nhập, trình bày cho người dùng một giao diện mà nhắc nhở họ phải cung cấp số điện thoại của họ, và sau đó gọi verifyPhoneNumber:UIDelegate:completion: để yêu cầu căn cứ hỏa lực gửi mã xác thực vào điện thoại của người dùng bằng tin nhắn SMS:

  1. Lấy số điện thoại của người dùng.

    Các yêu cầu pháp lý khác nhau, nhưng là phương pháp hay nhất và để đặt kỳ vọng cho người dùng của bạn, bạn nên thông báo cho họ rằng nếu họ sử dụng đăng nhập bằng điện thoại, họ có thể nhận được tin nhắn SMS để xác minh và áp dụng mức phí tiêu chuẩn.

  2. Gọi verifyPhoneNumber:UIDelegate:completion: , đi qua nó số điện thoại của người dùng.

    Nhanh

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

    Khi bạn gọi verifyPhoneNumber:UIDelegate:completion: , căn cứ hỏa lực sẽ gửi một thông báo push im lặng để ứng dụng của bạn, hoặc các vấn đề một thách thức reCAPTCHA cho người dùng. Sau khi ứng dụng của bạn nhận được thông báo hoặc người dùng hoàn thành thử thách reCAPTCHA, Firebase sẽ gửi tin nhắn SMS chứa mã xác thực đến số điện thoại được chỉ định và chuyển ID xác minh cho chức năng hoàn thành của bạn. Bạn sẽ cần cả mã xác minh và ID xác minh để đăng nhập người dùng.

    Các tin nhắn SMS gửi bởi căn cứ hỏa lực cũng có thể được định vị bằng cách xác định ngôn ngữ auth qua languageCode tài sản trên dụ Auth của bạn.

    Nhanh

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

    Objective-C

     // Change language code to french.
     [FIRAuth auth].languageCode = @"fr";
    
  3. Lưu ID xác minh và khôi phục nó khi ứng dụng của bạn tải. Bằng cách đó, bạn có thể đảm bảo rằng bạn vẫn có ID xác minh hợp lệ nếu ứng dụng của bạn bị chấm dứt trước khi người dùng hoàn tất quy trình đăng nhập (ví dụ: khi chuyển sang ứng dụng SMS).

    Bạn có thể duy trì ID xác minh theo bất kỳ cách nào bạn muốn. Một cách đơn giản là để lưu các ID xác minh với NSUserDefaults đối tượng:

    Nhanh

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

    Objective-C

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

    Sau đó, bạn có thể khôi phục giá trị đã lưu:

    Nhanh

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

    Objective-C

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

Nếu cuộc gọi đến verifyPhoneNumber:UIDelegate:completion: thành công, bạn có thể nhắc nhở người dùng nhập mã xác minh khi họ nhận được nó trong tin nhắn SMS.

Đăng nhập người dùng bằng mã xác minh

Sau khi người dùng cung cấp cho ứng dụng của bạn với mã xác minh từ các tin nhắn SMS, đăng ký người sử dụng trong bằng cách tạo một FIRPhoneAuthCredential đối tượng từ mã xác minh và ID xác minh và thông qua đối tượng đó để signInWithCredential:completion: .

  1. Nhận mã xác minh từ người dùng.
  2. Tạo một FIRPhoneAuthCredential đối tượng từ mã xác minh và ID xác minh.

    Nhanh

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

    Objective-C

    FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
        credentialWithVerificationID:verificationID
                    verificationCode:userInput];
  3. Đăng nhập người dùng với FIRPhoneAuthCredential đối tượng:

    Nhanh

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

Thử nghiệm với số điện thoại hư cấu

Bạn có thể thiết lập số điện thoại hư cấu để phát triển thông qua bảng điều khiển Firebase. Thử nghiệm với số điện thoại hư cấu mang lại những lợi ích sau:

  • Kiểm tra xác thực số điện thoại mà không tiêu tốn hạn ngạch sử dụng của bạn.
  • Kiểm tra xác thực số điện thoại mà không cần gửi tin nhắn SMS thực tế.
  • Chạy các bài kiểm tra liên tiếp với cùng một số điện thoại mà không bị hạn chế. Điều này giảm thiểu nguy cơ bị từ chối trong quá trình đánh giá App Store nếu người đánh giá tình cờ sử dụng cùng một số điện thoại để thử nghiệm.
  • Kiểm tra dễ dàng trong môi trường phát triển mà không cần thêm bất kỳ nỗ lực nào, chẳng hạn như khả năng phát triển trong trình mô phỏng iOS hoặc trình mô phỏng Android mà không cần Dịch vụ của Google Play.
  • Viết các bài kiểm tra tích hợp mà không bị chặn bởi các kiểm tra bảo mật thường được áp dụng trên các số điện thoại thực trong môi trường sản xuất.

Số điện thoại hư cấu phải đáp ứng các yêu cầu sau:

  1. Đảm bảo rằng bạn sử dụng số điện thoại thực sự là hư cấu và không tồn tại. Xác thực Firebase không cho phép bạn đặt các số điện thoại hiện có được người dùng thực sử dụng làm số thử nghiệm. Một lựa chọn là sử dụng 555 số tiền tố như số điện thoại thử nghiệm của Mỹ, ví dụ: +1 650-555-3434
  2. Số điện thoại phải được định dạng chính xác về độ dài và các ràng buộc khác. Họ vẫn sẽ trải qua quá trình xác thực giống như số điện thoại của người dùng thực.
  3. Bạn có thể thêm tối đa 10 số điện thoại để phát triển.
  4. Sử dụng số điện thoại / mã kiểm tra khó đoán và thay đổi chúng thường xuyên.

Tạo số điện thoại hư cấu và mã xác minh

  1. Trong căn cứ hỏa lực console , hãy mở phần xác thực.
  2. Trong Đăng nhập tab phương pháp, cho phép các nhà cung cấp điện thoại nếu bạn chưa có.
  3. Mở Số điện thoại để thử nghiệm đơn accordion.
  4. Cung cấp số điện thoại bạn muốn kiểm tra, ví dụ: +1 650-555-3434.
  5. Cung cấp mã xác minh 6 chữ số cho rằng con số cụ thể, ví dụ: 654321.
  6. Thêm số. Nếu có nhu cầu, bạn có thể xóa số điện thoại và mã của nó bằng cách di chuột qua hàng tương ứng và nhấp vào biểu tượng thùng rác.

Kiểm tra bằng tay

Bạn có thể trực tiếp bắt đầu sử dụng một số điện thoại hư cấu trong ứng dụng của mình. Điều này cho phép bạn thực hiện kiểm tra thủ công trong các giai đoạn phát triển mà không gặp phải các vấn đề về hạn ngạch hoặc điều chỉnh. Bạn cũng có thể kiểm tra trực tiếp từ trình mô phỏng iOS hoặc trình mô phỏng Android mà không cần cài đặt Dịch vụ của Google Play.

Khi bạn cung cấp số điện thoại hư cấu và gửi mã xác minh, không có tin nhắn SMS thực tế nào được gửi. Thay vào đó, bạn cần cung cấp mã xác minh đã định cấu hình trước đó để hoàn tất đăng nhập.

Khi hoàn tất đăng nhập, người dùng Firebase được tạo bằng số điện thoại đó. Người dùng có hành vi và thuộc tính giống như người dùng số điện thoại thực và có thể truy cập Cơ sở dữ liệu thời gian thực / Cloud Firestore và các dịch vụ khác theo cách tương tự. Mã thông báo ID được tạo ra trong quá trình này có chữ ký giống như người dùng số điện thoại thực.

Một lựa chọn khác là để thiết lập một vai trò kiểm tra thông qua tuyên bố tùy chỉnh trên những người sử dụng để phân biệt họ làm người dùng giả nếu bạn muốn hạn chế hơn nữa quyền truy cập.

Thử nghiệm hội nhập

Ngoài kiểm tra thủ công, Xác thực Firebase cung cấp các API để giúp viết các bài kiểm tra tích hợp để kiểm tra xác thực điện thoại. Các API này vô hiệu hóa xác minh ứng dụng bằng cách tắt yêu cầu reCAPTCHA trong web và thông báo đẩy im lặng trong iOS. Điều này làm cho việc kiểm tra tự động hóa có thể thực hiện được trong các luồng này và dễ dàng thực hiện hơn. Ngoài ra, chúng còn giúp cung cấp khả năng kiểm tra các luồng xác minh tức thì trên Android.

Trên iOS, appVerificationDisabledForTesting thiết lập phải được thiết lập để TRUE trước khi gọi verifyPhoneNumber . Điều này được xử lý mà không yêu cầu bất kỳ mã thông báo APN nào hoặc gửi thông báo đẩy im lặng trong nền, giúp kiểm tra trong trình mô phỏng dễ dàng hơn. Điều này cũng vô hiệu hóa quy trình dự phòng reCAPTCHA.

Lưu ý rằng khi tính năng xác minh ứng dụng bị tắt, việc sử dụng số điện thoại không phải hư cấu sẽ không thể hoàn tất quá trình đăng nhập. Chỉ có thể sử dụng số điện thoại hư cấu với API này.

Nhanh

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

Phụ lục: Sử dụng đăng nhập bằng điện thoại mà không bị xáo trộn

Xác thực Firebase sử dụng phương pháp swizzling để tự động lấy mã thông báo APN của ứng dụng của bạn, để xử lý các thông báo đẩy im lặng mà Firebase gửi đến ứng dụng của bạn và để tự động chặn chuyển hướng lược đồ tùy chỉnh từ trang xác minh reCAPTCHA trong quá trình xác minh.

Nếu bạn không muốn sử dụng swizzling, bạn có thể vô hiệu hóa nó bằng cách thêm cờ FirebaseAppDelegateProxyEnabled đến file Info.plist của ứng dụng của bạn và đặt nó vào NO . Lưu ý rằng thiết lập cờ này để NO cũng vô hiệu hóa swizzling cho sản phẩm căn cứ hỏa lực khác, trong đó có căn cứ hỏa lực Cloud Messaging.

Nếu bạn tắt swizzling, bạn phải chuyển rõ ràng mã thông báo thiết bị APN, thông báo đẩy và URL chuyển hướng lược đồ tùy chỉnh đến Xác thực Firebase.

Để có được APN thiết bị token, thực hiện các application:didRegisterForRemoteNotificationsWithDeviceToken: phương pháp, và trong đó, vượt qua các thiết bị token để FIRAuth 's setAPNSToken:type: phương pháp.

Nhanh

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

Để thông báo xử lý đẩy, trong application:didReceiveRemoteNotification:fetchCompletionHandler: phương pháp, kiểm tra đối với căn cứ hỏa lực auth thông báo có liên quan bằng cách gọi FIRAuth 's canHandleNotification: phương pháp.

Nhanh

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

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

Để xử lý các URL chuyển hướng chương trình tùy chỉnh, thực hiện các application:openURL:sourceApplication:annotation: phương pháp cho các thiết bị chạy iOS 8 tuổi trở lên, và các application:openURL:options: phương pháp cho các thiết bị chạy iOS 9 và mới hơn, và trong đó, vượt qua URL để FIRAuth 's canHandleURL phương pháp.

Nhanh

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

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

Nếu bạn đang sử dụng SwiftUI hoặc UISceneDelegate , để xử lý các URL chuyển hướng, thực hiện các scene:openURLContexts: phương pháp, và trong đó, vượt qua URL để FIRAuth 's canHandleURL phương pháp.

Nhanh

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

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

Bước tiếp theo

Sau khi người dùng đăng nhập lần đầu tiên, tài khoản người dùng mới sẽ được tạo và liên kết với thông tin đăng nhập — nghĩa là tên người dùng và mật khẩu, số điện thoại hoặc thông tin nhà cung cấp xác thực — người dùng đã đăng nhập bằng. Tài khoản mới này được lưu trữ như một phần của dự án Firebase của bạn và có thể được sử dụng để xác định người dùng trên mọi ứng dụng trong dự án của bạn, bất kể người dùng đăng nhập bằng cách nào.

  • Trong các ứng dụng của bạn, bạn có thể nhận được thông tin hồ sơ cơ bản của người dùng từ các FIRUser đối tượng. Xem Quản lý người dùng .

  • Trong Cơ sở dữ liệu căn cứ hỏa lực Realtime của bạn và lưu trữ đám mây Security Rules , bạn có thể nhận được đã đăng nhập của người sử dụng ID người dùng duy nhất từ auth biến, và sử dụng nó để kiểm soát dữ liệu người dùng có thể truy cập.

Bạn có thể cho phép người dùng đăng nhập vào ứng dụng của bạn sử dụng nhiều nhà cung cấp chứng thực bởi liên kết auth thông tin cung cấp cho một tài khoản người dùng hiện có.

Đăng xuất khỏi một người sử dụng, hãy gọi signOut: .

Nhanh

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

Bạn cũng có thể muốn thêm mã xử lý lỗi cho đầy đủ các lỗi xác thực. Xem lỗi Xử lý .