因此,我摆弄了Facebook的iOS SDK,并设法允许用户登录到我的应用程序。我在情节提要中有一个UIView设置,属于FBSDKLoginButton类,根据this,它只是UIButton的子类。然后,我创建了一个@IBOutlet weak var facebookLogInBtn: FBSDKLoginButton!。然后我就这样来设置我的权限

override func viewDidLoad()
{
    super.viewDidLoad()

    facebookLogInBtn.delegate = self
    facebookLogInBtn.readPermissions = ["public_profile", "email", "user_friends"]
}


这工作得很好,可以完成我想要的任务和所需的任何其他权限,我只需将它们附加到facebookLoginBtn.readPermissions数组即可。但是经过一番谷歌搜索之后,我发现了很多使用FBSDKGraphRequestFBSDKLoginManager的网站。以这个blog为例。现在我的问题是:


我的方式被认为是可以接受的吗?它可以工作,但是我只想确定我正在遵循标准程序。
我如何以某种方式绑定到通过Graph API获取数据?因为我明确地没有声明任何FBSDKRequestFBSDKLoginManager对象。我只添加了按钮,然后实现了delegates和Voila!我正在访问。无需解析任何JSON数据或其他任何内容。
我还注意到,这些网站中的大多数实际上从未将其UIView中的任何一个定为FBSDKLoginButton类。这可能是他们必须“手动”处理所有事情的原因吗?


任何帮助将不胜感激。
干杯!

最佳答案

我所做的方式是正确的,但无法使用它检索任何用户数据。使用FBSDKLoginManager对象,Facebook可以为我处理所有事情,它只会返回用户的最终响应(是否同意),但没有我通过readPermissions数组请求的任何实际数据。用于任何数据检索;甚至可能还要写,我不得不为此创建一个FBSDKGraphRequest对象。总而言之,我最终让Facebook处理登录并使用FBSDKLoginManager注销,成功后,我使用FBSDKGraphRequest检索了用户数据,如下所示

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!)
{
    if error != nil
    {
       print("Facebook Log In Failed")
       print(error.localizedDescription)
    }

    let graphRequest: FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields" : "\(FacebookPermission.NAME), \(FacebookPermission.FIRST_NAME), \(FacebookPermission.LAST_NAME), \(FacebookPermission.EMAIL)"])

    graphRequest.startWithCompletionHandler { (connection: FBSDKGraphRequestConnection!, result:AnyObject!, error: NSError!) in

        if error == nil
        {
            print("Data retrieval was successful")
        }
        else
        {
            print("Facebook Graph Request Error")
            print(error)
        }
    }
}

10-02 02:01