原生iOS Facebook SSO将不会返回应用程序

时间:2012-05-16 19:18:24

标签: objective-c ios xcode facebook

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

我已经关注了Facebook开发者网站上的iOS教程,我已经完成了以下工作:

  1. 创建了一个Facebook应用程序以获取Facebook App ID。
  2. 我已将此App ID分配给常量,并使用它在我的应用程序中初始化Facebook对象。
  3. 我确保我的应用程序被标记为多任务处理
  4. 我在URL下拉列表中的plist中设置了fbAPP_ID
  5. 我已经让我的AppDelegate成为了一个FBSessionDelegate并实现了非常简单的fbDidLogin和fbDidNotLogin委托方法。
  6. 版本:Lion,iOS 5.1,Facebook iOS 4.1.1上的XCode 4.3.2

    所有这一切,我仍然无法让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 porton:

    enter image description here

    Facebook App屏幕(大部分粉红色):

    Facebook App screen

    注意:我仅使用基本设置尝试了此操作,并且还使用了具有虚假iTunes商店ID但来自我的配置文件的相同捆绑ID的iOS Native应用设置。

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

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

    我错过了什么吗?还有什么我可以试着让Facebook回到我的应用程序吗?

    编辑:同样在调试时,我似乎找不到任何因某种原因调用openURL的地方。

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

    simulator safari error

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

4 个答案:

答案 0 :(得分:19)

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

确保url方案嵌套在名为“URL Schemes”的项目(确切的数组)下

此数组应包含可启动应用的所有可能的URL方案

有关URL方案的更好说明,请参阅附图。

url scheme http://f.cl.ly/items/243G1D0H39151q472V1t/Screen%20Shot%202012-05-16%20at%206.52.06%20PM.png

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

希望这有帮助!

答案 1 :(得分:3)

您只需按照以下步骤操作

第1步:

Facebook开发人员的一面:

如果您的应用已经提交,请填写iphone / ipad appstore id,否则请将其留空。 facebook developer account app id settings

第2步:

你的XCode中的下一个:

转到 Target > Info > URL Types&gt;点击加号图标并添加如下项目 - URL Scheme settings

在我的应用程序中,有两个选项通过Facebook和谷歌登录,所以我创建了两个URL类型。您可以看到第二个是Facebook URL类型设置。 URL计划将是您在开发时使用fb的Facebook开发人员帐户中的Facebook应用程序ID。因此,如果您的Facebook开发者应用ID为9876543267575645,则网址方案将变为fb9876543267575645

第3步:

接下来,您必须在info.plist中添加新密钥。因此,请保持在同一屏幕中并添加FacebookAppID,如下所示: info.plist settings

所有这些东西都会在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];
}

在此期间,必须在facebook

中初始化并合成AppDelegate.m个实例
@synthesize facebook = _facebook;

didFinishLaunchingWithOptions

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

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

但是当我创建第三个应用程序时,我从一开始就没有按照第1步第3步进行操作,并且重新定向工作!因此,当您在应用中登录Facebook时,我认为不需要Facebook开发者帐户原生iOS应用设置..

答案 2 :(得分:2)

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

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

这不起作用,因为密钥不是'URL类型','URL方案'和'URL标识符',而是'CFBundleURLTypes','CFBundleURLSchemes'和'CFBundleURLIdentifier'。 Xcode会在编辑器中将其重命名为“URL类型”,“URL方案”和“URL标识符”。

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

enter image description here

答案 3 :(得分:0)

上述所有内容或SO上的其他答案都不适用于我,尽管我似乎有完全相同的问题。

然而,当我启用“深层链接”时,它工作得很好,所以它可能是上述所有AND的组合,也是启用该选项。