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

Posted

技术标签:

【中文标题】适用于 iOS 的 Facebook SDK v4.0 - 未设置 FBSDKProfile currentProfile【英文标题】:Facebook SDK v4.0 for iOS - FBSDKProfile currentProfile not being set 【发布时间】:2015-03-27 02:36:17 【问题描述】:

我刚刚为我的 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!) 
    

有什么想法吗?

【问题讨论】:

【参考方案1】:

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

完整示例...我通过 Interface Builder 连接 loginButton

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!) 


【讨论】:

这对我没有帮助。我必须手动向“我”发出请求以获取用户个人资料。 更正:它现在可以工作了。所以,主要的锚点:在 viewDidLoad 中制作 FBSDKProfile.enableUpdatesOnAccessTokenChange(true)。您还应该订阅 name:FBSDKProfileDidChangeNotification 因为只有在此通知之后您才会知道更改的配置文件。但问题是此配置文件不包含用户的电子邮件。要获取电子邮件,您应该使用“我”请求 另外,可能会注意到,如果不使用 FBSDKLoginButton,我将无法获取配置文件。所以,只使用 FBSDKLoginManager 这个方法是行不通的 for obj-c: [FBSDKProfile enableUpdatesOnAccessTokenChange:YES]; 这对我很有帮助...谢谢! 感谢您提供完整的示例【参考方案2】:

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

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

];

【讨论】:

谢谢,这比收听通知要好得多。代码中的自然流动。 终于有用了:D 最好的解决方案,谢谢! ...如果 FB SDK 在加载配置文件之前不调用登录处理程序,那就更好了。【参考方案3】:

在登录回调时可能尚未完成 FBSDKProfile 提取。相反,您可以观察“FBSDKProfileDidChangeNotification”通知帖子。

【讨论】:

看来是这样,谢谢。我应该如何(以及何时)确切地观察该字符串的变化? 与其他 NSNotification 通知帖子一样,您通常可以在需要处理该数据的任何视图控制器的 viewDidLoad 中观察它。【参考方案4】:

我在 objc 中,但也遇到了这个问题。

首先,Johnny Z 的回答是正确的,您必须通过将 'enableUpdatesOnAccessTokenChange' 设置为 true 然后观察更改来显式启用 FBSDKProfile 类。其实这就是FBSDKProfile内部根据header cmets所做的。

但是,正如 fanfan 在评论中指出的那样,FBSDKProfile 没有您可能感兴趣的所有字段。我最终没有使用 FBSDKProfile,只是像这样向“我”发出了图形请求:

    [[[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 cmets 以获取有关此通知的文档以及它将发送的密钥。

【讨论】:

为我工作!谢谢!!【参考方案5】:

在 Objective-C 中,我在这个线程中使用了以下基于 cmets 的方法。

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

[FBSDKProfile enableUpdatesOnAccessTokenChange:YES];

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

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

【讨论】:

【参考方案6】:

调用enableUpdatesOnAccessTokenChange:YES之前好像需要调用AppDelegate方法初始化SDK

我的 AppDelegate didFinishLaunching 方法是这样的

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

这似乎奏效了。如果您需要不在配置文件对象中的项目,您可能仍需要发出 /me 请求。

【讨论】:

【参考方案7】:

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

【讨论】:

看来这可能是“正确”的方式,因为 FBSDKProfile 缺少一些信息(例如电子邮件)。【参考方案8】:

Swift 4 版本,

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

【讨论】:

以上是关于适用于 iOS 的 Facebook SDK v4.0 - 未设置 FBSDKProfile currentProfile的主要内容,如果未能解决你的问题,请参考以下文章

适用于 iOS 的 Facebook SDK

适用于 iOS 的 Facebook SDK 登录

适用于 iOS 访问令牌问题的 Facebook SDK

适用于 iOs 的 Facebook SDK 无法正常工作

适用于 iOS 的 Facebook SDK 的权限

适用于 iOS 的 Xamarin facebook sdk 导致应用程序崩溃