数字到 firebase 迁移 iOS Phone 数字输入

Digits to firebase migration iOS Phone number input

我一直在使用数字通过 phone 号码登录。我必须迁移到 firebase,但有几件事让我感到困惑:

我的流程是: 1) 用户通过 phone 号码点击自定义按钮登录,该号码有操作

@IBAction func loginViaDigits(_ sender: AnyObject) {
    let digits = Digits.sharedInstance()
    let configuration = DGTAuthenticationConfiguration(accountFields: .defaultOptionMask)
    configuration?.phoneNumber = "+44"
    digits.authenticate(with: self.navigationController, configuration: configuration!) { session, error in
        if error == nil {
            let digits = Digits.sharedInstance()
            let oauthSigning = DGTOAuthSigning(authConfig:digits.authConfig, authSession:digits.session())
            let authHeaders = oauthSigning?.oAuthEchoHeadersToVerifyCredentials()
            self.startActivityIndicator()
            NetworkApiCall(apiRequest: SignInApiRequest(digits_auth: authHeaders as! [NSObject : AnyObject])).run() { (result: SignInApiResponse?, error: NSError?) in
                if error != nil {
                    self.stopActivityIndicator()
                    UIUtils.showInfoAlert("Some error occurred!", controller: self)
                    return;
                }

                guard let response = result else {
                    self.stopActivityIndicator()
                    UIUtils.showInfoAlert("Some error occurred!", controller: self)
                    return;
                }

                ...
        }
    }
}

2) 基本上,用户通过 phone 数字按钮点击登录,数字显示他们获取 phone 号码的弹出窗口,然后他们要求验证码,完成后,我会得到我的回调方法中的 oauth 参数,我将它们传递到我的服务器。

我的问题是: 1) 我是否需要自己构建 phone 数字输入和验证码输入屏幕,或者 firebase 像数字一样提供它们?

2) 如果有人已经实际迁移过这种流程,一些指点会很有帮助。

根据 Lazy King 的建议,我正在尝试使用 FirebaseAuthUI,但我的 AppDelegate 似乎缺少某些功能:

我的 AppDelegate 针对 Firebase 的更改:

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

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

但我仍然不断收到此错误: 错误域=FIRAuthErrorDomain 代码=17054 "If app delegate swizzling is disabled, remote notifications received by UIApplicationDelegate need to be forwarded to FIRAuth's canHandleNotificaton: method."

您可以使用 FirebaseAuth UI 或设计自己的 UI。对于我的一个项目,我使用了 FirebaseAuth UI。这是一步一步的:

  1. 添加 FireBase 身份验证和身份验证 UI pod 'Firebase/Auth', '~> 4.0.0' 和 pod 'FirebaseUI/Phone', '~> 4.0'

  2. 在 Appdelegate 文件注册推送通知,这是强制性的。 Google 首次验证的用户推送通知。 在 didRegisterForRemoteNotificationsWithDeviceToken 上添加此行:

    Auth.auth().setAPNSToken(deviceToken, type:AuthAPNSTokenType.prod)//.sandbox for development
    
  3. 您还需要在 Firebase 控制台上设置 Google 通知

  4. 开启Phone登录按钮功能

    var uiAuth = FUIAuth.defaultAuthUI() ;
    
    uiAuth?.delegate = self;
    var phoneVC = FUIPhoneAuth(authUI: uiAuth!)
    
    uiAuth.providers = [phoneVC];
    phoneVC.signIn(withPresenting: self)
    
  5. 实现委托功能

  6. 在Appdelegate接收通知函数添加代码

     if Auth.auth().canHandleNotification(userInfo) {
        completionHandler(UIBackgroundFetchResult.noData)
        return
    }
    

如果您使用 iOS 10 或更高版本,则

@available(iOS 10.0, *)
internal func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

    let userInfo = response.notification.request.content.userInfo
    if Auth.auth().canHandleNotification(userInfo) {
        completionHandler()
        return
    }

    completionHandler()
}

希望它能奏效。

请在Firebase.configure()之前注册通知。 有效