Диалоговое окно публикации фида Facebook в iOS не отображается после аутентификации

Спасибо за чтение.

Я столкнулся с проблемой с диалоговым окном фида Facebook iOS SDK после аутентификации, но напрасно.

Что работает: я создал образец приложения "Hello, World" с помощью Руководство по Facebook для iOS с диалоговым окном ленты. Этот учебник работает нормально, и я могу видеть сообщение в своей ленте.

Проблема: когда я интегрировал этот код в свое приложение, я не вижу диалоговое окно канала после аутентификации, когда управление возвращается к моему приложению.

Поток управления: у меня есть UIImagePickerController, показывающий камеру, которая делает снимок, затем показывает UIAlertView, чтобы указать, что изображение загружается, показывает UIAlertView, чтобы отобразить результат, возвращенный с сервера, и, наконец, показывает a UIActionSheet для отображения различных вариантов обмена (поделиться в Facebook, Twitter и т. д.).

Когда пользователь нажимает «Поделиться в Facebook», вызывается следующий selector:


- (void) initFacebook
{
    //Init Facebook
    facebook = [[Facebook alloc] initWithAppId:@"308136969223987" andDelegate:self];

    //Check for access_token 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if([defaults objectForKey:@"FBAccessTokenKey"]
       && [defaults objectForKey:@"FBExpirationDateKey"]) {
        facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
    }

    if(![facebook isSessionValid]) {
        [facebook authorize:nil];
    }

    NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
  kAppId, @"app_id",
  @"https://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",
  @"Facebook Dialogs are so easy!",  @"message",
  nil];

  [_facebook dialog:@"feed" andParams:params andDelegate:self];  
}

Это запускает приложение Facebook для аутентификации, а затем снова открывает мое приложение с UIImagePickerController, но не показывает Feed Dialog.

Может кто-нибудь, пожалуйста, помогите мне?


person Sagar Hatekar    schedule 17.01.2012    source источник


Ответы (1)


Вы должны снова вручную вызвать нужный метод, в вашем случае -(void)initFacebook, в -(void)fbDidLogin FBSessionDelegate.

Кроме того, чтобы сделать это более общим, я сделал небольшой трюк после [авторизации в Facebook: nil]; Я установил ожидающую цель и селектор для хранения ожидающей команды, которую необходимо выполнить после входа в систему. Что-то вроде этого...

id fbPendingTarget;
SEL fbPendingAction;

    if (![delegate.facebook isSessionValid]) {
        [delegate.facebook authorize:nil]; // Facebook app or Safari login, mustitask

        // Save pending actions
        delegate.fbPendingTarget = self;
        delegate.fbPendingAction = @selector(facebookButtonPressed);

        [self retain]; // *** hold on to self if you will release self and is using fbPendingTarget as self
    } 

и когда делегат срабатывает, он запускает ваше ожидающее действие...

- (void)fbDidLogin {
    [self storeAuthData:[facebook accessToken] expiresAt:[facebook expirationDate]];
    [self apiFQLIMe]; // request user info

    // perform any pending actions after login
    if ([fbPendingTarget respondsToSelector:fbPendingAction]) {
        [fbPendingTarget performSelector:fbPendingAction];
    }
    self.fbPendingTarget = nil;
    self.fbPendingAction = nil;

    [self release]; // *** let go of self after we finished everything
}

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

-(void)fbDidNotLogin:(BOOL)cancelled {
    UIAlertView *alertView = [[[UIAlertView alloc] initWithTitle:@"Cannot Connect"
                                                         message:@"There was an error while connecting to Facebook. Please try Again."
                                                        delegate:self
                                               cancelButtonTitle:@"OK"
                                               otherButtonTitles:nil] autorelease];
    [alertView show];

    self.fbPendingTarget = nil;
    self.fbPendingAction = nil;

    [self release]; // *** let go of self after we finished everything
}

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

Изменить: я считаю, что лучше установить fbPendingTarget для какого-либо объекта, который существует на протяжении всего жизненного цикла приложения (например, appDelegate), чем установить значение self. Это связано с тем, что во многих случаях ваш self представляет собой представление, которое будет выпущено сразу после того, как пользователь отправит сообщение в Facebook. Отправка сообщения освобожденному объекту приведет к сбою вашего приложения.

Грязный способ обойти это — явно использовать [self retain] перед отправкой, а затем [self release] в вашем fbPendingAction. Но это сохранило бы в себе все остальное, что должно быть высвобождено к тому времени. Я просто считаю, что проще установить значение appDelegate, так как большинство действий, которые вы будете выполнять, — это просто отображение предупреждения. Я отредактирую код только в целях безопасности.

person Hlung    schedule 01.02.2012