Подтвердить что ты не робот

Facebook SDK v4.0 для iOS - FBSDKProfile currentProfile не установлен

Я только что "обновил" свой Facebook SDK до 4.0 для своего приложения iOS.

У меня есть журнал работает нормально, однако, согласно документации, я теперь должен использовать 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!) {
    }
}

Любые идеи?

4b9b3361

Ответ 1

Сбой FBSDKProfile может быть не заполнен ко времени обратного вызова входа. Вместо этого вы можете наблюдать за сообщением "FBSDKProfileDidChangeNotification".

Ответ 2

Не забывайте FBSDKProfile.enableUpdatesOnAccessTokenChange(true)!! Некоторое время я боролся с этим, пока не обнаружил, что в docs. Затем подписка на уведомления в FBSDKProfileDidChangeNotification должна работать для FBSDKLoginButton.

Полный пример... Я подключаю loginButton через 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!) {

}

}

Ответ 3

Для тех из вас, кто ищет более обновленный ответ и более чистый подход, чем использование NSNotificationCenter, существует метод класса в FBSDKProfile, который вы можете вызвать после входа в систему, который выглядит следующим образом:

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

}];

Ответ 4

Я в objc, но столкнулся с этой проблемой.

Во-первых, ответ Johnny Z верен, что вы должны явно включить класс FBSDKProfile, установив "enableUpdatesOnAccessTokenChange" в true, а затем наблюдая изменения. Фактически, то, что FBSDKProfile делает внутренне в соответствии с комментариями заголовка.

Однако, как отмечает 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 для документации этого уведомления и ключей, которые он отправит.

Ответ 5

В 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

Кажется, вам нужно вызвать метод AppDelegate для инициализации SDK перед вызовом enableUpdatesOnAccessTokenChange:YES

Я сделал мой метод AppDelegate didFinishLaunching, подобный этому

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

Казалось, это сработало. Возможно, вам понадобится сделать запрос /me, если вам нужны элементы не в объекте профиля.

Ответ 7

У меня была схожая проблема с [FBSDKProfile currentProfile], но в Objective-C вы также можете получить свойства профиля пользователя из API-интерфейса Graph с ответом на https://graph.facebook.com/me?access_token= с помощью currentAccessToken.