IOSアプリ用にFacebookSDKを4.0に「アップグレード」しました。
ログインは正常に機能していますが、ドキュメントによると、プロファイル情報にアクセスするためにFBSDKProfile.currentProfile()
を使用することになっています。
ただし、プロフィール写真が(nil
を介して)表示されていて、FBSDKAccessToken.currentAccessToken()
がFBSDKProfilePictureView
でない場合でも、この値は常に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」通知投稿を確認できます。
FBSDKProfile.enableUpdatesOnAccessTokenChange(true)
を忘れないでください!! docs でそれを見つけるまで、私はしばらくこれに苦労しました。次に、FBSDKProfileDidChangeNotificationの通知をサブスクライブすると、FBSDKLoginButtonで機能するはずです。
完全な例... InterfaceBuilderを介して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!) {
}
}
NSNotificationCenterを使用するよりも最新の回答とよりクリーンなアプローチを探している人のために、ログイン後に呼び出すことができるFBSDKProfileのクラスメソッドがあります。
[FBSDKProfile loadCurrentProfileWithCompletion:^(FBSDKProfile *profile, NSError *error) {
}];
私はobjcにいますが、この問題にも遭遇しました。
まず、Johnny Zの答えは正しいです。これは、「enableUpdatesOnAccessTokenChange」をtrueに設定してから変更を監視することにより、FBSDKProfileクラスを明示的に有効にする必要があるというものです。実際、ヘッダーのコメントによると、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では、このスレッドのコメントに基づいて次のアプローチを使用しました。
このフラグが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
enableUpdatesOnAccessTokenChange:YES
を呼び出す前に、AppDelegateメソッドを呼び出してSDKを初期化する必要があるようです。
AppDelegatedidFinishLaunchingメソッドを次のように作成しました
BOOL fbsdk = [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions]; [FBSDKProfile enableUpdatesOnAccessTokenChange:YES]; return fbsdk;
それはうまくいったようです。プロファイルオブジェクトにないアイテムが必要な場合でも、/me
リクエストを実行する必要がある場合があります。
[FBSDKProfile currentProfile]
でも同様の問題が発生しましたが、Objective-Cでは、currentAccessTokenを使用してhttps://graph.facebook.com/me?access_token=
に応答し、GraphAPIからユーザープロファイルのプロパティを取得することもできます。
Swift 4バージョン、
FBSDKProfile.loadCurrentProfile(completion: {
profile, error in
let url = profile?.imageURL(for: FBSDKProfilePictureMode.square, size: self.imageview.frame.size)
})