使用Facebook App时,Facebook登录回调不起作用 - Swift

5

我在应用商店上有一个完全功能的应用程序已经运行了一年多,其中包括Facebook注册,一切都没有任何问题。然而,几天前,我收到了一些用户的投诉,他们说Facebook登录会导致应用程序在登录屏幕上卡住。我调查了这种行为,发现当您使用Facebook应用程序进行身份验证时,单击登录按钮后来自Facebook的回调不起作用。通过Safari进行身份验证可以正常工作。我已将我的Cocoapod库更新到最新版本,并在我的AppDelegate中添加了以下内容:

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

     FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) 
    return true
}


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

func applicationDidBecomeActive(_ application: UIApplication) {
    FBSDKAppEvents.activateApp()
}

我的所有Plist文件都是有序的,Facebook没有暂停我的应用或类似的事情,当我尝试使用Safari登录时,它又可以正常工作了。iOS版本为11,我正在使用Swift 3。


你在项目目标中的Info选项卡中的URL Types中提供了URL Schemes吗? - devang bhatt
我没有更改登录代码,这个应用之前是可以工作的,差不多半年了。 - Nermin Sehic
你解决了吗?我的应用程序在网页登录方面运行良好,但无法通过Facebook应用程序登录。 - Hide in bubble
5个回答

3

适用于 FBSDK 版本 5.0.0 及以上

在 AppDelegate 中

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        ApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
        return true
}

完成后,您可以添加

func applicationDidBecomeActive(_ application: UIApplication) {
        AppEvents.activateApp()
}

然后

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    return ApplicationDelegate.shared.application(app, open: (url as URL?)!, sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplication.OpenURLOptionsKey.annotation])
}

通过遵循这个,应该能够和你一起工作。

2
如@a.masri所述,Facebook登录SDK文档中忽略了在plist片段中包含此内容。这对我来说完全解决了崩溃问题。谢谢@a.masri。
<dict>
        <key>CFBundleTypeRole</key>   ///ADD THIS
        <string>Editor</string>      ///AND THIS
        <key>CFBundleURLSchemes</key>
        <array>
            <string>flex</string>
            <string>fb323015428110219</string>
        </array>
    </dict>

2

我想你已经通过Facebook登录了,这可能会导致一些问题。最好使用pod来获取最新的Facebook sdk更新或下载最新版本的Facebook框架。

pod 'FacebookCore'
pod 'FacebookLogin'
pod 'FacebookShare'

查看 Facebook LoginBehavior

根据 Facebook SDK 的最新更新,应该如下所示:

enter image description here

并检查 plist 信息是否相同。

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>fb{your-app-id}</string>
    </array>
  </dict>
</array>
<key>FacebookAppID</key>
<string>{your-app-id}</string>
<key>FacebookDisplayName</key>
<string>{your-app-name}</string>
<key>LSApplicationQueriesSchemes</key>
<array>
  <string>fbapi</string>
  <string>fb-messenger-share-api</string>
  <string>fbauth2</string>
  <string>fbshareextension</string>
</array>

2
它确实出现了,当我点击“使用Facebook应用程序登录”时,没有回调到我的应用程序,只是打开它并卡在启动画面上。但是,如果我点击“使用电话或电子邮件登录”,那么认证过程将在Safari上进行,并且可以正常工作。 - Nermin Sehic
看这里,检查plist键https://iswift.org/playground?R99ZOC&v=3 - a.masri
好的,请给我Facebook SDK版本。 - a.masri
1
非常感谢!它起作用了,问题出在Info.plist文件中,我漏掉了CFBundleTypeRole内的<string>Editor</string>,尽管您项目示例中的Info.plist与官方网站上放置的不同:https://developers.facebook.com/docs/ios/getting-started 他们没有把它放在这里。 - Nermin Sehic
@NerminSehic 我已经尝试了所有的方法,也加入了您的编辑角色建议,但我仍然无法使它工作。Facebook登录按钮不起作用,但如果我通过电子邮件或电话登录,则可以正常工作,所以我不知道问题出在哪里?我也更新了pods。点击“打开”按钮后,它会打开应用程序并返回到应用程序,但我没有从Facebook登录方法中获得任何响应,所以您能否帮助解决这个问题? - Jigar Tarsariya
显示剩余4条评论

0

尝试捕获Facebook的任何响应,以更好地了解您的请求被阻止的位置。例如,Facebook会不时更改readPermissions的策略(这并不常见),但这可能会导致您的请求出错。

我尝试在像这样发出请求时更好地了解情况:

loginManager.logIn(readPermissions: [.email, .publicProfile, .userFriends, .userBirthday], viewController: parentVC) { (result) in

            //Check the response
            switch result {

            case .failed(let error):

                #if DEBUG
                    print("Failed login: ", error.localizedDescription)
                #endif

                completionHandler(.connectionError)
                break

            case .cancelled:
                completionHandler(.cancelledError)

                break
            case .success(_, _, _):

                //We have success, make graph Request
                self.makeGraphRequest(completionHandler: completionHandler)

                break

            }//Check the pemrmissions response

        }// Ends loginManager.logIn

已经尝试过了,但是我无法捕获响应,因为我没有得到任何响应。回调函数根本没有被调用。 - Nermin Sehic

0
Try FBSDKLoginButton and use the Delegate method of that. It will help you. If you want to login with your browser only and want to remove "Login with the Facebook App" then remove LSApplicationQueriesSchemes array of strings from your info.plist. It will remove the app login option.

<key>LSApplicationQueriesSchemes</key>
<array>
  <string>fbapi</string>
  <string>fb-messenger-share-api</string>
  <string>fbauth2</string>
  <string>fbshareextension</string>
</array>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接