iOS原生Facebook SSO无法返回应用程序

12

好的,这可能看起来像是重复的问题,但我已经浏览了所有与此问题相关的问题,但仍然无法让我的应用程序正常工作。

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

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

版本:XCode 4.3.2 on Lion,iOS 5.1,Facebook iOS 4.1.1

尽管如此,当Facebook授权时,我仍然无法让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端口:

enter image description here

Facebook应用程序屏幕(大部分被涂成粉色):

Facebook App screen

注意:我尝试了基本设置和iOS原生应用程序设置,使用了虚假的iTunes存储ID但是我的配置文件中有相同的bundle ID。

无论我做什么,它总是加载Facebook并要求授权我的应用程序,然后它简单地关闭授权屏幕窗口并停留在我的Facebook屏幕上,而不是返回到我的应用程序。

还要注意:我知道它会一直询问,因为我没有检查授权令牌和过期日期......那是下一步....现在我至少想让它返回到我的应用程序,然后再担心这个问题。

我错过了什么吗?还有其他我可以尝试让Facebook返回到我的应用程序的方法吗?

编辑:另外,在调试时,出于某种原因我无法找到任何调用openURL的位置。

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

simulator safari error

这仍然告诉我很少,因为据我所知,我的fb1234567890在Info.plist中设置正确。


你至少能够登录一次吗? - Amogh Talpallikar
问题不在于登录。Facebook 弹出窗口很好,我可以点击授权或其他操作.....但它从未返回到应用程序......它只停留在 Facebook。 - valheru
在 handleOpenURL 中设置断点或 NSLog,并检查它是否被调用,同时您是否为应用程序提供了一个唯一的 URL,以便 Safari 重定向到该 URL? - Amogh Talpallikar
在第6步之后阅读:https://developers.facebook.com/docs/mobile/ios/build/ - Amogh Talpallikar
当我调试它时,似乎没有任何一个handleOpenUrl调用被调用。至于唯一的URL,我认为这就是plist部分的作用(如上所示),我在其中使用了fbAPP_ID?第6步及其后面进入Graph和Feeds。此时,我只是想让基本的SSO工作。 - valheru
4个回答

19

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

请确保url scheme嵌套在名为"URL Schemes"的项目(确切地说是一个数组)下

该数组应包含所有可能启动您的应用程序的URL方案

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

url scheme

此外,“URL标识符”应为您的捆绑标识符:例如com.mycompany.myapp 这应与您在签署文件配置文件中提供的标识符匹配

希望这可以帮到您!


1
您真是太棒了 =) 谢谢! - valheru
不客气!我也刚刚实现了Facebook SSO,祝你好运! - SRandazzo
@SRandazzo 我缺少了“URL标识符”,但一切都按预期工作,但有时当我在fb sso safari上点击“确定”按钮时,它显示了我的应用程序的默认屏幕,但然后就退出了而没有继续流程。缺少“URL标识符”是一个问题吗? - geekay
我也遇到了同样的问题。我按照你说的做了,但是它不起作用。请看一下这个链接:(http://stackoverflow.com/questions/29390170/facebook-integration-v4-0-not-working-for-iphone-app?noredirect=1#comment46957737_29390170) - Balaji Ramakrishnan

3

只需按照以下步骤操作

第一步:

在Facebook开发者页面上完成以下设置:

如果您的应用程序已提交,则填写iPhone / iPad App Store ID,否则请留空。 facebook developer account app id settings

第二步:

接下来,在您的XCode中执行以下操作:

前往 Target > Info > URL Types > 点击加号并添加以下项目- URL Scheme settings

在我的应用程序中,可以选择通过 Facebook 和 Google 登录,因此我创建了两种 URL 类型。您可以看到第二个 URL 设置是 Facebook URL 类型设置。URL Scheme 将是从 Facebook 开发者帐户获取的 Facebook 应用程序 ID,以 fb 开头。因此,如果您的 Facebook 开发者应用程序 ID 是 9876543267575645,则 URL Scheme 将变为 fb9876543267575645

第三步:

接下来,您需要在 info.plist 中添加一个新键。所以在同一屏幕上添加FacebookAppID,如下图所示: info.plist settings

所有这些设置将在Facebook授权成功后将您的应用程序带回。

第四步:

然后在您的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开发人员帐户下的原生iOS应用程序设置。


2

我遇到了另一个问题。我编辑了原始的 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,在右键单击->显示原始键/值以确保。
请参考以下截图:enter image description here

0

以上提供的解决方案以及其他Stack Overflow中的答案对我都没有用,尽管我似乎遇到了完全相同的问题。

然而,当我启用“深度链接”时,它完美地解决了这个问题,因此可能是上述所有方法的综合效果,再加上启用该选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接