适用于 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的主要内容,如果未能解决你的问题,请参考以下文章