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

时间:2015-03-27 02:36:18

标签: ios swift facebook-sdk-4.0

我刚刚升级了"我的Facebook SDK为我的iOS应用程序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!) {
    }
}

有什么想法吗?

8 个答案:

答案 0 :(得分:27)

别忘了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!) {

}

}

答案 1 :(得分:12)

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

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

}];

答案 2 :(得分:11)

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

答案 3 :(得分:7)

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

首先,Johnny Z的回答是正确的,你必须通过设置' enableUpdatesOnAccessTokenChange'来明确启用FBSDKProfile类。真实然后观察变化。事实上,这就是FBSDKProfile根据标题评论在内部做的事情。

然而,正如fanfan在评论中指出的那样,FBSDKProfile并没有你可能感兴趣的所有字段。我最终没有使用FBSDKProfile而只是为我做了一个图形请求&# 39;像这样:

    [[[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注释以获取此通知的文档及其将发送的密钥。

答案 4 :(得分:6)

在objective-C中,我根据此主题中的注释使用了以下方法。

如果此标志设置为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

答案 5 :(得分:3)

在您致电enableUpdatesOnAccessTokenChange:YES

之前,您似乎需要调用AppDelegate方法来初始化SDK

我像我这样做了我的AppDelegate didFinishLaunching方法

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

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

答案 6 :(得分:2)

我遇到与[FBSDKProfile currentProfile]类似的问题,但在Objective-C中,您还可以使用Graph API获取用户个人资料的属性,并使用您的currentAccessToken响应https://graph.facebook.com/me?access_token=

答案 7 :(得分:0)

Swift 4版本,

// set loading to false and loaded to true, 
// you can also implement an action running count for exemple
dispatch(ACTION_END)