在Facebook浏览器登录重定向到应用程序后,不会调用处理程序



我在我的应用程序中使用iOS版Facebook SDK v4.8.0登录Facebook。(iPhone操作系统9.3版)

以下是一些用于集成的相关代码:

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")
}

登录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帐户时,应用程序会转到浏览器并提供Facebook登录UI。一旦用户完成登录,浏览器就会重定向到应用程序。到目前为止,一切都很顺利。

问题

当浏览器将用户重定向到应用程序时,不会发生任何事情。(没有调用成功或失败的处理程序)。只是在用户点击浏览器中的"完成"时,"取消"会打印在日志中。但是,对于"取消"或"确定"(或说"作为用户名继续"),重定向后不会发生任何事情。

有线索吗?

如果我遗漏了任何信息,请告诉我。

我认为您的开放url方法需要以下更改:

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)
    }
}

如果有效,请告诉我。

我建议使用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设置信息。以及iOS 9+的应用程序传输安全

application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject])方法中,您将传入sourceApplicationannotation参数的硬编码字符串

我认为这就是问题所在。尝试使用静态键UIApplicationOpenURLOptionsSourceApplicationKeyUIApplicationOpenURLOptionsAnnotationKey传递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])
}

最新更新