2012-03-19 4 views
6

ОБНОВЛЕНИЕ: Я понял, что проблема ниже возникает, если пользователь уже предоставил Facebook доступ к моему приложению, а затем восстановил мое приложение. В первый раз, когда пользователь выбирает кнопку Facebook в моем приложении, он переходит в приложение Facebook, чтобы получить аутентификацию, но поскольку статус проверки подлинности сохраняется в приложении Facebook, он немедленно возвращается в мое приложение без объяснений пользователю, а Метод postToFacebookWall не работает.Facebook SDK Вход в систему iOS с установленным Facebook установленным

ОБНОВЛЕНИЕ 2: В результате я нашел решение, найденное здесь: How to authorize user through a DIALOG with the NEW Facebook Connect iOS API? и избегал приложения 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 заменяется моим идентификатором приложения в моем коде).

ответ

3

Это звучит так, как будто это сценарий «только когда приложение было установлено, завершено, затем удалено, а затем переустановлено».

Вы должны уметь возвращаться к «классической аутентификации веб-представления», когда происходит эта конкретная вещь.

if (facebookAppDidNotReturnProperly) { 
    // therefore I must have been re-installed 
    // fallback to UIWebView 

    [facebook authorizeWithFBAppAuth:NO safariAuth:NO]; 
} 

С другой стороны, вы также можете использовать сафари auth тоже, я полагаю.

+0

Это звучит, как это может быть жизнеспособным. Я попробую. – Darren