fbDidLogin никогда не вызывался (facebook-ios-sdk)

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

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

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

ИЗМЕНИТЬ

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


person Sefran2    schedule 18.11.2010    source источник
comment
Любой ответ об этом? Я сталкиваюсь с той же проблемой, когда запускаю DemoApp из FaceBook IOS SDK (GitHub)   -  person SkyEagle888    schedule 20.11.2010


Ответы (10)


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

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

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

person SmallChess    schedule 28.08.2011

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

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

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

person Jiri    schedule 23.11.2010
comment
Нужно ли это также, если я использую только всплывающее диалоговое окно facebook? - person Sefran2; 23.11.2010
comment
Есть ли у кого-нибудь ссылка на старый API Facebook? Хочу попробовать с такими. - person Sefran2; 23.11.2010

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

    self.facebook.sessionDelegate = self;

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

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

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

необходимо.

person Mike Bretz    schedule 10.01.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, чтобы убедиться, что вы все еще аутентифицированы

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

person Gryzorz    schedule 29.06.2011

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

person Steve    schedule 21.10.2011

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

person Pavel    schedule 28.10.2011

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

    - (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];

}

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

РЕДАКТИРОВАТЬ:

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

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

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

С уважением.

person pabloverd    schedule 28.04.2012

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

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

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

person Ankur    schedule 24.12.2010

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

  facebook = [[Facebook alloc] initWithAppId:kFacebookApiKey];
  facebook.sessionDelegate = self;
person burning brother    schedule 15.07.2011

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

person Chad    schedule 16.11.2011