Процедура публикации iOS 6 в Facebook заканчивается ошибкой "remote_app_id не соответствует сохраненному идентификатору"

Я пытаюсь выполнить простую процедуру публикации:

- (IBAction)directPostClick:(id)sender {
    self.statusLabel.text = @"Waiting for authorization...";
    if (self.accountStore == nil) {
        self.accountStore = [[ACAccountStore alloc] init];
    }   
    ACAccountType * facebookAccountType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    NSArray * permissions = @[@"publish_stream", @"user_checkins", @"publish_checkins", @"user_likes", @"user_videos"];
    NSDictionary * dict = @{ACFacebookAppIdKey : @"My app id here", ACFacebookPermissionsKey : permissions, ACFacebookAudienceKey : ACFacebookAudienceOnlyMe};
    [self.accountStore requestAccessToAccountsWithType:facebookAccountType options:dict completion:^(BOOL granted, NSError *error) {
        __block NSString * statusText = nil;
        if (granted) {
            statusText = @"Logged in";
            NSArray * accounts = [self.accountStore accountsWithAccountType:facebookAccountType];
            self.facebookAccount = [accounts lastObject];
            NSLog(@"account is: %@", self.facebookAccount);
            self.statusLabel.text = statusText;
            [self postToFeed];
        }
        else {
            self.statusLabel.text = @"Login failed";
            NSLog(@"error is: %@", error);
        }
    }];
} 

Отредактировано: проблема в том, что, когда я нажимаю на кнопку OK оповещения (не разрешать, тоже не работает) ничего не происходит! - Это поведение теперь изменилось с этой iOS 6, процедура публикации в Facebook заканчивается "remote_app_id не совпадает с сохраненным идентификатором", поэтому вместо просто "ничего не происходит", у меня есть ошибка "Сервер Facebook не смог выполнить этот запрос на доступ: remote_app_id делает не соответствует сохраненному идентификатору

Таким образом, кажется, что обработчик щелчков в представлении предупреждений ничего не делает, мой завершение не вызывается. У меня уже есть похожая проблема: iOS 6 Социальная интеграция - перейдите к вопросу настроек И я думаю, что здесь та же проблема. Что вы, ребята, думаете об этом? PS Я работаю на MAC mini, OS X 10.8.1 с последней версией xcode 4.5 (4G182) и использую симулятор iPhone 6.0.

ДОБАВЛЕНО: По просьбе Бьорна добавление postToFeed метод, хотя он никогда не вызывается:

- (void)postToFeed {
    NSDictionary * parameters = @{@"message" : @"Hello world!"};
    NSURL * feedUrl = [NSURL URLWithString:@"https://graph.facebook.com/me/feed"];
    SLRequest * request = [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodPOST URL:feedUrl parameters:parameters];
    request.account = self.facebookAccount;
    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.statusLabel.text = @"Posted!";
        });
    }];
}

2 ответа

Решение

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

1. Убедитесь, что вы правильно настроили свое приложение на Facebook
Вам нужно установить, как ваше приложение интегрируется с Facebook в собственное приложение iOS и ввести идентификатор пакета вашего приложения в указанное поле. (Редактировать: обратите внимание, что идентификаторы пакетов чувствительны к регистру.) Пока вы можете установить iTunes ID на 0. Включите вход в Facebook и установите Тип приложения на вкладке дополнительных настроек в " Собственный" / "Рабочий стол".
Также установите App Secret в клиенте на Нет.

Если один или несколько из этих параметров установлены неправильно, очень вероятно, что вы получите ошибку The Facebook server could not fulfill this access request: remote_app_id does not match stored id,

(Изменить: Вы также должны убедиться, что песочница отключена.)

2. Установка приложения Facebook в первый раз
При первой установке приложения через встроенную интеграцию с Facebook на iOS (и Mac OS X тоже) вы должны запросить только базовое разрешение на чтение! Ничего другого как email, user_birthday а также user_location здесь разрешено С помощью user_about_me, который также является базовым разрешением на чтение согласно документации Facebook, не работает. Это довольно запутанно, если вы ранее работали с Facebook JavaScript SDK или Facebook PHP SDK, потому что он запрашивает базовые разрешения по умолчанию без необходимости что-либо делать. Facebook также обновил свою документацию с помощью небольшого пошагового руководства по использованию нового SDK Facebook на iOS 6.

3. Запрос дополнительных разрешений
Важно знать, что вы не можете запрашивать разрешения на чтение и запись одновременно. Это также то, что опытные разработчики SDK Facebook могут найти путаницей. Запрашивая read_stream разрешение вместе с publish_stream разрешение приведет к сбою запроса, что приведет к ошибке . Приложение может не запрашивать разрешения на чтение и запись одновременно.

Поскольку Facebook на самом деле не делает различий между разрешениями на чтение / запись в Справочнике разрешений, вы должны определить разрешения на запись самостоятельно. Они обычно имеют префикс manage_*, publish_*, create_* или с суффиксом *_management,

Facebook также не рекомендует запрашивать дополнительные разрешения сразу после получения основных разрешений. Документация гласит: "Теперь вы должны запрашивать разрешение на чтение и публикацию отдельно (и в таком порядке). Скорее всего, вы будете запрашивать разрешения на чтение для персонализации при запуске приложения и первом входе пользователя в систему. Позже, при необходимости, ваш Приложение может запрашивать разрешения на публикацию, когда оно намеревается опубликовать данные в Facebook. [...] Запрашивая два типа отдельно, также значительно увеличивается вероятность того, что пользователи предоставят разрешения на публикацию, так как ваше приложение будет искать их только тогда, когда это необходимо. их, скорее всего, когда пользователь имеет более сильные намерения. "

4. Пример кода
Следующий пример кода должен работать на iOS и Mac OS X:

ACAccountType * facebookAccountType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

// At first, we only ask for the basic read permission
NSArray * permissions = @[@"email"];

NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"My app id here", ACFacebookAppIdKey, permissions, ACFacebookPermissionsKey, ACFacebookAudienceOnlyMe, ACFacebookAudienceKey, nil];

[self.accountStore requestAccessToAccountsWithType:facebookAccountType options:dict completion:^(BOOL granted, NSError *error) {
    if (granted && error == nil) {
        /** 
        * The user granted us the basic read permission.
        * Now we can ask for more permissions
        **/
        NSArray *readPermissions = @[@"read_stream", @"read_friendlists"];
        [dict setObject:readPermissions forKey: ACFacebookPermissionsKey];

        [self.accountStore requestAccessToAccountsWithType:facebookAccountType options:dict completion:^(BOOL granted, NSError *error) {
            if(granted && error == nil) {
                /**
                * We now should have some read permission
                * Now we may ask for write permissions or
                    * do something else.
                **/
            } else {
                NSLog(@"error is: %@",[error description]);
            }
        }];
    } else {
        NSLog(@"error is: %@",[error description]);
    }
}];

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

Другие вопросы по тегам