2016-05-14 49 views
8

我在我的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书籍登录界面。一旦用户完成登录,浏览器将重定向到应用程序。直到这一点一切工作正常。

问题

当浏览器将用户重定向到应用程序,没有任何反应。 (没有处理程序成功或失败被称为)。只要用户点击浏览器中的“完成”,日志中将打印“取消”。但是,对于“取消”或“好的”(或者说“继续作为用户名”)重定向后没有任何反应。

任何线索?

让我知道,如果我错过了任何信息。

+0

FB应用程序正在开发或生产?您正在使用的用户是作为测试人员添加的?你在所有委托方法上放置断点? – Wain

+0

@Wain它正在开发中。我将其用作开发人员(设备上的XCode调试)。是的,尝试在所有委托方法上放置断点。处理程序没有在“取消”或“好”的情况下被调用。当我点击“完成”(设备Safari窗口左上角的按钮)时,代表被调用。 = result.isCancelled – viral

回答

3

我觉得你打开网址方法需要以下更改:

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

让我知道,如果它的工作原理。

+0

我会在一会儿让你知道。让我试试看。 – viral

+0

是的,这工作。谢谢。 – viral

2

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]) 
} 
+1

按照您提及的方式进行了更改。问题仍然存在。 – viral

3

我建议你使用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+

+0

我需要使用客户端提供的自定义按钮图像,如果我使用'FBSDKLoginButton',则不能在那里。因此,这不会解决我的问题。 – viral

+0

谢谢你。在SO上有很多结果,这是从标准FB登录返回的最佳方法。 – AndyDunn

相关问题