Интеграция Facebook – iOS (Social Framework) Недопустимое разрешение

Я работаю над двумя разными приложениями для iOS:

  • оба они делятся контентом с Facebook.
  • оба с iOS 6/7.
  • оба с Social Framework
  • в обоих из них у меня проблемы с обменом с Facebook.

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

Я специально следил за этим сообщением match-stor">Процедура публикации iOS 6 в Facebook заканчивается ошибкой remote_app_id не соответствует сохраненному идентификатору, у нее очень хороший ответ.

Я думаю, что я создал свои приложения в Facebook Developers в порядке, потому что у меня были проблемы (неправильный идентификатор iPhone и ошибка 7), и после сообщения, о котором я упомянул, эти проблемы исчезли.

Когда пользователь нажимает кнопку "Поделиться" в Facebook, я делаю следующее:

- (void) loginWithFacebookWithReadPermissionsWithDelegate:(id<IfcRRSSDelegate>)_delegate
{
    self.delegateFB = _delegate;

    ACAccountStore *account = [[ACAccountStore alloc]init];
    ACAccountType *accountType = [cuenta accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    NSString *facebookKey = MY_FACEBOOK_KEY;
    NSMutableArray *permimssions = [[NSMutableArray alloc] init];
    [permimssions addObject:@"email"];

    self.fbPermission = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
                            facebookKey, ACFacebookAppIdKey,
                            ACFacebookAudienceFriends, ACFacebookAudienceKey,
                            permimssions, ACFacebookPermissionsKey, 
                            nil];

    [account requestAccessToAccountsWithType:accountType options:self.fbPermission completion:
     ^(BOOL granted, NSError *error) {
         if(granted)
         {
             NSArray *accounts = [account accountsWithAccountType: accountType];
             ACAccount *_facebookAccount = [accounts lastObject];
             self.accountFB = _facebookAccount;
             ACAccountCredential *credentials = [self.accountFB credential];
             self.tokenFB = [credentials oauthToken];
         }
         else
         {
            // Show error 
         }
     }];
}

Если этот вход в систему проходит успешно (на самом деле он всегда проходит успешно), я вызываю это:

- (void) loginWithFacebookWithWritePermissionsWithDelegate:(id<IfcRRSSDelegate>)_delegate
{
    self.delegateFB = _delegate;

    ACAccountStore *account = [[ACAccountStore alloc]init];
    ACAccountType *accountType = [cuenta accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    NSString *facebookKey = MY_FACEBOOK_KEY;
    NSMutableArray *permimssions = [[NSMutableArray alloc] init];
    [permimssions addObject:@"publish_stream"];
    [permimssions addObject:@"publish_actions"];

    self.fbPermission = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
                            facebookKey, ACFacebookAppIdKey,
                            ACFacebookAudienceFriends, ACFacebookAudienceKey,
                            permimssions, ACFacebookPermissionsKey, 
                            nil];

    [account requestAccessToAccountsWithType:accountType options:self.fbPermission completion:
     ^(BOOL granted, NSError *error) {
         NSLog(@">>>>ERROR: %@", error);
         if(granted)
         {
             NSArray *accounts = [account accountsWithAccountType: accountType];
             ACAccount *_facebookAccount = [accounts lastObject];
             self.accountFB = _facebookAccount;
             ACAccountCredential *credentials = [self.accountFB credential];
             self.tokenFB = [credentials oauthToken];
         }
         else
         {
            // Show error 
         }
     }];
}

Этот второй вход в систему НЕ УДАЕТСЯ, я получаю эту ошибку:

ОШИБКА: Ошибка домена = com.apple.accounts Code = 7 «Сервер Facebook не смог выполнить этот запрос на доступ: Недопустимое разрешение: publish_stream» UserInfo = 0xc18d700 {NSLocalizedDescription = Сервер Facebook не смог выполнить этот запрос на доступ: Недопустимое разрешение: publish_stream}

Неверное разрешение: publish_stream??? С трудом могу найти информацию об этой ошибке.

Я пытался прокомментировать это разрешение и имею только publish_action, но когда я пытаюсь опубликовать, я получаю эту новую ошибку:

{
    code = 200;
    message = "(#200) The user hasn't authorized the application to perform this action";
    type = OAuthException;
}

Если бы этот второй вход прошел успешно, я бы вызвал этот код для публикации (но он никогда не вызывается, потому что второй вход не работает):

- (void) postWithFacebookWithMessage:(NSString *)msg
{
    if(self.accountFB)
    {
        NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
        [parameters setObject: self.accountFB.credential.oauthToken forKey:@"access_token"];
        [parameters setObject:msg forKey:@"message"];

        NSURL *requestUR = [NSURL URLWithString:@"https://graph.facebook.com/me/feed"];

        SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                                requestMethod:SLRequestMethodPOST
                                                          URL:requestURL
                                                   parameters:parameters];
        request.account = self.accountFB;
        [request performRequestWithHandler:^(NSData *data, NSHTTPURLResponse *response, NSError *error) {
            if(!error)
            {
                NSDictionary *list = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
                if([list objectForKey:@"error"] != nil)
                {
                    // Try to attempt Renew Credentials
                }
                else
                {
                    // Everything works
                }
                dispatch_async(dispatch_get_main_queue(),^{});
            }
            else
            {
                    // Try to attempt Renew Credentials
            }
        }];
    }
}

Если это важно, я проверил на своей странице в Facebook, в своей деятельности, в приложениях, в этом приложении, и там написано: «Это приложение может публиковаться от вашего имени только для вас».

Любая идея о том, что это происходит?

С уважением!

РЕДАКТИРОВАТЬ: Извините, я сделал важную ошибку, объясняя ошибку, поэтому я отредактировал сообщение: неудачный вызов facebook - это второй вход в систему, а не сообщение.


person Wonton    schedule 05.06.2014    source источник


Ответы (1)


Попробуйте этот код, который я использую в своем приложении:

__block ACAccount * facebookAccount;
        ACAccountStore *accountStore = [[ACAccountStore alloc] init];

    NSDictionary *emailReadPermisson = @{
                                         ACFacebookAppIdKey : @"0123456789",
                                         ACFacebookPermissionsKey : @[@"email"],
                                         ACFacebookAudienceKey : ACFacebookAudienceEveryone,
                                         };

    NSDictionary *publishWritePermisson = @{
                                            ACFacebookAppIdKey : @"0123456789",
                                            ACFacebookPermissionsKey : @[@"publish_actions"],
                                            ACFacebookAudienceKey : ACFacebookAudienceEveryone
                                            };

    ACAccountType *facebookAccountType = [accountStore
                                          accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    //Request for Read permission

    [accountStore requestAccessToAccountsWithType:facebookAccountType options:emailReadPermisson completion:^(BOOL granted, NSError *error) {

        if (granted) {

            NSLog(@"Granted for read");

            //Request for write permission
            [accountStore requestAccessToAccountsWithType:facebookAccountType options:publishWritePermisson completion:^(BOOL granted, NSError *error) {

                if (granted) {

                    NSLog(@"Granded for post");

                    NSArray *accounts = [accountStore
                                         accountsWithAccountType:facebookAccountType];
                    facebookAccount = [accounts lastObject];
                    NSLog(@"Successfull access for account: %@", facebookAccount.username);
                    /* Do any things here */
                }
                else
                {
                    NSLog(@"Access to Facebook is not granted");

                    // Fail gracefully...
                    NSLog(@"%@",error.description);
                }
            }];
        }else{
             /* Error */
        }
    }];

Этот образец был найден в этом сообщении.

И если вы получаете состояние «не предоставлено» для вашей учетной записи - проверьте, не заблокировано ли ваше приложение в Settings->Facebook. Если да - попросите пользователя дать доступ из настроек.

person Vladislav Kovalyov    schedule 14.06.2014
comment
Идеально! Это сработало! Большое спасибо! Я думаю, проблема заключалась в том, как запрашивались разрешения. - person Wonton; 04.07.2014
comment
Простая замена publish_stream на publish_actions сработала для меня, надеюсь, этот комментарий поможет другим, работающим над главой интеграции Facebook Рэя Вендерлиха с iSocial. - person Stuart P.; 20.08.2014
comment
@vladislav, он работает в iOS 7, но я пытаюсь опубликовать его в iOS8, он попадает в NSLog(@Granted for post); этот раздел, но когда вы собираетесь поделиться публикацией, она выдаст ошибку: «Статус запроса был 403», что не так? - person iPhoneDev; 16.10.2014
comment
Чтение руководства facebook о разрешении. Разрешения, не требующие проверки Разрешения общедоступного профиля (по умолчанию). Приложение друзья. Разрешения электронной почты publish_actions: — вашему приложению не нужно запрашивать разрешение publish_actions, чтобы использовать диалоговое окно ленты, диалоговое окно запросов или диалоговое окно отправки — вашему приложению не нужно запрашивать разрешение publish_actions чтобы использовать диалоговое окно ленты новостей, диалоговое окно запросов или диалоговое окно отправки, проверьте [ссылку]developers.facebook.com/docs/facebook-login/permissions/ - person iPhoneDev; 17.10.2014
comment
Тем не менее я получил (# 200) Пользователь не авторизовал приложение для выполнения этого действия. Пожалуйста, помогите - person Nikkie; 17.10.2014