[swift]Facebook 登录完成块不叫

标签: ios Facebook Swift
发布时间: 2017/3/6 23:24:44
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试图执行一个自定义登录按钮登录 Facebook,已经完成了所有的安装步骤和当按下按钮时,web 视图呈现,叫我提供的权限。

然而,如果我点击完成 (上左上方的 web 视图控制器),完成块叫做但当我点击取消或好的但完成块驳回 web 视图控制器是永远不会叫? enter image description here这里是我使用的代码︰

    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

这里是打开 url 方法在 AppDelegate 中︰

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
}

解决方法 1:

如果你曾经面对这些情况,调试它自己 Facebook SDK 是开源软件。你所看到的窗口是 SFSafariViewController 。当你点击任何这些按钮时,调用返回将由处理 SFSafariViewController 。寻找 SFSafariViewController delegate Facebook sdk 中的方法。

将断点放在您调用登录的代码,并一步步走后,它将带你到使用 SFSafariViewController 的类。

在其中的一个 delegate 方法,你会发现对打开的 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])
}
赞助商