未调用 Facebook 登录完成块

Posted

技术标签:

【中文标题】未调用 Facebook 登录完成块【英文标题】:Facebook login completion block not called 【发布时间】:2016-07-28 10:27:50 【问题描述】:

我尝试使用自定义登录按钮实现 Facebook 登录,我已完成所有设置步骤,当我点击该按钮时,Web 视图出现并要求我提供权限。

但是,如果我点击 Done(在 Web 视图控制器的左上角),则会调用完成块但是当我点击 Cancel 或 OK 时,Web 视图控制器会关闭但永远不会调用完成块? 这是我使用的代码:

    let fbLoginManager = FBSDKLoginManager()
    fbLoginManager.loginBehavior = .Native
    fbLoginManager.logInWithReadPermissions(["email"], fromViewController: self)  (result, error) in
        // put a breakpoint here but it won't stop here if I tap OK
        if error != nil 
            print(error.localizedFailureReason)
         else if result.isCancelled 
            // dismiss view
         else 
            let token = result.token.tokenString
            // do something with the token
        
    

编辑 1

这是 AppDelegate 中的打开 url 方法:

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool 
    return application(app, openURL: url, sourceApplication: nil, annotation: [:])

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool 
    if url.scheme == Key.FACEBOOK_URL_SCHEME 
        let handled = FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
        return handled
    
    let dynamicLink = FIRDynamicLinks.dynamicLinks()?.dynamicLinkFromCustomSchemeURL(url)
    if let dynamicLink = dynamicLink 
        if let url = dynamicLink.url 
            if let paths = url.pathComponents
                if paths.count > 2 
                    let slug = paths[2]
                    if let book = AppManager.instance.findBookBySlug(slug) 
                        // Open detail book
                        self.openDetailBook(book)
                     else 
                        self.openDetailBookWithSlug(slug)
                    
                
            
        
    
    if url.scheme == Key.DEEP_LINK_URL_SCHEME 
        if let paths = url.pathComponents, host = url.host 
            if host == "truyen" 
                if paths.count > 1 
                    let slug = paths[1]
                    if let book = AppManager.instance.findBookBySlug(slug) 
                        // Open detail book
                        self.openDetailBook(book)
                     else 
                        self.openDetailBookWithSlug(slug)
                    
                
            
        
    
    return true

【问题讨论】:

你能发布你的开放网址方法吗? 请查看***.com/questions/32299271/…。请遵循大卫建议的答案。 你必须在你的第一个打开 url 方法中更改 return application(app, openURL: url, sourceApplication: nil, annotation: [:]) @TejaNandamuri 感谢您的评论,我按照大卫在您链接中的建议进行了操作,并且成功了!您可以发布答案以便我接受吗? 我刚做了。我还添加了一些信息来帮助您解决此类问题。 【参考方案1】:

如果您遇到这些情况,请自行调试,因为 Facebook SDK 是开源的。您看到的窗口是SFSafariViewController。当您点击任何这些按钮时,回叫将由SFSafariViewController 处理。在 Facebook sdk 中查找 SFSafariViewController delegate 方法。

在调用登录代码后下断点,一步一步走,它会带你到使用SFSafariViewController的类。

在其中一个delegate 方法中,您会发现对 open url 方法的调用。 在应用委托方法中实现相同的打开 URL 方法。

在您的情况下,问题将是使用错误的 openURL 方法。正确的应该是

func application(application: UIApplication,openURL url: NSURL, options: [String: AnyObject]) -> Bool 
return FBSDKApplicationDelegate.sharedInstance().application(application, 
     openURL: url, 
     sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String,
     annotation: options [UIApplicationOpenURLOptionsAnnotationKey])

【讨论】:

【参考方案2】:

Swift 3,删除此方法对我有用,

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool 
    return application(app, open: url, sourceApplication: nil, annotation: [:])

【讨论】:

【参考方案3】:

在您的 AppDelegate.m 文件中添加 Open url 方法并在该方法中放置断点

- (BOOL)application:(UIApplication *)application openURL:( NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
  return [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:sourceApplication  annotation:annotation];

【讨论】:

感谢您的回答,但我确实添加了方法,我有多个方案,因此 Facebook 方案有一个 if 子句,但如果 url.scheme == Key.FACEBOOK_URL_SCHEME 让处理= FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) 返回处理

以上是关于未调用 Facebook 登录完成块的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 请求配置文件 Graph API 无法在 iOS 7 本机 facebook 上未登录

Titanium Facebook 模块未在 iOS 7 上完成登录

使用 Parse 登录 Facebook 不起作用

隐藏时未调用委托方法

无法使用 quickblox(iOS)登录 facebook

在数据浏览器中解析没有 Facebook 详细信息的登录用户