【问题标题】:Facebook & iOS: Share an app ID across multiple appsFacebook 和 iOS:在多个应用程序之间共享一个应用程序 ID
【发布时间】:2013-02-02 23:11:03
【问题描述】:

按照 Facebook 的教程后,我在实现此功能时遇到了问题: https://developers.facebook.com/docs/howtos/share-appid-across-multiple-apps-ios-sdk/

基本上,我在同一个项目下有 2 个目标 - 一个用于免费版本,一个用于高级版本。我为此创建并设置了一个 Facebook 应用程序,并添加了 2 个 url 方案后缀:

另外,我在相应的 plist 文件中添加了后缀。例如,高级应用定义为:

“xxxxx...”只是我的 Facebook 应用 ID。

在这一切之后,我仍然无法在 iOS 5.0 和 6.0 上登录应用程序(使用原生 FB 对话框或 Safari 中的 SDK 对话框)。这是我通过 Safari 登录时得到的:

进行登录的代码是:

NSArray *permissions = kInitialPermissions;

BOOL result = NO;
FBSession *session = [[FBSession alloc] initWithAppID:@"xxxxxxxxxxx"
                                          permissions:@[]
                                      urlSchemeSuffix:@"premium"
                                   tokenCacheStrategy:nil];

if (allowLoginUI ||
    (session.state == FBSessionStateCreatedTokenLoaded)) {
    [FBSession setActiveSession:session];
}

result = [FBSession openActiveSessionWithReadPermissions:permissions
                                                allowLoginUI:allowLoginUI
                                           completionHandler:completion];
return result;

任何想法都会受到赞赏。谢谢!

【问题讨论】:

    标签: ios facebook facebook-ios-sdk url-scheme


    【解决方案1】:

    除了将 fbxxxxxxxxxxxxpremium URL Scheme 添加到 plist 文件中的 URL Types 数组(您似乎正在这样做)之外,还添加一个新的键/值:

    key = FacebookUrlSchemeSuffix
    value = premium
    

    所以在 plist 文件本身中:

    <key>FacebookUrlSchemeSuffix</key>
    <string>premium</string>
    

    这为我解决了问题。 Facebook 文档提到了这一点,但没有明确 IMO。

    【讨论】:

      【解决方案2】:

      您的问题是 iOS 无法识别自定义 URL 方案。以下是一些可能的原因:

      1. 我看到您已将 plist 中的 CFBundleURLSchemes 键正确设置为支持的方案数组。您还需要将CFBundleURLName 设置为com.myApp.MyURLScheme。你这样做了吗?

      2. 在调用 will 和 did 完成启动方法后,iOS 将调用您的应用代理的 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 方法。您还必须实现此方法并且它必须返回YES。你?

      3. 确保您的 URL 格式正确。 fbxxxxxxpremium://foo=bar 不起作用,但 fbxxxxxxpremium://?foo=bar 会起作用(? 是强制性的)。

      请注意,如果您的目标是 iOS 4.1 或更早版本,则委托方法会略有不同。

      有关更多信息和示例代码,请参阅 iOS SDK 文档中Advanced App Tricks与其他应用程序通信部分。

      【讨论】:

      • 感谢您的回答,亚伦。我按照您在 1 中的建议尝试了几个 CFBundleURLNames,但在成功登录 Safari 后,我仍然没有切换回应用程序。 2 已经在我的 AppDelegate 中实现。有什么建议吗?
      • 您在 Safari 中输入的 URL 是什么样的?如果不传递参数,它会起作用吗? (即只需输入fbxxxxxxpremium://
      • 在 safari 中输入“fbxxxxxxpremium://”会切换回应用程序。这里发生了什么?? :O
      • 您可能忘记了fbxxxxxxpremium:// 后面的?。你不能在问号之前传递参数。 fbxxxxxxpremium://foo=bar 不起作用,但 fbxxxxxxpremium://?foo=bar 会。 (我相信这种更严格的行为在 iOS 6 中是新的)。
      • 所以在我们弄清楚这一点之后,我应该在我的 plist 中定义什么以便应用程序处理上述 url 方案?
      【解决方案3】:

      我认为问题出在你打电话的时候:

      result = [FBSession openActiveSessionWithReadPermissions:permissions
                                                  allowLoginUI:allowLoginUI
                                             completionHandler:completion];
      

      正在打开的会话没有 url 方案后缀。

      所以你应该打电话给

      [session openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent 
              completionHandler:completion];
      

      【讨论】:

      • 谢谢@Moxy,我试过了,但仍然得到完全相同的结果。我对这种方法也有问题——它不等同于我的调用(没有在哪里指定初始权限)
      • 您可以在初始化会话时指定权限。在您的代码中,您正在传递一个空数组。你可以传递你想要的权限。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 2018-01-01
      • 2014-06-04
      • 1970-01-01
      相关资源
      最近更新 更多