Не удалось открыть активный сеанс после обновления Facebook SDK до 3,5

После обновления Facebook sdk до 3.5 при попытке выполнить openActiveSessionWithReadPermissions операция завершается с ошибкой. Вот фрагмент для открытия сеанса и обработки обратного вызова:

[FBSession openActiveSessionWithReadPermissions:@[@"email", @"user_hometown", @"user_location", @"user_birthday"]
                                   allowLoginUI:YES
                              completionHandler:
 ^(FBSession *session,
   FBSessionState state, NSError *error) {
     switch (state) {
         case FBSessionStateCreatedTokenLoaded:
         case FBSessionStateOpenTokenExtended:
         case FBSessionStateOpen:
         {
             completion(TRUE);
             break;
         }
         case FBSessionStateClosed:
         case FBSessionStateClosedLoginFailed:
             completion(FALSE);
             [FBSession.activeSession closeAndClearTokenInformation];
             break;
         default:
             break;
     }
 }];

Я попал в FBSessionStateClosedLoginFailed, и я получил FBSKLog следующим образом:

FBSDKLog: Cannot use the Facebook app or Safari to authorize, fb123456789012345 is not registered as a URL Scheme

Ответ 1

У меня была та же проблема (Facebook SDK 3.5.1)

Моя схема URL для Facebook была включена в пункт 1 в схемах URL-адреса Info.plist. Проблема исправлена, перемещая ее в пункт 0.

Ответ 2

У меня была та же проблема. Приведенный выше код исправил эту проблему. U должен отредактировать ваш файл .plist с помощью текстового редактора. Но в Xcode вы не увидите никаких изменений. Вместо типов URL-адресов - CFBundleURLTypes и вместо URL-схем должны быть CFBundleURLSchemes.

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>fb48524**********</string>
        </array>
    </dict>
</array>

Ответ 3

Кажется, у меня была схема URL, которая не соответствовала моему FacebookAppId. По какой-то причине это, похоже, не было проблемой раньше, но сейчас актуально. Убедитесь, что ваша схема URL-адресов Facebook - ваш FacebookAppID с префиксом fb (в ваших файлах .plist). Например:

FacebookAppId: 123456789012345

Типы URL → Пункт 0 → Схемы URL → Пункт 0: fb123456789012345

Ответ 4

adding URL Scheme in plist file is solved my problem

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>fb8947128947(fb<App ID>)</string>
        </array>
    </dict>
</array>
</plist>

Ответ 5

Я получаю ту же ошибку, но решается ниже иерархией info.plist:

`
 <key>URL Types</key>
 <array>  
   <dict>
     <key>URL Schemes</key>    
     <array>      
      <string>fb***</string>    
     </array>    
   </dict> 
 </array>
`

Ответ 6

Ответ Лолы работал у меня. Если у вас несколько типов URL - например. Facebook и один для вашего приложения - полезно дать тот, который вы обрабатываете самим идентификатором пакета, равным идентификатору вашего пакета приложений, а затем перебирайте URL-адреса, чтобы найти его.

В начале моего делегата приложения я просто запускаю:

NSArray *urlSchemes = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleURLTypes"];
for (NSDictionary *scheme in urlSchemes) {
    if ([[scheme objectForKey:@"CFBundleURLName"] isEqualToString:[[NSBundle mainBundle] bundleIdentifier]]) {
        self.urlScheme = [[scheme objectForKey:@"CFBundleURLSchemes"] objectAtIndex:0];
        break;
    }
}

а затем (поскольку у нас есть несколько сред с разными идентификаторами приложений FB)

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    if ([url.scheme hasPrefix:@"fb"]) {
        //Facebook callback
        return [FBSession.activeSession handleOpenURL:url];
    // else handle your own URL here