web-dev-qa-db-ja.com

電話番号を使用したFirebase Authが内部エラーを返す

Apple通知をfirebaseを使用して送信できるようにアプリを設定し、コンソールを使用して通知が機能することを確認しました。APNの上に構築された電話認証を実行したいと思います。

だから私はこれを書いた:

PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber) { verificationID, error in
  if error != nil {
    print("Verification code not sent \(error!)")
  } else {
    print ("Successful.")
  }

そして私は得る:

Error Domain=FIRAuthErrorDomain Code=17999 "An internal error has occurred, print and inspect the error details for more information." UserInfo={NSUnderlyingError=0x170046db0 {Error Domain=FIRAuthInternalErrorDomain Code=3 "(null)" UserInfo={FIRAuthErrorUserInfoDeserializedResponseKey={
    code = 500;
    message = "<null>";
}}}, error_name=ERROR_INTERNAL_ERROR, NSLocalizedDescription=An internal error has occurred, print and inspect the error details for more information.}

何か案が? firebaseに対してバグを報告する必要がありますか?

IOS SDK 4.0.0を使用しています(最新のZipが見つかりました)。

更新:

info.plistFirebaseAppDelegateProxyEnabledを追加してメソッドのスウィズリングを無効にし、NOに設定しました

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

最新のFirebase iOS SDK i.e. 4.0.およびXcode 8.でテスト済み

まず、このキーFirebaseAppDelegateProxyEnabledをinfo.plistから削除します。これは必要ありません。

AppDelegate.Swiftに次の関数を追加します

import Firebase
import UserNotifications

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate , UNUserNotificationCenterDelegate{
    var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        if #available(iOS 10.0, *) {
            // For iOS 10 display notification (sent via APNS)
            UNUserNotificationCenter.current().delegate = self
            let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
            UNUserNotificationCenter.current().requestAuthorization(
                options: authOptions,
                completionHandler: {_, _ in })
        } else {
            let settings: UIUserNotificationSettings =
                UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
            application.registerUserNotificationSettings(settings)
        }

        application.registerForRemoteNotifications()
        FirebaseApp.configure()
        return true
    }
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // Pass device token to auth.
    let firebaseAuth = Auth.auth()

    //At development time we use .sandbox
    firebaseAuth.setAPNSToken(deviceToken, type: AuthAPNSTokenType.sandbox)

    //At time of production it will be set to .prod
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    let firebaseAuth = Auth.auth()

    if (firebaseAuth.canHandleNotification(userInfo)){
        print(userInfo)
        return
    }
}*

ユーザーの電話に確認コードを送信します:

電話認証を統合するクラスで、次のように記述します。

:インドの国コードとして+91を追加しました。地域に応じて国コードを追加できます。

 PhoneAuthProvider.provider().verifyPhoneNumber("+919876543210") { (verificationID, error) in
       if ((error) != nil) {
             // Verification code not sent.
             print(error)
       } else {
              // Successful. User gets verification code 
              // Save verificationID in UserDefaults
             UserDefaults.standard.set(verificationID, forKey: "firebase_verification")
             UserDefaults.standard.synchronize()
             //And show the Screen to enter the Code.
       }               

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

 let verificationID = UserDefaults.standard.value(forKey: "firebase_verification")
 let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID! as! String, verificationCode: self.txtEmailID.text!)

   Auth.auth().signIn(with: credential, completion: {(_ user: User, _ error: Error?) -> Void in
         if error != nil {
            // Error
          }else {
             print("Phone number: \(user.phoneNumber)")
              var userInfo: Any? = user.providerData[0]
                    print(userInfo)
                }
         } as! AuthResultCallback)
8
Arpit Jain

XcodeのApp Bundle IDがFirebaseのバンドルID exactlyと一致することを再確認します。そしてexactlyによって、大文字と小文字が一致することを確認します。Xcodeは、バンドルIDのアプリ名部分にデフォルトで大文字と小文字が混在することを好みます。

XcodeでバンドルIDを変更する場合は、Xcodeで新しいプロファイルを生成する前に、アプリのプロビジョニングプロファイルを手動で削除してください。そうしないと、繰り返し失敗します(Appleはプロファイル名の大文字と小文字を無視しているようです)。

2
mmorrison

私の場合、間違っていたのはapnsトークンタイプでした。

Auth.auth().setAPNSToken(deviceToken, type: AuthAPNSTokenType.prod)

になるはずだった:

Auth.auth().setAPNSToken(deviceToken, type: AuthAPNSTokenType.sandbox)
2
fede1608

まあ、私の場合、私は間違って送信していますself.verificationIDからFIRAuthCredentialへ。このエラーが発生している場合は、verificationIDを印刷して、FIRAuthCredentialに送信しているものと同じであることを確認してください。

objCのコードは次のとおりです。

[[FIRPhoneAuthProvider provider] verifyPhoneNumber:self.phoneNumberTextField.text
                                            UIDelegate:nil
                                            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
                                                if (error) {
                                                    NSLog(@"error %@", error.localizedDescription);
                                                    return;
                                                }
                                                NSLog(@"verificationID %@", verificationID);
                                                self.verificationID = [NSString stringWithFormat:@"%@", verificationID];

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

                                                // Sign in using the verificationID and the code sent to the user
                                                // ...
                                            }];

間違った確認IDをここに誤って送信しました:

self.verificationID = [NSString stringWithFormat:@"verificationID",];

正しいのはこれです:

self.verificationID = [NSString stringWithFormat:@"%@", verificationID];

そして、次のようにFIRAuthCredentialに送信します。

FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
                                     credentialWithVerificationID:self.verificationID
                                     verificationCode:self.pinCodeTextField.text];

    [[FIRAuth auth] signInWithCredential:credential
                              completion:^(FIRUser *user, NSError *error) {
                                  if (error) {
                                      NSLog(@"error %@", error);
                                      return;
                                  }
                                  NSLog(@"Success");
                                  // User successfully signed in. Get user data from the FIRUser object
                                  // ...
                              }];

これはsuccessを正常に返します。それが他の人に役立つことを願っています。

0
Tulon