我刚刚升级了"我的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!) {
}
}
有什么想法吗?
答案 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 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)