iOS 的 Facebook SDK v4.0 - FBSDKProfile currentProfile 未设置
Facebook SDK v4.0 for iOS - FBSDKProfile currentProfile not being set
我刚刚 "upgraded" 我的 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!) {
}
}
有什么想法吗?
到登录回调时,FBSDKProfile 提取可能尚未完成。相反,您可以观察 'FBSDKProfileDidChangeNotification' 通知 post.
我在 [FBSDKProfile currentProfile]
中遇到了类似的问题,但在 Objective-C 中,您还可以通过使用 currentAccessToken 响应 https://graph.facebook.com/me?access_token=
从 Graph API 获取用户配置文件的属性。
别忘了FBSDKProfile.enableUpdatesOnAccessTokenChange(true)
!!我为此苦苦挣扎了一段时间,直到我在 docs 中找到了它。然后订阅 FBSDKProfileDidChangeNotification 上的通知应该适用于 FBSDKLoginButton。
完整示例...我通过 Interface Builder 连接登录按钮
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!) {
}
}
我在 objc 但 运行 也遇到了这个问题。
首先,Johnny Z 的回答是正确的,您必须通过将 'enableUpdatesOnAccessTokenChange' 设置为 true 然后观察变化来显式启用 FBSDKProfile class。事实上,根据 header 评论,这就是 FBSDKProfile 在内部所做的事情。
然而,正如 fanfan 在评论中指出的那样,FBSDKProfile 并没有您可能感兴趣的所有字段。我最终没有使用 FBSDKProfile,只是为 'me' 发出了一个图形请求,例如所以:
[[[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 评论以获取此通知的文档及其将发送的密钥。
在 objective-C 中,我根据该线程中的评论使用了以下方法。
如果此标志设置为是,则在登录或注销后将调用通知。所以在 viewDidLoad 中添加这行代码并添加在收到用户配置文件后调用的通知。
[FBSDKProfile enableUpdatesOnAccessTokenChange:YES];
[[NSNotificationCenter defaultCenter] addObserverForName:FBSDKProfileDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
//do whatever you want
}];
此link中的所有信息
https://developers.facebook.com/docs/facebook-login/ios/v2.3#profiles
调用enableUpdatesOnAccessTokenChange:YES
之前好像需要先调用AppDelegate方法初始化SDK
我的 AppDelegate didFinishLaunching 方法是这样的
BOOL fbsdk = [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
[FBSDKProfile enableUpdatesOnAccessTokenChange:YES];
return fbsdk;
这似乎奏效了。如果您需要配置文件对象中没有的项目,您可能仍然需要执行 /me
请求。
对于那些正在寻找比使用 NSNotificationCenter 更更新的答案和更简洁的方法的人,FBSDKProfile 上有一个 class 方法,您可以在登录后调用它,如下所示:
[FBSDKProfile loadCurrentProfileWithCompletion:^(FBSDKProfile *profile, NSError *error) {
}];
Swift 4个版本,
FBSDKProfile.loadCurrentProfile(completion: {
profile, error in
let url = profile?.imageURL(for: FBSDKProfilePictureMode.square, size: self.imageview.frame.size)
})
我刚刚 "upgraded" 我的 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!) {
}
}
有什么想法吗?
到登录回调时,FBSDKProfile 提取可能尚未完成。相反,您可以观察 'FBSDKProfileDidChangeNotification' 通知 post.
我在 [FBSDKProfile currentProfile]
中遇到了类似的问题,但在 Objective-C 中,您还可以通过使用 currentAccessToken 响应 https://graph.facebook.com/me?access_token=
从 Graph API 获取用户配置文件的属性。
别忘了FBSDKProfile.enableUpdatesOnAccessTokenChange(true)
!!我为此苦苦挣扎了一段时间,直到我在 docs 中找到了它。然后订阅 FBSDKProfileDidChangeNotification 上的通知应该适用于 FBSDKLoginButton。
完整示例...我通过 Interface Builder 连接登录按钮
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!) {
}
}
我在 objc 但 运行 也遇到了这个问题。
首先,Johnny Z 的回答是正确的,您必须通过将 'enableUpdatesOnAccessTokenChange' 设置为 true 然后观察变化来显式启用 FBSDKProfile class。事实上,根据 header 评论,这就是 FBSDKProfile 在内部所做的事情。
然而,正如 fanfan 在评论中指出的那样,FBSDKProfile 并没有您可能感兴趣的所有字段。我最终没有使用 FBSDKProfile,只是为 'me' 发出了一个图形请求,例如所以:
[[[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 评论以获取此通知的文档及其将发送的密钥。
在 objective-C 中,我根据该线程中的评论使用了以下方法。
如果此标志设置为是,则在登录或注销后将调用通知。所以在 viewDidLoad 中添加这行代码并添加在收到用户配置文件后调用的通知。
[FBSDKProfile enableUpdatesOnAccessTokenChange:YES];
[[NSNotificationCenter defaultCenter] addObserverForName:FBSDKProfileDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
//do whatever you want
}];
此link中的所有信息 https://developers.facebook.com/docs/facebook-login/ios/v2.3#profiles
调用enableUpdatesOnAccessTokenChange:YES
我的 AppDelegate didFinishLaunching 方法是这样的
BOOL fbsdk = [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
[FBSDKProfile enableUpdatesOnAccessTokenChange:YES];
return fbsdk;
这似乎奏效了。如果您需要配置文件对象中没有的项目,您可能仍然需要执行 /me
请求。
对于那些正在寻找比使用 NSNotificationCenter 更更新的答案和更简洁的方法的人,FBSDKProfile 上有一个 class 方法,您可以在登录后调用它,如下所示:
[FBSDKProfile loadCurrentProfileWithCompletion:^(FBSDKProfile *profile, NSError *error) {
}];
Swift 4个版本,
FBSDKProfile.loadCurrentProfile(completion: {
profile, error in
let url = profile?.imageURL(for: FBSDKProfilePictureMode.square, size: self.imageview.frame.size)
})