IOS Facebook SDK Ошибка домена com.facebook.sdk Код 2 и код 7

Я разрабатываю приложение, которое позволяет пользователю входить в систему через Facebook (используя для этого SDK для него). Ошибка появляется, когда пользователь уже зарегистрировался в Facebook в настройках iPhone. Если нет - все работает правильно.

NSArray *permissions = [[NSArray alloc] initWithObjects:@"email", nil];
    [FBSession openActiveSessionWithReadPermissions:permissions
                                       allowLoginUI:YES
                                  completionHandler:
     ^(FBSession *session,
       FBSessionState state, NSError *error) {
         [self fbSessionStateChanged:session state:state error:error];
     }];

Я уже пытался установить разрешения как массив nil - ничего не изменилось.

Журнал:

Error Domain=com.facebook.sdk Code=2 "The operation couldn’t be completed.
(com.facebook.sdk error 2.)" UserInfo=0x1552c6c0 
{com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:SystemLoginDisallowedWithoutError,
com.facebook.sdk:ErrorSessionKey=<FBSession: 0xabe8100, state: FBSessionStateClosedLoginFailed,
loginHandler: 0x0, appID: APPIDHERE, urlSchemeSuffix: ,
tokenCachingStrategy:<FBSessionTokenCachingStrategy: 0x14b8f3d0>,
expirationDate: (null), refreshDate: (null),
attemptedRefreshDate: 0001-12-30 00:00:00 +0000, permissions:(null)>}

Иногда появляется ошибка с кодом 7. Я прочитал почти все темы, связанные с этой ошибкой.

Мои шаги:

  • Сравните идентификатор моего приложения в файле .plist с идентификатором пакета FB. Они одинаковы!!!
  • Мое приложение не находится в режиме песочницы!
  • Если я перехожу от [FBSession openActiveSessionWithReadPermissions:permissions в [FBSession openActiveSessionWithPermissions:permissions - он работает. Но он устарел.

Ответ 1

Да, после появления этой ошибки, если вы перейдете к настройкам, вы увидите, что настройка для этого приложения отключена. Но проблема в этом случае заключается в том, что пользователю никогда не было предложено разрешить доступ - то есть установка автоматически включалась в положение ВЫКЛ автоматически при первом доступе. Если пользователь спрашивал, то, конечно, это понятно, но это не так (это как если бы SDK молча и автоматически нажал "Не разрешать для пользователя" ). Вот почему это проблема.

Прежде чем читать дальше, я хочу отметить, что после установки параметра вы не можете просто повторить процесс, чтобы проверить его, потому что как только этот параметр установлен, он никогда не спросит пользователя (даже удаляя и переустанавливая приложение не помогает). Чтобы протестировать эту проблему, вам нужно reset разрешения, перейдя в Настройки → Общие → reset → reset Местоположение и конфиденциальность, прежде чем вы сможете повторить попытку повторить это.

Из тестирования я обнаружил, что если у вас есть offline_access в разрешениях, которые вы запрашиваете в первый раз, тогда он будет давать эту ошибку входа (а не запрашивать пользователя и устанавливать разрешение на ВЫКЛ). SDK не проверяет и не сообщает, что это разрешение не разрешено; он просто не может войти в систему.

Ответ 2

Вот как я получил свою работу. Передайте ему пустой массив разрешений.

NSArray *permissionsArray = @[];

Однако убедитесь, что у вас есть разрешения, которые вы хотите настроить на моей странице приложения facebook. Мне нужен был только по умолчанию, поэтому я был в порядке.

У меня такое ощущение, что facebook изменил его код на стороне сервера. Мое приложение работало нормально, а затем мой вход в FB сломался.

Ответ 3

Я думаю, что эти коды достаточно расплывчаты, что будет много разных вещей.

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

Ответ 4

Убедитесь, что вы правильно вставили в Facebook XML в свой Info.plist! (как видно здесь)

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>fb{your-app-id}</string>
    </array>
  </dict>
</array>
<key>FacebookAppID</key>
<string>{your-app-id}</string>
<key>FacebookDisplayName</key>
<string>{your-app-name}</string>
<key>LSApplicationQueriesSchemes</key>
<array>
  <string>fbapi</string>
  <string>fb-messenger-api</string>
  <string>fbauth2</string>
  <string>fbshareextension</string>
</array> 

Я забыл опустить фигурные скобки и вместо этого заменил внутренний текст, получив ошибку, которую ссылаются на этот пост. Убедитесь, что вы полностью заменили "{your-app-id}".