10

After updating the Facebook sdk to 3.5, when trying to perform openActiveSessionWithReadPermissions the operation fails. Here is the snippet for opening the session and handling the callback:

[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;
     }
 }];

I end up in the FBSessionStateClosedLoginFailed case and I get a FBSKLog as follows:

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

6 回答 6

25

我有同样的问题(Facebook SDK 3.5.1)

我的 Facebook URL 方案位于 Info.plist URL 方案中的第 1 项。通过将其移至项目 0 解决了问题。

于 2013-04-25T11:05:09.283 回答
16

我有同样的问题。上面的代码解决了这个问题。你必须用文本编辑器编辑你的 .plist 文件。但是在 Xcode 中你不会看到任何变化。而不是 URL 类型 - CFBundleURLTypes 而不是 URL Schemes 应该是 CFBundleURLSchemes。

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>fb48524**********</string>
        </array>
    </dict>
</array>
于 2013-07-04T19:37:53.483 回答
10

似乎我的 URL 方案与我的 FacebookAppId 不匹配。无论出于何种原因,这在以前似乎不是问题,但现在很重要。确保您的 Facebook URL Scheme 是带有 fb 前缀的 FacebookAppID(在您的 .plist 文件中)。例如:

FacebookAppId:123456789012345

URL 类型 -> 项目 0 -> URL 方案 -> 项目 0:fb123456789012345

于 2013-04-19T21:22:49.277 回答
2
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>
于 2013-05-14T12:45:25.593 回答
2

我遇到了同样的错误,但通过下面的 info.plist 层次结构解决了:

`
 <key>URL Types</key>
 <array>  
   <dict>
     <key>URL Schemes</key>    
     <array>      
      <string>fb***</string>    
     </array>    
   </dict> 
 </array>
`
于 2014-09-12T08:00:22.380 回答
1

萝拉的回答对我有用。如果您有多种 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 应用程序 ID 的环境)

-(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
于 2013-04-26T12:58:00.547 回答