数字到 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。这是一步一步的:
添加 FireBase 身份验证和身份验证 UI
pod 'Firebase/Auth', '~> 4.0.0' 和
pod 'FirebaseUI/Phone', '~> 4.0'
在 Appdelegate 文件注册推送通知,这是强制性的。 Google 首次验证的用户推送通知。
在 didRegisterForRemoteNotificationsWithDeviceToken
上添加此行:
Auth.auth().setAPNSToken(deviceToken, type:AuthAPNSTokenType.prod)//.sandbox for development
您还需要在 Firebase 控制台上设置 Google 通知
开启Phone登录按钮功能
var uiAuth = FUIAuth.defaultAuthUI() ;
uiAuth?.delegate = self;
var phoneVC = FUIPhoneAuth(authUI: uiAuth!)
uiAuth.providers = [phoneVC];
phoneVC.signIn(withPresenting: self)
实现委托功能
在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()之前注册通知。
有效
我一直在使用数字通过 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。这是一步一步的:
添加 FireBase 身份验证和身份验证 UI pod 'Firebase/Auth', '~> 4.0.0' 和 pod 'FirebaseUI/Phone', '~> 4.0'
在 Appdelegate 文件注册推送通知,这是强制性的。 Google 首次验证的用户推送通知。 在
didRegisterForRemoteNotificationsWithDeviceToken
上添加此行:Auth.auth().setAPNSToken(deviceToken, type:AuthAPNSTokenType.prod)//.sandbox for development
您还需要在 Firebase 控制台上设置 Google 通知
开启Phone登录按钮功能
var uiAuth = FUIAuth.defaultAuthUI() ; uiAuth?.delegate = self; var phoneVC = FUIPhoneAuth(authUI: uiAuth!) uiAuth.providers = [phoneVC]; phoneVC.signIn(withPresenting: self)
实现委托功能
在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()之前注册通知。 有效