Ответ 1
Сбой FBSDKProfile может быть не заполнен ко времени обратного вызова входа. Вместо этого вы можете наблюдать за сообщением "FBSDKProfileDidChangeNotification".
Я только что "обновил" свой 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!) {
}
}
Любые идеи?
Сбой FBSDKProfile может быть не заполнен ко времени обратного вызова входа. Вместо этого вы можете наблюдать за сообщением "FBSDKProfileDidChangeNotification".
Не забывайте 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!) {
}
}
Для тех из вас, кто ищет более обновленный ответ и более чистый подход, чем использование NSNotificationCenter, существует метод класса в FBSDKProfile, который вы можете вызвать после входа в систему, который выглядит следующим образом:
[FBSDKProfile loadCurrentProfileWithCompletion:^(FBSDKProfile *profile, NSError *error) {
}];
Я в 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 для документации этого уведомления и ключей, которые он отправит.
В 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
Кажется, вам нужно вызвать метод AppDelegate для инициализации SDK перед вызовом enableUpdatesOnAccessTokenChange:YES
Я сделал мой метод AppDelegate didFinishLaunching, подобный этому
BOOL fbsdk = [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
[FBSDKProfile enableUpdatesOnAccessTokenChange:YES];
return fbsdk;
Казалось, это сработало. Возможно, вам понадобится сделать запрос /me
, если вам нужны элементы не в объекте профиля.
У меня была схожая проблема с [FBSDKProfile currentProfile]
, но в Objective-C вы также можете получить свойства профиля пользователя из API-интерфейса Graph с ответом на https://graph.facebook.com/me?access_token=
с помощью currentAccessToken.