我在 Doc 上做了任何事情,但是当我调用 GIDSignIn.sharedInstance().signIn() 时它崩溃了。

代码:

在 AppDelegate:

func configGoogleServer() {
    var configureError: NSError?
    GGLContext.sharedInstance().configureWithError(&configureError)
    assert(configureError == nil, "Error configuring Google services: \(configureError as Optional)")
    GIDSignIn.sharedInstance().delegate = self
}

在一些 View Controller :
GIDSignIn.sharedInstance().signIn()

我已经配置了像 com.googleusercontent.apps.598xxx...xxx 这样的 URL 方案。

崩溃截图:

iOS 谷歌登录失败-LMLPHP

调试区上没有任何显示...... :(

最佳答案

你把委托(delegate)放在 AppDelegate.swift 里面,这不是真的,你 AppDelegate 应该是这样的:

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

        // GOOGLE
        // Initialize sign-in
        var configureError: NSError?
        GGLContext.sharedInstance().configureWithError(&configureError)
        assert(configureError == nil, "Error configuring Google services: \(configureError)")

        // No delegate here

        return true
    }

func application(_ application: UIApplication,
                     open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        return GIDSignIn.sharedInstance().handle(url,
                                                 sourceApplication: sourceApplication,
                                                 annotation: annotation)
    }

@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
            if let sourceApplication = options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String {
                let annotation = options[UIApplicationOpenURLOptionsKey.annotation]
                return GIDSignIn.sharedInstance().handle(url,
                                                         sourceApplication: sourceApplication,
                                                         annotation: annotation)
            }

            return true
        }

然后将 SignIn Delegate 放在 YourViewController 中,发生登录操作:ư
    class YourViewController: UIViewController  {
         // something else....

         func doSignIn() {
                GIDSignIn.sharedInstance().delegate = self
                GIDSignIn.sharedInstance().uiDelegate = self
                GIDSignIn.sharedInstance().scopes = YOUR_GOOGLE_SCOPES

                if GIDSignIn.sharedInstance().hasAuthInKeychain() {
                    GIDSignIn.sharedInstance().signInSilently()
                } else {
                    GIDSignIn.sharedInstance().signIn()
                }

          }
    }

extension YourViewController: GIDSignInDelegate, GIDSignInUIDelegate {
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!,
              withError error: Error!) {
        if let error = error {
            self.showMessage("Authentication Error", type: .error)
            self.service.authorizer = nil
        } else {
            self.service.authorizer = user.authentication.fetcherAuthorizer()
            // PUT YOUR METHOD AFTER SIGNED-IN HERE
        }
    }
}

关于iOS 谷歌登录失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44652429/

10-10 21:07