无法从 Swift 中的 Facebook iOS SDK 捕获城市和国家/地区值

Posted

技术标签:

【中文标题】无法从 Swift 中的 Facebook iOS SDK 捕获城市和国家/地区值【英文标题】:Unable to capture city, and country values from Facebook iOS SDK in Swift 【发布时间】:2017-07-09 01:13:04 【问题描述】:

我目前正在使用 Facebook ios SDK 在我的应用程序中成功捕获电子邮件、名字和姓氏。但是,由于某种原因,我很难为用户捕获位置信息,例如城市和国家。

这是我的相关代码:

override func viewDidLoad() 

        super.viewDidLoad()
        fbLoginButton.delegate = self
        fbLoginButton.readPermissions = ["email", "public_profile", "user_location"]


extension RegisterViewController: FBSDKLoginButtonDelegate 

    func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) 
        print("Did log out of facebook")
    

    func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) 
        if error != nil 
            print(error)
            return
        

        print("Successfully logged in with facebook...")
        FBSDKGraphRequest(graphpath: "/me", parameters: ["fields": "id, name, first_name, last_name, email, locationlocation"]).start  (connection, result, err) in

            if err != nil 
                print("Failed to start graph request:", err)
                return
            

            print(result)

            let fbDetails = result as! NSDictionary
            let location : NSDictionary! = fbDetails.value(forKey: "location") as! NSDictionary //code crashes here
            let locationContents : NSDictionary! = location.value(forKey: "location") as! NSDictionary
            let city: String! = locationContents.value(forKey: "city") as? String
            let state: String! = locationContents.value(forKey: "state") as? String
            let country: String! = locationContents.value(forKey: "country") as? String

            print(fbDetails)
            print("city:", city)
            print("state:", state)
            print("country:", country)


        
    

当我在控制台中运行代码时,我看到了 email、first_name、last_name、id、name 的输出,但没有看到 location 的输出,并且我的应用程序崩溃了:

fatal error: unexpectedly found nil while unwrapping an Optional value 

当它到达线路时:

let location : NSDictionary! = fbDetails.value(forKey: "location") as! NSDictionary

谁能看出我做错了什么?

【问题讨论】:

直接导致崩溃的是你强制解包一个可选值。至于为什么你不能得到这些值;隐私权限? 我应该如何解开可选值,如何检查我的隐私权限是否设置正确? 你应该说类似if let city = locationContents.value(forKey: "city") as? String //Do something with city 。有关权限,请参阅下面的答案 【参考方案1】:

您需要将“user_location”添加到您的 read_permission。

fbLoginButton.readPermissions = ["email", "public_profile", "user_location"]

记得在你的 fb 应用程序中验证此权限。(user_location 不是默认允许的权限)

【讨论】:

非常感谢您的回答,对于延迟回复您,我深表歉意。我已经对我的代码进行了适当的更改,不幸的是,我仍然没有在响应中获得位置详细信息。每次我对代码进行更改以重新完成“握手”过程时,我都尝试从我的 Facebook 个人资料中删除该应用程序,但不幸的是,我仍然没有收到这些值。我想知道是否需要在我的个人 fb 页面中更改我的隐私设置,但不确定我需要做什么。 “位置”数据来自您的 fb 个人资料“关于”->“您住过的地方”->“当前城市”。确保您的个人资料包含此信息。我测试更改此信息并再次登录,然后我得到了不同的位置数据。确保您的“位置”权限已通过验证,或者您使用 Facebook 应用程序的管理员帐户登录。 要获得 user_location 的权限,请在您的 fb 应用程序中开始提交“user_location”。 'developers.facebook.com'->'App Review'->'提交项目以供批准'

以上是关于无法从 Swift 中的 Facebook iOS SDK 捕获城市和国家/地区值的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 中的 Facebook SDK 与 Swift/Xcode beta 5 返回 accessToken 但更新后没有用户 ID

无法使用 Facebook SDK IOS Swift 登录 [重复]

我如何从 facebook 公开资料 Facebook IOS Swift SDK 中获取性别

无法从 Facebook iOS 应用中的通知中获取 request_ids

Facebook 邀请分享对话框未打开 iOS Swift

在 iOS9 和 Swift2 中使用 Parse 登录 Facebook