我在我的应用程序中使用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])
方法中,您将传入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])
}