Ответ 1
У меня также возникли некоторые трудности при работе с платформой учетных записей и интеграцией с Facebook. Вот что я узнал и как я начал работать.
1. Убедитесь, что вы правильно настроили приложение на Facebook.
Вам нужно установить, как ваше приложение интегрируется с Facebook в Native iOS App и вводит идентификатор Bundle вашего приложения в указанное поле. (Изменить: обратите внимание, что идентификаторы пакетов чувствительны к регистру). Теперь вы можете установить для iTunes ID значение 0. Включите функцию входа в Facebook и установите для параметра "Тип приложения" вкладку расширенных настроек значение Родной/Рабочий стол.
Также установите App Secret в Client на Нет.
Если один или несколько из этих параметров установлены неправильно, скорее всего вы получите сообщение об ошибке The Facebook server could not fulfill this access request: remote_app_id does not match stored id
.
(Edit: вы также должны убедиться, что песочница отключена.)
2. Установка приложения Facebook в первый раз
При первой установке приложения через встроенную интеграцию с Facebook на iOS (и Mac OS X тоже) вы должны запросить только базовое разрешение на чтение! Здесь нет ничего, кроме email
, user_birthday
и user_location
. Использование user_about_me
, которое также является основным разрешением на чтение в соответствии с документацией в Facebook, не работает. Это довольно запутанно, если вы ранее работали с SDK Facebook JavaScript или PHP 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]);
}
}];