Facebook浏览器登录重定向到应用程序后,处理程序不会被调用
我在我的Facebook应用程序登录中使用Facebook SDK v4.8.0 for iOS。 (iPhone OS 9.3版本)Facebook浏览器登录重定向到应用程序后,处理程序不会被调用
以下是整合一些相关代码:
AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
return true
}
func applicationDidBecomeActive(application: UIApplication) {
FBSDKAppEvents.activateApp()
}
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}
func application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject]) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url,
sourceApplication: "UIApplicationOpenURLOptionsSourceApplicationKey",
annotation: "UIApplicationOpenURLOptionsAnnotationKey")
}
Login.Swift
@IBAction func btnFacebook(sender: UIButton) {
self.loginToFacebookWithSuccess({ (response) -> Void in
print("Success")
}) { (error) -> Void in
print("failure")
}
func loginToFacebookWithSuccess(successBlock:() ->(), andFailure failureBlock: (NSError?) ->()) {
let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
fbLoginManager.loginBehavior = .SystemAccount
FBSDKLoginManager().logInWithReadPermissions(["public_profile", "email", "user_friends"], fromViewController: self, handler: { (result:FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in
if error != nil {
print("error")
} else if result.isCancelled {
print("cancelled")
} else {
print("worked fine") // get Facebook user data here
}
})
}
当用户有未在设备中配置Facebook帐户,该应用程序将转到浏览器并提供Face书籍登录界面。一旦用户完成登录,浏览器将重定向到应用程序。直到这一点一切工作正常。
问题
当浏览器将用户重定向到应用程序,没有任何反应。 (没有处理程序成功或失败被称为)。只要用户点击浏览器中的“完成”,日志中将打印“取消”。但是,对于“取消”或“好的”(或者说“继续作为用户名”)重定向后没有任何反应。
任何线索?
让我知道,如果我错过了任何信息。
我觉得你打开网址方法需要以下更改:
func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey: Any]) -> Bool {
let isFBURL = ((url.scheme?.hasPrefix("fb\(FBSDKSettings.appID()!)"))! && url.host == "authorize")
if isFBURL == true {
return FBSDKApplicationDelegate.sharedInstance().application(application, open: url,
sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
annotation: options[UIApplicationOpenURLOptionsKey.annotation] as? String)
}
}
让我知道,如果它的工作原理。
在application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject])
方法中,您传递的参数为sourceApplication
和annotation
硬编码字符串。
我认为这是问题。尝试使用静态键UIApplicationOpenURLOptionsSourceApplicationKey
和UIApplicationOpenURLOptionsAnnotationKey
传递options
字典中的值。
你也应该需要在方法声明之前添加@available(iOS 9.0, *)
,因为它是唯一可用的iOS从9
最终的功能应该是这样的:
@available(iOS 9.0, *)
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(app, openURL: url, sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String, annotation: options[UIApplicationOpenURLOptionsAnnotationKey])
}
按照您提及的方式进行了更改。问题仍然存在。 – viral
我建议你使用Facebook的方式和实施他们的FBSDKLoginButton
。将读取权限设置为按钮facebookButton.readPermissions = ["email", "user_birthday", "public_profile"]
。并委托给viewController。
//MARK:- FBSDKLogin Button Delegate
extension LoginViewController: FBSDKLoginButtonDelegate {
func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
guard let response = result, let _ = response.token else {
createAlertController("Error", message: "There was a problem with the Facebook login. Please try again.")
return
}
//Do what ever you need here
}
func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) {
//Required method, we don't need it at login screen
}
}
确保你关注了所有的Facebook plist设置信息。和App传输安全性为iOS 9+
FB应用程序正在开发或生产?您正在使用的用户是作为测试人员添加的?你在所有委托方法上放置断点? – Wain
@Wain它正在开发中。我将其用作开发人员(设备上的XCode调试)。是的,尝试在所有委托方法上放置断点。处理程序没有在“取消”或“好”的情况下被调用。当我点击“完成”(设备Safari窗口左上角的按钮)时,代表被调用。 = result.isCancelled – viral