Диалог публикации в iOS Facebook не появляется после аутентификации - PullRequest
1 голос
/ 18 января 2012

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

Я прошел через Диалоговое окно Facebook iOS SDK Feed после аутентификации , но тщетно.

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

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

Поток управления: У меня есть UIImagePickerController, показывающий камеру, которая делает снимок, а затем показывает UIAlertView, чтобы указать, что изображение загружается, показывает UIAlertView дляотобразить результат, возвращенный с сервера, а затем, наконец, отобразить 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.

Может кто-нибудь помочь мне?

1 Ответ

4 голосов
/ 01 февраля 2012

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

Кроме того, чтобы сделать это более общим, я сделал небольшой трюк после [facebook authorize: 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, поскольку большинство действий, которые вы будете выполнять, - это просто отображать предупреждение. Я буду редактировать код только ради безопасности.

...