12

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

我遵循了 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

相关信息.plist 端口:

在此处输入图像描述

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

Facebook 应用程序屏幕

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

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

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

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

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

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

模拟器 Safari 错误

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

4

4 回答 4

19

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

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

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

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

网址方案

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

希望这可以帮助!

于 2012-05-16T22:54:22.320 回答
3

所有你必须按照这些步骤

步骤1:

Facebook 开发者方面的东西:

如果您的应用已提交,请填写 iphone/ipad 应用商店 ID,否则将其留空。 facebook 开发者账号 app id 设置

第2步:

接下来在您的 XCode 中:

转到 Target > Info > URL Types>单击加号图标并添加这样的项目- URL 方案设置

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

第 3 步:

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

在成功的 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 开发人员帐户Native iOS App设置。

于 2014-01-07T12:36:45.157 回答
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,请右键单击->显示原始键/值。

在此处输入图像描述

于 2012-12-14T13:37:04.633 回答
0

尽管我似乎遇到了完全相同的问题,但上述任何一个或关于 SO 的其他答案都不适合我。

但是,当我启用“深度链接”时,它工作得很好,所以它可能是上述所有内容的组合并且也启用了该选项。

于 2013-10-19T11:52:51.770 回答