FBSession: была сделана попытка повторного авторизации разрешений на неоткрытую сессию - программирование
Подтвердить что ты не робот

FBSession: была сделана попытка повторного авторизации разрешений на неоткрытую сессию

Я следую этому учебнику. для реализации предпросмотра представления в Facebook SDK 3.1, но когда я вызываю этот метод ...

// Ask for publish_actions permissions in context
    if ([FBSession.activeSession.permissions
         indexOfObject:@"publish_actions"] == NSNotFound) {
        // No permissions found in session, ask for it
        [FBSession.activeSession
         reauthorizeWithPublishPermissions:
         [NSArray arrayWithObject:@"publish_actions"]
         defaultAudience:FBSessionDefaultAudienceFriends
         completionHandler:^(FBSession *session, NSError *error) {
             if (!error) {
                 // If permissions granted, publish the story
                 [self publishStory];
             }
         }];
    } else {
        // If permissions present, publish the story
        [self publishStory];
    }

...

возвращает следующую ошибку:

* Завершение приложения из-за неперехваченного исключения 'com.facebook.sdk: InvalidOperationException', причина: 'FBSession: была сделана попытка Повторно разрешить разрешения на неоткрытую сессию '

Что происходит? Спасибо!

EDIT: Я рад, мой друг, большое спасибо, но все еще есть детали... Когда вы отправляете в первый раз, когда он просит разрешить приложение, я разрешаю этот блок падения

/*  * открыть новую сессию с разрешением публикации  */

  [FBSession openActiveSessionWithPublishPermissions:[NSArray arrayWithObject:@"publish_actions"]
                                   defaultAudience:FBSessionDefaultAudienceOnlyMe
                                      allowLoginUI:YES
                                 completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
                                     if (!error && status == FBSessionStateOpen) {
                                         [self publishStory];
                                     }else{
                                         NSLog(@"error");
                                        //Here I get the error mentioned below
                                     }
                                 }];
}

с ошибкой: ошибка:

domain = com.facebook.sdk, code = 5

4b9b3361

Ответ 1

Ошибка говорит о том, что FBSession не открывается. так что вы должны проверить, открыт ли сеанс перед попыткой повторного авторизации.

if ([[FBSession activeSession] isOpen]) {
  /* 
   * if the current session has no publish permission we need to reauthorize 
   */
  if ([[[FBSession activeSession] permissions]indexOfObject:@"publish_actions"] == NSNotFound) {

        [[FBSession activeSession] requestNewPublishPermissions:[NSArray arrayWithObject:@"publish_actions"] defaultAudience:FBSessionDefaultAudienceFriends
                                              completionHandler:^(FBSession *session,NSError *error){
                                                  [self postPhoto];
                                              }];

    }else{
        [self publishStory];
    }
}else{
    /* 
     * open a new session with publish permission 
     */
    [FBSession openActiveSessionWithPublishPermissions:[NSArray arrayWithObject:@"publish_actions"]
                                       defaultAudience:FBSessionDefaultAudienceOnlyMe
                                          allowLoginUI:YES
                                     completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
                                         if (!error && status == FBSessionStateOpen) {
                                             [self publishStory];
                                         }else{
                                             NSLog(@"error");
                                         }
                                     }];
}

Обязательно последовательно запрашивайте те же разрешения, которые должны быть publish_actions (помните о множественном числе).

Ответ 2

Вам также нужен другой метод в AppDelegate:

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    // attempt to extract a token from the url
    return [FBAppCall handleOpenURL:url
                  sourceApplication:sourceApplication
                    fallbackHandler:^(FBAppCall *call) {
                        NSLog(@"In fallback handler");
                    }];
}

Это будет обрабатывать обратный вызов URL, если аутентификация выполняется в сафари. После этого FBSession будет открыта.