【问题标题】:Facebook SDK v4.0 for iOS - FBSDKProfile currentProfile not being set适用于 iOS 的 Facebook SDK v4.0 - 未设置 FBSDKProfile currentProfile
【发布时间】: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!) {
    }
}

有什么想法吗?

【问题讨论】:

    标签: ios swift facebook-sdk-4.0


    【解决方案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)
            })
        

        【讨论】:

          猜你喜欢
          • 2015-10-10
          • 2015-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-09
          相关资源
          最近更新 更多