【问题标题】:Native iOS Facebook SSO won't return to app原生 iOS Facebook SSO 不会返回到应用程序
【发布时间】:2012-05-24 09:49:39
【问题描述】:

好的,这可能看起来像重复,但我已经解决了围绕该问题的所有问题,但我似乎仍然无法让它适用于我的应用程序。

我已按照 Facebook 开发者网站上的 iOS 教程进行操作,并完成了以下操作:

  1. 创建了一个 Facebook 应用来获取 Facebook 应用 ID。
  2. 我已将此 A​​pp ID 分配给一个常量,并使用它来初始化我的应用程序中的 Facebook 对象。
  3. 我已确保我的应用已标记为多任务处理
  4. 我已经在 URL 下拉列表下的 plist 中设置了 fbAPP_ID
  5. 我已将 AppDelegate 设为 FBSessionDelegate 并实现了非常简单的 fbDidLogin 和 fbDidNotLogin 委托方法。

版本:Lion 上的 XCode 4.3.2、iOS 5.1、Facebook iOS 4.1.1

所有这一切,我似乎仍然无法让 Facebook 在授权时将控制权交还给我的应用程序。它只是留在 Facebook 中。

代码:(注意这里FB_APP_ID改为基本号查看)

AppDelegate.h:

#import <UIKit/UIKit.h>
#import "FBConnect.h"

#define FB_APP_ID @"1234567890"

@interface AppDelegate : UIResponder <UIApplicationDelegate, FBSessionDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, strong) Facebook* facebook;

@end

AppDelegate.m:

#import "AppDelegate.h"

@implementation AppDelegate
@synthesize window = _window;
@synthesize facebook = _facebook;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    _facebook = [[Facebook alloc] initWithAppId:FB_APP_ID andDelegate:self];
    if (![_facebook isSessionValid])
    {
        [_facebook authorize:nil];
    }
}

- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL *)url
{
    return [_facebook handleOpenURL:url];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [_facebook handleOpenURL:url];
}

- (void)fbDidLogin
{
    NSLog(@"App logged in");
}

- (void)fbDidNotLogin:(BOOL)cancelled
{
    NSLog(@"App did not login");
}

@end

相关 Info.plist 端口:

Facebook 应用程序屏幕(大部分为粉红色):

注意:我仅使用基本设置进行了尝试,也尝试了 iOS 本机应用设置,使用虚假的 iTunes 商店 ID 但与我的配置文件中的捆绑 ID 相同。

无论我做什么,它总是会加载 Facebook 并要求授权我的应用程序,然后它只是关闭身份验证屏幕窗口并坐在我的 Facebook 屏幕上,而不是返回到我的应用程序。

另请注意:我知道它总是会询问,因为我没有检查身份验证令牌和到期日期.....这是下一步......现在我至少想让它返回在我担心这个之前我的应用程序。

我在这里错过了什么吗?还有什么我可以尝试让 Facebook 返回到我的应用的方法吗?

编辑:同样在调试时,我似乎无法找到任何一个 openURL 出于某种原因被调用的地方。

编辑#2:在模拟器上运行它时,它会通过 Safari 加载 FB 对话框(如预期的那样),然后当我授权时,safari 会抛出一个错误,就像他们试图用来返回我的 URL 一样应用无效:

这仍然不能告诉我太多,因为据我在 Info.plist 中所知,我的 fb1234567890 已正确设置。

【问题讨论】:

  • 你至少能登录一次吗?
  • 问题不在于登录。Facebook 弹出就好了,我可以点击 Authorize 或其他什么.....但它永远不会返回到应用程序...它只是留在 Facebook 中跨度>
  • 在 handleOpenURL 中放置一个断点或 NSLog 并检查它是否被调用,并且您是否为您的应用程序提供了一个唯一的 URL,Safari 将重定向到该 URL?
  • 当我调试它时,似乎都没有调用 handleOpenUrl 调用。至于唯一的 URL,我认为这就是我使用 fbAPP_ID 的 plist 部分的用途(如上所示)?第 6 步及以后进入 Graph 和 Feeds。在这一点上,我只是想让基本的 SSO 正常工作。

标签: objective-c ios xcode facebook


【解决方案1】:

您的 info.plist 似乎格式不正确

确保 url 方案嵌套在名为“URL 方案”的项目(确切地说是一个数组)下

这个数组应该包含所有可以启动你的应用的可能的 URL Schemes

有关 URL 方案的更好解释,请参见附图

此外,“URL 标识符”应该是您的包标识符:例如。 com.mycompany.myapp 这应该与您在配置文件中提供的标识符相匹配

希望这会有所帮助!

【讨论】:

  • 你先生真是太棒了 =) 谢谢!
  • 不客气!我也刚刚实现了 Facebook SSO,祝你好运!
  • @SRandazzo 我错过了URL Identifier,但一切仍按预期工作,但有时当我在 fb sso safari 上点击Okay 按钮时,它显示了我的应用程序的默认屏幕,但随后退出而没有继续流动。缺少的URL Identifier 有问题吗?
  • 我也遇到了同样的问题。我按照你说的做了。但它不会起作用。请看一下(stackoverflow.com/questions/29390170/…
【解决方案2】:

您必须遵循这些步骤

第 1 步:

Facebook 开发者方面的东西:

如果您的应用已提交,请填写 iphone/ipad appstore id,否则请留空。

第 2 步:

XCode 中的下一步:

转到 Target &gt; Info &gt; URL Types > 点击加号图标并添加这样的项目-

在我的应用程序中,有两个选项可以通过 facebook 和 google 登录,所以我创建了两个 URL 类型。您可以看到第二个是 Facebook URL 类型设置。 URL Scheme 将是您来自 Facebook 开发人员帐户的 facebook 应用程序 ID,开头为 fb。因此,如果您的 facebook 开发者应用程序 ID 是 9876543267575645,那么 URL Scheme 将变为 fb9876543267575645

第 3 步:

接下来,您必须在 info.plist 中添加一个新密钥。所以保持在同一个屏幕并添加FacebookAppID 像这个屏幕:

在成功的 facebook oauth 之后,所有这些东西都会让你的应用恢复原状。

第 4 步:

您将在 AppDelegate 课堂上休息。只需在AppDelegate.m中添加此方法

NSString *retURL = [NSString stringWithFormat:@"%@", url];    
if ([retURL rangeOfString:facebookid].location != NSNotFound)
{
    // if your application is coming back from facebook native app.
    return [_facebook handleOpenURL:url];
}
else
{
    // if your app is coming back from google plus oauth.
    return [GPPURLHandler handleURL:url sourceApplication:sourceApplication annotation:annotation];
}

在这一切过程中,必须在AppDelegate.m中初始化和合成facebook实例

@synthesize facebook = _facebook;

didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    _facebook = [[Facebook alloc] initWithAppId:facebookid];
    // rest of your code is already here......
}

还有一件更重要的事情。在我实施这些步骤的过程中,我也做了太多的研究来实现这一点,最后工作的东西就在这里。我在我的两个应用中进行了这些设置。

但是,当我创建第三个应用程序时,我从头开始,并没有遵循 STEP 1STEP 3 并且瞧....重定向工作!因此,当您在您的应用中进行 Facebook 登录时,我认为 Facebook 开发者帐户 Native iOS App 设置是不必要的..

【讨论】:

    【解决方案3】:

    我遇到了另一个问题。我编辑了原始的 Info.plist 文件并添加了:

    <key>URL Types</key>
    <array>
        <dict>
            <key>URL Schemes</key>
            <array>
                 <string>fbxxxxxxxxx</string>
            </array>
        </dict>
    </array>
    

    这不起作用,因为键不是“URL Types”、“URL Schemes”和“URL Identifier”,而是“CFBundleURLTypes”、“CFBundleURLSchemes”和“CFBundleURLIdentifier”。 Xcode 将在编辑器中将其重命名为“URL Types”、“URL Schemes”和“URL Identifier”。

    要确保在 xcode 中选择 Info.plist,请右键单击->显示原始键/值。

    【讨论】:

      【解决方案4】:

      上述方法或其他关于 SO 的答案均不适合我,尽管我似乎遇到了完全相同的问题。

      但是,当我启用“深度链接”时,它运行良好,因此它可能是上述所有内容的组合并启用了该选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-11
        • 2015-01-24
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多