iOS 的 Facebook SDK v4.0 - FBSDKProfile currentProfile 未设置

Facebook SDK v4.0 for iOS - FBSDKProfile currentProfile not being set

我刚刚 "upgraded" 我的 iOS 应用程序的 Facebook SDK 升级到 4.0。

我的登录工作正常,但是,根据文档,我现在应该使用 FBSDKProfile.currentProfile() 来访问个人资料信息。

但是,这个值似乎总是 nil,即使正在显示我的个人资料图片(通过 FBSDKProfilePictureView)而我的 FBSDKAccessToken.currentAccessToken() 不是 nil .

这是我的登录名ViewController:

import UIKit

class LoginViewController: UIViewController, FBSDKLoginButtonDelegate {

    @IBOutlet weak var fbLoginButton: FBSDKLoginButton!
    @IBOutlet weak var fbProfilePicture: FBSDKProfilePictureView! //displays a picture

    override func viewDidLoad() {
        super.viewDidLoad()
        self.fbLoginButton.delegate = self
        FBSDKProfile.enableUpdatesOnAccessTokenChange(true)
        if FBSDKAccessToken.currentAccessToken() != nil {
            println("\(FBSDKAccessToken.currentAccessToken().userID)") //works
        }
        self.fbLoginButton.readPermissions = ["public_profile", "email", "user_friends"]
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
        println(FBSDKProfile.currentProfile()) //is nil
    }

    func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) {
    }
}

有什么想法吗?

到登录回调时,FBSDKProfile 提取可能尚未完成。相反,您可以观察 'FBSDKProfileDidChangeNotification' 通知 post.

我在 [FBSDKProfile currentProfile] 中遇到了类似的问题,但在 Objective-C 中,您还可以通过使用 currentAccessToken 响应 https://graph.facebook.com/me?access_token= 从 Graph API 获取用户配置文件的属性。

别忘了FBSDKProfile.enableUpdatesOnAccessTokenChange(true)!!我为此苦苦挣扎了一段时间,直到我在 docs 中找到了它。然后订阅 FBSDKProfileDidChangeNotification 上的通知应该适用于 FBSDKLoginButton。

完整示例...我通过 Interface Builder 连接登录按钮

class LoginController: UIViewController, FBSDKLoginButtonDelegate {

@IBOutlet var loginButton: FBSDKLoginButton!

override func viewDidLoad() {
    super.viewDidLoad()
    loginButton.delegate = self;
    FBSDKProfile.enableUpdatesOnAccessTokenChange(true)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "onProfileUpdated:", name:FBSDKProfileDidChangeNotification, object: nil)

}

func onProfileUpdated(notification: NSNotification)
{
}

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!){

}

func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) {

}

}

我在 objc 但 运行 也遇到了这个问题。

首先,Johnny Z 的回答是正确的,您必须通过将 'enableUpdatesOnAccessTokenChange' 设置为 true 然后观察变化来显式启用 FBSDKProfile class。事实上,根据 header 评论,这就是 FBSDKProfile 在内部所做的事情。

然而,正如 fanfan 在评论中指出的那样,FBSDKProfile 并没有您可能感兴趣的所有字段。我最终没有使用 FBSDKProfile,只是为 'me' 发出了一个图形请求,例如所以:

    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil]
         startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
             if (error) {
                 CLS_LOG(@"Login error: %@", [error localizedDescription]);
                 return;
             }

             NSLog(@"fecthed user: %@", result);
}];

注意:您仍然可以通过 'FBSDKProfileDidChangeNotification' 通知观察变化。阅读 FBSDKAccessToken.h 评论以获取此通知的文档及其将发送的密钥。

在 objective-C 中,我根据该线程中的评论使用了以下方法。

如果此标志设置为是,则在登录或注销后将调用通知。所以在 viewDidLoad 中添加这行代码并添加在收到用户配置文件后调用的通知。

[FBSDKProfile enableUpdatesOnAccessTokenChange:YES];

[[NSNotificationCenter defaultCenter] addObserverForName:FBSDKProfileDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
     //do whatever you want
}];

此link中的所有信息 https://developers.facebook.com/docs/facebook-login/ios/v2.3#profiles

调用enableUpdatesOnAccessTokenChange:YES

之前好像需要先调用AppDelegate方法初始化SDK

我的 AppDelegate didFinishLaunching 方法是这样的

BOOL fbsdk = [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions]; [FBSDKProfile enableUpdatesOnAccessTokenChange:YES]; return fbsdk;

这似乎奏效了。如果您需要配置文件对象中没有的项目,您可能仍然需要执行 /me 请求。

对于那些正在寻找比使用 NSNotificationCenter 更更新的答案和更简洁的方法的人,FBSDKProfile 上有一个 class 方法,您可以在登录后调用它,如下所示:

[FBSDKProfile loadCurrentProfileWithCompletion:^(FBSDKProfile *profile, NSError *error) {

}];

Swift 4个版本,

FBSDKProfile.loadCurrentProfile(completion: {
        profile, error in
        let url = profile?.imageURL(for: FBSDKProfilePictureMode.square, size:  self.imageview.frame.size)
    })