fbDidLogin никогда не звонил (facebook-ios-sdk) - PullRequest
1 голос
/ 18 ноября 2010

Я использую всплывающее диалоговое окно Facebook для входа пользователя и публикации сообщения в его / ее потоке

NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: apiKey, @"api_key", nil];
[facebook dialog:@"stream.publish" andParams:params andDelegate:self];

Это работает, но когда пользователь входит в систему, метод fbDidLogin никогда не вызывается. Зачем? Таким образом, я не могу запросить имя пользователя, а токен доступа всегда равен нулю.

EDIT

С октябрьским api facebook я частично решил мою проблему.

Ответы [ 10 ]

9 голосов
/ 28 августа 2011

У меня была такая же проблема, и я решил ее. Вам необходимо реализовать

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

в вашем классе делегата приложения, а не в пользовательском UIViewController или любом другом классе. Затем направьте вызов от вашего представителя приложения любому контроллеру, который отвечает за ваш Facebook.

7 голосов
/ 23 ноября 2010

Вы зарегистрировали свое приложение для обработки URL-адреса своего приложения Facebook? Если нет, то есть инструкции, как это сделать, на веб-сайте Facebook iOS SDK. Вы также должны указать своему делегату приложения для обработки вызовов на этот URL. Для этого добавьте следующий код в реализацию делегата приложения:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return [[controller facebook] handleOpenURL:url];
}

Где [controller facebook] является экземпляром вашего класса Facebook.

2 голосов
/ 10 января 2011

Вам необходимо установить переменную-член sessionDelegate дескриптора facebook перед вызовом любых методов диалога.

    self.facebook.sessionDelegate = self;

Также вам нужно будет реализовать обратные вызовы FBSessionDelegate в вашем объекте.

Я НЕ проверял это для stream.publish, но это то, что для

[facebook dialog:@"oauth" andParams:params andDelegate:self];

необходимо.

1 голос
/ 28 апреля 2012

Вам нужно только реализовать этот метод в вашем делегате приложения, как этот ...

    - (void)fbDidLogin {
    NSLog(@"DID LOGIN!");

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[[self facebook] accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[[self facebook] expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];

}

Ошибка, которую вы делаете, заключается в том, что вы реализуете этот метод в своем пользовательском представлении.

EDIT:

Приведенный выше код работает отлично, но если вы хотите получить контроль над вашим пользовательским viewcontroller, вы можете сохранить этот код в вашем appDelegate и добавить этот код в свой CustomViewController:

     delegate= (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
    [delegate facebook].sessionDelegate=self;

Итак, вы сможете переопределить fbDidLogin в вашем CustomViewController, не забудьте добавить FBSessionDelegate в свой CustomViewController.h (Заголовок).

С уважением.

1 голос
/ 28 октября 2011

В моем случае fbDidLogin не был вызван из-за ошибки в info.plist.Схемы URL должны быть добавлены к типам URL.И здесь строка fbMyAppId добавляется как элемент 0. (по ошибке я добавил идентификаторы URL вместо схем URL)

1 голос
/ 21 октября 2011

У меня только что была эта проблема, и я думаю, что, возможно, нашел ваше решение.Когда вы создаете приложение на Facebook, вы должны отредактировать настройки своего приложения, чтобы включить нативное приложение ios.Выбранный идентификатор пакета ios должен точно соответствовать вашему идентификатору пакета в приложении, которое вы создаете.Facebook заявляет, что они проверяют это до авторизации вашего приложения.Забавно, если вы удалите приложение facebook с устройства, а затем попытаетесь аутентифицировать его с помощью веб-браузера и, по-видимому, полностью обойдете эту «безопасность».Facebook не отправляет сообщение об ошибке, поэтому было очень интересно отследить.Я подумал, что выложу этот ответ в надежде спасти некоторых будущих разработчиков.Надеюсь, это поможет.

1 голос
/ 29 июня 2011

У меня сработал метод Майка Бретца.

У меня есть класс (контроллер представления), в котором есть кнопка, которая выполняет следующие действия:

NSMutableDictionary * params = [NSMutableDictionary dictionary];
[params setObject:FACEBOOK_APP_ID forKey:@"client_id"];
[[SHARED_APP facebook] setSessionDelegate:self];
[[SHARED_APP facebook] dialog:@"oauth" andParams:params andDelegate:self];

, где мой контроллер также соответствуетпротокол FBSessionDelegate
и SHARED_APP - мой [[UIApplication sharedApplication] делегат]

Я реализовал метод

-(void)fbDidLogin {
    NSLog(@"fbDidLogin");
}

, и он сработал!

Затем я могу сделатьпоследующие вызовы таких методов, как

[[SHARED_APP facebook] requestWithGraphPath:@"me/friends" andDelegate:self];

для извлечения данных JSON (с FBRequestDelegate). При каждом запросе будьте внимательны, чтобы проверять возвращаемое значение, как описано здесь http://developers.facebook.com/blog/post/500, чтобы продолжать искать, что вы 'Вы все еще аутентифицированы

Надеюсь, это поможет

0 голосов
/ 17 ноября 2011

сопоставьте, конечно, это находится в классе делегата приложения, то есть: MYAPPAppDelegate.m значение приложения: (UIApplication *) приложение openURL: методы

0 голосов
/ 15 июля 2011

fbDidLogin вызывается объектом Facebook после успешного входа в систему , Поэтому, пожалуйста, не забудьте назначить seesionDeletegate:

  facebook = [[Facebook alloc] initWithAppId:kFacebookApiKey];
  facebook.sessionDelegate = self;
0 голосов
/ 25 декабря 2010

Когда вы выполните шаги из примера приложения, в свое пользовательское приложение, сделайте класс контроллера как singleton, и тогда он будет работать !!!

Большинство разработчиков выделяют и инициализируют 2 экземпляра, из-за чего никогда не вызывается делегат fbDidlogin.

Надеюсь, это поможет.

...