web-dev-qa-db-ja.com

Facebook SDK v4.0 for iOS-FBSDKProfilecurrentProfileが設定されていません

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!) {
    }
}

何か案は?

19
fanfan

FBSDKProfileフェッチは、ログインコールバックの時点までに完了していない可能性があります。代わりに、「FBSDKProfileDidChangeNotification」通知投稿を確認できます。

11
Chris Pan

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!) {

}

}

27
Johnny Z

NSNotificationCenterを使用するよりも最新の回答とよりクリーンなアプローチを探している人のために、ログイン後に呼び出すことができるFBSDKProfileのクラスメソッドがあります。

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

}];
12
Eric Alford

私は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のコメントをお読みください。

7
Chad Pavliska

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

6
Pedro Romão

enableUpdatesOnAccessTokenChange:YESを呼び出す前に、AppDelegateメソッドを呼び出してSDKを初期化する必要があるようです。

AppDelegatedidFinishLaunchingメソッドを次のように作成しました

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

それはうまくいったようです。プロファイルオブジェクトにないアイテムが必要な場合でも、/meリクエストを実行する必要がある場合があります。

3
Brian Broom

[FBSDKProfile currentProfile]でも同様の問題が発生しましたが、Objective-Cでは、currentAccessTokenを使用してhttps://graph.facebook.com/me?access_token=に応答し、GraphAPIからユーザープロファイルのプロパティを取得することもできます。

2
Andrei Ogrenich

Swift 4バージョン、

FBSDKProfile.loadCurrentProfile(completion: {
        profile, error in
        let url = profile?.imageURL(for: FBSDKProfilePictureMode.square, size:  self.imageview.frame.size)
    })
0
cnu