gpt4 book ai didi

ios - 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序 - ios google 登录

转载 作者:搜寻专家 更新时间:2023-11-01 05:47:39 24 4
gpt4 key购买 nike

我正在实现取自本教程的 google 登录过程 https://developers.google.com/identity/sign-in/ios/sign-in?configured=true&ver=swift

正如我所见,作者写道:

In these examples, the view controller is a subclass of UIViewController. If, in your project, the class that implements GIDSignInUIDelegate is not a subclass of UIViewController, implement the signInWillDispatch:error:, signIn:presentViewController:, and signIn:dismissViewController: methods of the GIDSignInUIDelegate protocol.

所以我按照他的建议写了如下:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate {



func application(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Initialize sign-in
var configureError: NSError?
GGLContext.sharedInstance().configureWithError(&configureError)
assert(configureError == nil, "Error configuring Google services: \(configureError)")

GIDSignIn.sharedInstance().delegate = self

return true
}

// [START openurl]
func application(application: UIApplication,
openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
return GIDSignIn.sharedInstance().handleURL(url,
sourceApplication: sourceApplication,
annotation: annotation)
}
// [END openurl]

@available(iOS 9.0, *)
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
return GIDSignIn.sharedInstance().handleURL(url,
sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String?,
annotation: options[UIApplicationOpenURLOptionsAnnotationKey])
}

// [START signin_handler]
func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!,
withError error: NSError!) {
if (error == nil) {
print("Signed in!")
} else {
print("\(error.localizedDescription)")
}
}
// [END signin_handler]

// [START disconnect_handler]
func signIn(signIn: GIDSignIn!, didDisconnectWithUser user:GIDGoogleUser!,
withError error: NSError!) {
// Perform any operations when the user disconnects from app here.
// [START_EXCLUDE]
NSNotificationCenter.defaultCenter().postNotificationName(
"ToggleAuthUINotification",
object: nil,
userInfo: ["statusText": "User has disconnected."])
// [END_EXCLUDE]
}

我还有一个名为 LoginScreen.swift 的类,其中包含:

import UIKit

class LoginScreen: UIViewController, GIDSignInUIDelegate {

override func viewDidLoad() {
super.viewDidLoad()
GIDSignIn.sharedInstance().uiDelegate = self

// Uncomment to automatically sign in the user.
GIDSignIn.sharedInstance().signInSilently()

}

override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
GIDSignIn.sharedInstance().uiDelegate = self

GIDSignIn.sharedInstance().signInSilently()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

func signInWillDispatch(signIn: GIDSignIn!, error: NSError!) {
print("Nothing!")
}

// Present a view that prompts the user to sign in with Google
func signIn(signIn: GIDSignIn!,
presentViewController viewController: UIViewController!) {
self.presentViewController(viewController, animated: true, completion: nil)
}

// Dismiss the "Sign in with Google" view
func signIn(signIn: GIDSignIn!,
dismissViewController viewController: UIViewController!) {
self.dismissViewControllerAnimated(true, completion: nil)
}


}

当我运行该应用程序时,我看到按钮 sign in with google。但是当我点击它时,我看到了错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: 'When |allowsSignInWithWebView| is enabled, uiDelegate must
either be a |UIViewController| or implement the
|signIn:presentViewController:| and |signIn:dismissViewController:|
methods from |GIDSignInUIDelegate|.'

这里有什么问题?我以为我包含了必要的方法...

============ 编辑 - 作为@emrys57 问题的跟进:

我的项目中附有 GoogleService-Info.plist 文件:

enter image description here

当我注释掉 3 种方法(presentViewControllerdismissViewControllersignInWillDispatch)时,没有任何变化 - 我仍然遇到相同的错误。 .

关于屏幕 - 这是我的 Storyboard的样子:

enter image description here

我想在第三个屏幕上显示谷歌登录按钮。

此处的第二个屏幕包含一个教程,其代码目前如下:

import UIKit

class Tutorial: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
let background = CAGradientLayer().greenBlue()
background.frame = self.view.bounds
self.view.layer.insertSublayer(background, atIndex: 0)
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

}

还有一件事 - 当我打开应用程序时,我现在看到了谷歌登录按钮:

enter image description here

当我点击它时 - 我得到了提到的错误:

2016-02-13 09:47:49.578 myapp[20870:800499] *** Terminating app due
to uncaught exception 'NSInvalidArgumentException', reason: 'When
|allowsSignInWithWebView| is enabled, uiDelegate must either be a
|UIViewController| or implement the |signIn:presentViewController:| and
|signIn:dismissViewController:| methods from |GIDSignInUIDelegate|.'

*** First throw call stack:
(...)

所以我猜当我按下按钮时 LoginScreen 正在运行...

=========== 另一个编辑:

当我将代码从 LoginScreen 复制到类 ViewController 并在其中添加按钮时 - 一切正常,我看到一个谷歌登录按钮,我可以登录!但是 - 该按钮出现在应用程序的第一个屏幕上,这不是我想要的。我希望它出现在第三个屏幕上(在教程之后)。有谁知道这里发生了什么以及为什么我不能将登录按钮放在第三个屏幕上?

最佳答案

针对 Swift 5 更新/针对 ios sdk 5 的谷歌登录:

登录按钮操作方法中使用以下代码行:

GIDSignIn.sharedInstance().presentingViewController = self
GIDSignIn.sharedInstance().delegate = self
GIDSignIn.sharedInstance().signIn()

Note: Comments above lines of code if you are using it anywhere in your ViewController...! otherwise it will be fine.

享受学习......!

关于ios - 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序 - ios google 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35371393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com