ios - Gmail 身份验证未返回到应用程序

标签 ios swift firebase swift3 firebase-authentication

我已经使用 Firebase 实现了 gmail 登录,并且在按下具有操作 GIDSignIn.sharedInstance().signIn() 连接的自定义按钮后,我成功地能够让用户验证他的电子邮件。

但是,一旦用户允许基本配置文件访问,它就不会返回应用程序,它只会转到此屏幕:

login

有人知道如何在用户身份验证后让它返回到应用程序吗?这是我的控制台:

017-01-09 09:47:46.565367 Dog_Log[3922:829530] [MC] Reading from private effective user settings.
2017-01-09 09:47:53.702 Dog_Log[3922:] <FIRAnalytics/WARNING> Implementation of application:openURL:sourceApplication:annotation: not found. Please add the handler into your App Delegate. Class: Dog_Log.AppDelegate

最佳答案

问题:

警告告诉您无法找到 application(_:open:options:) 的实现:

2017-01-09 09:47:53.702 Dog_Log[3922:] <FIRAnalytics/WARNING> Implementation of application:openURL:sourceApplication:annotation: not found. Please add the handler into your App Delegate. Class: Dog_Log.AppDelegate

解决方案:

你可能忘记了要实现的application(_:open:options:)方法,调用了其中的handle(_:sourceApplication:annotation:),这处理重定向到您的应用程序。你的 AppDelegate.swift 应该是这样的(提示在代码注释中):

import UIKit
import Firebase
import GoogleSignIn

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?


  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // configure firebase
    FIRApp.configure()

    // configure google
    GIDSignIn.sharedInstance().clientID = FIRApp.defaultApp()?.options.clientID

    return true
  }

  func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

    // handled to go back to application after google log in
    let handled = GIDSignIn.sharedInstance().handle(url, sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: [:])

    return handled
  }

  // other methods
}

您制作的示例 ViewController 符合 GIDSignInUIDelegate 和 GIDSignInDelegate,以访问 signIn 方法并将其与自定义按钮的 @IBAction 一起使用:

import UIKit
import Firebase
import GoogleSignIn


class ViewController: UIViewController, GIDSignInUIDelegate, GIDSignInDelegate {

  override func viewDidLoad() {
    super.viewDidLoad()

    // make the view controller the delegate
    GIDSignIn.sharedInstance().uiDelegate = self
    GIDSignIn.sharedInstance().delegate = self
  }

  // your action of the button to call the signIn method
  @IBAction func pressGoogleSignInButton(_ sender: UIButton) {
    GIDSignIn.sharedInstance().signIn()
  }

  func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
    if let error = error {
      print("failed to log into google: ", error)
      return
    }

    print("successfully logged into google ", user)

    guard let idToken = user.authentication.idToken else { return }
    guard let accessToken = user.authentication.accessToken else { return }
    let credentials = FIRGoogleAuthProvider.credential(withIDToken: idToken, accessToken: accessToken)

    FIRAuth.auth()?.signIn(with: credentials, completion: { (user, error) in
      if let error = error {
        print("Faild to create a firebase user with google account: ", error)
        return
      }

      guard let uid = user?.uid else { return }
      print("Successfully logged into firebase with google ", uid)
      // redirect to the next screen after successful login

    })
  }
}

关于ios - Gmail 身份验证未返回到应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41553921/

相关文章:

ios - 在应用程序组之间共享数据不适用于真实设备,而是适用于模拟器

ios - 用于求解数字因数和显示的 Swift 应用程序

swift - 将边距设置为 Collection View 的单元格

ios - uiview 类型的值没有成员大小

iphone - 在 iPhone App 中创建倒数计时器

ios - 获取CALayer的贝塞尔路径

swift - 如何使用具有关联类型的协议(protocol)数组定义协议(protocol)

firebase - Firestore 规则 : Property is undefined on object

javascript - Firebase 等待响应

java - 应用程序在 Firebase 数据库 getinstance 上崩溃