Swift FBSDK 问题 - 某些用户的 Facebook ID 为零

Posted

技术标签:

【中文标题】Swift FBSDK 问题 - 某些用户的 Facebook ID 为零【英文标题】:Swift FBSDK issue - Facebook ID is nil for some users 【发布时间】:2016-06-19 19:20:15 【问题描述】:

我花了很长时间试图弄清楚为什么下载我的应用程序的用户中有 5% 无法成功登录 Facebook。

在 95% 的情况下,它按预期执行,一切正常。

但是对于另外 5% 的应用程序在第一个 ViewController 页面上崩溃。然后当他们重新启动应用程序时,将成功发送到第二页以检查它们是否已存在于数据库中,但 Facebook id 为 nil 并显示错误对话框。

我无法调试它,因为我的设备以及绝大多数设备似乎都没有此错误。

如果有人能提出问题可能出在哪里,我将永远感激不尽!

第一页视图控制器:

import UIKit

class ViewController: UIViewController 




@IBAction func btnFBLoginPressed(sender: AnyObject) 



    let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()



    fbLoginManager .logInWithReadPermissions(["email"], fromViewController: self, handler:  (result, error) -> Void in
        if (error == nil)

            let fbloginresult : FBSDKLoginManagerLoginResult = result
            if result.isCancelled 
                return
            

            if(fbloginresult.grantedPermissions.contains("email"))
            
                self.getFBUserData()

              //fbLoginManager.logOut()
            
        
    )


func getFBUserData()
    if((FBSDKAccessToken.currentAccessToken()) != nil)
        FBSDKGraphRequest(graphpath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email, gender, age_range, locale"]).startWithCompletionHandler( (connection, result, error) -> Void in
            if (error == nil)


                let userName : NSString = result.valueForKey("name") as! NSString
                let facebookID : NSString = result.valueForKey("id") as! NSString
                let firstName : NSString = result.valueForKey("first_name") as! NSString
                let lastName : NSString = result.valueForKey("last_name") as! NSString
                let email : NSString = result.valueForKey("email") as! NSString
                let gender : NSString = result.valueForKey("gender") as! NSString


                let locale : NSString = result.valueForKey("locale") as! NSString


                let defaults = NSUserDefaults.standardUserDefaults()

                defaults.setObject("\(userName)", forKey: "userName")
                defaults.setObject("\(facebookID)", forKey: "facebookID")
                defaults.setObject("\(firstName)", forKey: "firstName")
                defaults.setObject("\(lastName)", forKey: "lastName")
                defaults.setObject("\(email)", forKey: "email")


                defaults.setObject("\(gender)", forKey: "gender")



                defaults.setObject("\(locale)", forKey: "locale")








            
        )
    



override func viewDidAppear(animated: Bool) 




      if((FBSDKAccessToken.currentAccessToken()) != nil)

        print("logged in")

    self.performSegueWithIdentifier("login",sender:self)



      else

        print("Not logged in")

    




override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    // let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()

    //  fbLoginManager.logOut()




override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.




登录后的第二页:

import Foundation

import UIKit
import Parse
import Bolts

class loginViewController: UIViewController 


override func viewDidAppear(animated: Bool)




    let defaults = NSUserDefaults.standardUserDefaults()

    if let facebookID = defaults.stringForKey("facebookID")

        let firstName = defaults.stringForKey("firstName")
        let lastName = defaults.stringForKey("lastName")
        let email = defaults.stringForKey("email")
        let gender = defaults.stringForKey("gender")


       // Lots of code that queries database 



     else


        let alert = UIAlertView()
        alert.title = "Error"
        alert.message = "Error Code: 01"
        alert.addButtonWithTitle("OK")
        alert.show()


            let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()

            fbLoginManager.logOut()

            self.performSegueWithIdentifier("backToLoginScreen", sender: nil)




    


        





【问题讨论】:

【参考方案1】:

我认为问题是

 fbLoginManager .logInWithReadPermissions(["email"], fromViewController: self, handler:  (result, error) -> Void in

因为您只请求获取电子邮件,但您将获取 ID、姓名和许多与电子邮件无关的东西。因此我认为最好像这样更改权限。

fbLoginManager.logInWithReadPermissions(["public_profile","email"], fromViewController: self)  (result, error) -> Void in

希望对你有所帮助!

【讨论】:

我会试一试,一旦获得批准就会通知您:)

以上是关于Swift FBSDK 问题 - 某些用户的 Facebook ID 为零的主要内容,如果未能解决你的问题,请参考以下文章

FBSDK 检查用户是不是已经授权应用程序 Swift

如何在 iPhone 的 Swift iOS 中使用 FBSDK 获取用户电子邮件地址?

无法使用 Swift 2 在 Xcode 7 beta 中导入 FBSDK

通过 Pod 安装的 FBSDK - Swift 上没有这样的模块

无法在 swift 3 / FBSDK 4.17 中正确检索 FBSDKAccessToken 当前令牌

如何在swift 3中使用FBSDK获取fb页面列表或其位置ID