在swift ios 10上使用Facebook登录时的空白浏览器页面

时间:2017-08-03 22:47:54

标签: ios swift facebook facebook-login

我使用的是swift 3,ios 10和Facebook的swift sdk v0.2.0。

我刚刚在我的应用程序中使用facebook登录,按下"继续使用facebook"按钮将打开safari(我在没有安装facebook应用程序的模拟器上运行)但是大约一半的时间浏览器将完全变为空白,没有导航栏或任何东西,控制台将输出此错误:

2017-08-03 12:40:05.276987-0500 Foster[30486:726822] [ViewService] Failed to get remote view controller with error: Error: domain=NSCocoaErrorDomain, code=0

但有时浏览器会设法加载并显示Facebook登录页面,我可以正常登录到Facebook并继续使用我的应用程序。我没有找到触发上述错误的内容,似乎是随机的。

我在Facebook登录时看到了很多关于这个空白页面的问题,但它们通常与登录后的委托相关,当safari设法加载登录页面时,这很正常,我得到了按"登录Facebook"后立即空白页面按钮。此外,大多数其他类似错误都会获得code=4099

我已按照Facebook的快速文档(https://developers.facebook.com/docs/swift/login)和ios文档(https://developers.facebook.com/docs/facebook-login/ios/)中的所有步骤进行操作。

我通过cocoaPods安装了FacebookLogin和FacebookCore。

我更新了我的plist文件:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>fb...</string>
        </array>
    </dict>
</array>
<key>FacebookAppID</key>
<string>...</string>
<key>FacebookDisplayName</key>
<string>...</string>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fbapi</string>
    <string>fb-messenger-api</string>
    <string>fbauth2</string>
    <string>fbshareextension</string>
</array>

我的应用代表:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    registerForPushNotifications()
    return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
}

public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool{
    return SDKApplicationDelegate.shared.application(app, open: url, options: options)
}

我的ViewController:

@IBAction func loginButtonClicked(_ sender: UIButton) {
    let loginManager = LoginManager()
    loginManager.logOut()
    loginManager.logIn([ .publicProfile, .userFriends ], viewController: self) { [unowned self] loginResult in
        switch loginResult {
        case .failed(let error):
            print(error)
        case .cancelled:
            print("User cancelled login.")
        case .success(let grantedPermissions, let declinedPermissions, let accessToken):
            print("Facebook Access Token: " + accessToken.authenticationToken)

        }
    }
}

func loginButtonDidCompleteLogin(_ loginButton: LoginButton, result: LoginResult) {}

func loginButtonDidLogOut(_ loginButton: LoginButton) {
    print("Facebook LogOut")
}

钥匙串共享已开启。

我见过很多有类似问题的人的很多,但没有列出的解决方案有效。

更新

经过更多测试后,我只能在模拟器中复制错误,而不是在物理设备上复制

2 个答案:

答案 0 :(得分:1)

删除此代码 -

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
       return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
}

在appdelegate中添加此代码 -

Console

答案 1 :(得分:0)

我认为您在其中一个appDelegate函数中出现问题,尝试将appDelegate中的第二个函数更改为以下内容:

 public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

    return FBSDKApplicationDelegate.sharedInstance().application(
      app,
      open: url as URL!,
      sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String,
      annotation: options[UIApplicationOpenURLOptionsKey.annotation]
    )

}

您错过了返回sourceApplication,这就是空白屏幕的原因。