ОБНОВЛЕНИЕ: Я понял, что приведенная ниже проблема возникает только в том случае, если пользователь уже предоставил Facebook доступ к моему приложению, а затем повторно устанавливает мое приложение. В первый раз, когда пользователь выбирает кнопку Facebook в моем приложении, он переходит в приложение Facebook для получения аутентификации, но поскольку статус аутентификации по-прежнему сохраняется в приложении Facebook, он немедленно возвращается в мое приложение без объяснения причин пользователю, и метод postToFacebookWall терпит неудачу.
ОБНОВЛЕНИЕ 2: Я в конечном итоге реализовал решение, найденное здесь: Как авторизовать пользователя через DIALOG с НОВЫМ API Facebook Connect iOS? и избегал приложения Facebook. Safari лучше, потому что, по крайней мере, пользователь получает сообщение о том, что он будет входить в систему. Однако диалог каналов по-прежнему не работает с первого раза, как и раньше.
У меня есть то, что должно быть общей проблемой, но я еще не смог найти решение. Обратите внимание, что мое приложение ограничено iOS 5 и выше.
У меня есть приложение с кнопкой Facebook для публикации на пользовательской стене. Когда кнопка будет нажата, приложение проверит, дал ли пользователь уже разрешение приложению на публикацию на стене. Если это так, появится представление с диалоговым окном канала с информацией о публикации на стене. Если они этого не сделали, Safari будет открыт, и пользователю будет разрешено войти в систему. После входа в систему они будут возвращены в приложение, и появится диалоговое окно «Лента».
Это работает как на симуляторе, так и на моем устройстве, если приложение Facebook не установлено. Если приложение Facebook установлено, пользователь переходит в приложение Facebook, но затем сразу же возвращается к исходному приложению, не позволяя пользователю ничего делать. Появится диалоговое окно веб-канала, но оно полностью пустое и автоматически закрывается. Повторное нажатие кнопки Facebook вызовет представление «Диалоговое окно ленты», как и предполагается, после того, как пользователь дал разрешение приложению на публикацию на своей стене.
Я в значительной степени следовал инструкциям, найденным здесь: http://developers.facebook.com/docs/mobile/ios/build/#implementsso
и здесь: http://developers.facebook.com/docs/reference/dialogs/feed/
В AppDelegate у меня есть следующий код:
- (void)loginToFacebook
{
// Set up facebook
self.facebook = [[Facebook alloc] initWithAppId:@"YOUR_APP_ID" andDelegate:self];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"]
&& [defaults objectForKey:@"FBExpirationDateKey"]) {
self.facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
self.facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
}
if (![self.facebook isSessionValid]) {
[self.facebook authorize:nil];
}
}
// This is an FBSessionDelegate protocol method
// that gets called after a successful login
- (void)fbDidLogin
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[self.facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[self.facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
[[NSNotificationCenter defaultCenter] postNotificationName:@"POST_TO_FACEBOOK_WALL" object:nil];
}
// This is a UIApplicationDelegate protocol method
// It is called when safari is dismissed
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [self.facebook handleOpenURL:url];
}
Единственное различие между этим и примером кода заключается в том, что я добавил NSNotification, который подхватывается моим контроллером представления, где у меня есть следующий код:
- (void)facebookButtonPressed:(UIControl*)sender
{
Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook];
if (![facebook isSessionValid])
{
// Login to facebook if not already logged in
[(AppDelegate*)[[UIApplication sharedApplication] delegate] loginToFacebook];
}
else
{
[self postToFacebookWall];
}
}
- (void)postToFacebookWall
{
Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook];
/*Facebook Application ID*/
// TODO: Get this either from the AppDelegate facebook property or the info plist
NSString *client_id = @"YOUR_APP_ID";
NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
kAppId, @"app_id",
@"http://developers.facebook.com/docs/reference/dialogs/", @"link",
@"http://fbrell.com/f8.jpg", @"picture",
@"Facebook Dialogs", @"name",
@"Reference Documentation", @"caption",
@"Using Dialogs to interact with users.", @"description",
nil];
[facebook dialog:@"feed" andParams:params andDelegate:self];
}
Кто-нибудь знает, как исправить мою проблему? (Кроме того, если это неясно, YOUR_APP_ID заменяется моим идентификатором приложения в моем коде).