1

我正在使用弹出的 Facebook 对话框进行用户登录并在他/她的流上发布帖子

NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: apiKey, @"api_key", nil];
[facebook dialog:@"stream.publish" andParams:params andDelegate:self];

它可以工作,但是当用户登录时,永远不会调用 fbDidLogin 方法。为什么?这样我就无法请求用户名,并且访问令牌始终为空。

编辑

使用 october facebook api 我已经部分解决了我的问题。

4

10 回答 10

9

我只是遇到了同样的问题并解决了。您需要实施

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

在您的应用程序委托类中,而不是您的自定义 UIViewController 或任何其他类。然后将来自您的应用程序委托的调用定向到负责您的 Facebook 的任何控制器。

于 2011-08-28T14:47:15.973 回答
7

您是否注册了您的应用程序来处理您的 Facebook 应用程序 ID URL?如果没有,Facebook iOS SDK 网站上有说明如何操作。您还需要告诉您的应用代理处理对该 URL 的调用。为此,请将以下代码添加到您的应用委托实现中:

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

其中 [controller facebook] 是您的 Facebook 类的实例。

于 2010-11-23T12:15:34.107 回答
2

您需要在调用任何对话框方法之前设置 facebook 句柄的 sessionDelegate 成员变量。

    self.facebook.sessionDelegate = self;

您还需要在对象中实现 FBSessionDelegate 回调。

我没有为stream.publish检查这个,但这就是

[facebook dialog:@"oauth" andParams:params andDelegate:self];

是必要的。

于 2011-01-10T20:29:37.067 回答
1

Mike Bretz 方法对我有用。

我有一个类(一个视图控制器),它有一个执行以下操作的按钮:

NSMutableDictionary * params = [NSMutableDictionary dictionary];
[params setObject:FACEBOOK_APP_ID forKey:@"client_id"];
[[SHARED_APP facebook] setSessionDelegate:self];
[[SHARED_APP facebook] dialog:@"oauth" andParams:params andDelegate:self];

我的控制器也符合协议 FBSessionDelegate
和 SHARED_APP 是我的 [[UIApplication sharedApplication] 委托]

我实现了这个方法

-(void)fbDidLogin {
    NSLog(@"fbDidLogin");
}

它奏效了!

然后我可以对方法进行后续调用,例如

[[SHARED_APP facebook] requestWithGraphPath:@"me/friends" andDelegate:self];

检索 JSON 数据(使用 FBRequestDelegate)要小心,对于每个请求,测试返回值,例如此处解释的 http://developers.facebook.com/blog/post/500以继续查看您仍然经过身份验证

希望能帮助到你

于 2011-06-29T14:34:21.450 回答
1

您只需要在您的 App Delegate 中实现该方法,因为...

    - (void)fbDidLogin {
    NSLog(@"DID LOGIN!");

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[[self facebook] accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[[self facebook] expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];

}

您所犯的错误是您在自定义视图中实现此方法。

编辑:

上面的代码完美运行,但是如果你想在你的自定义 viewcontroller 上获得控件,你可以在你的 appDelegate 上维护该代码并将此代码添加到你的 CustomViewController 上:

     delegate= (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
    [delegate facebook].sessionDelegate=self;

因此,您将能够在您的 CustomViewController 中覆盖 fbDidLogin,不要忘记在您的 CustomViewController.h (Header) 上添加 FBSessionDelegate。

亲切的问候。

于 2012-04-28T15:08:22.363 回答
1

我刚遇到这个问题,相信我可能已经找到了您的解决方案。当您在 facebook 上创建应用程序时,您必须编辑您的应用程序设置以允许原生 ios 应用程序。所选的 ios 捆绑包 ID 必须与您正在创建的应用程序中的捆绑包 ID 完全匹配。Facebook 声明他们会在授权您的应用程序之前检查这一点。有趣的是,如果您从设备中删除 facebook 应用程序,然后尝试使用 Web 浏览器对其进行身份验证,并且似乎完全绕过了这种“安全性”。Facebook 不会发回错误消息,因此追踪起来很有趣。我想我会把这个答案放在那里,希望能为一些未来的开发者省去一些麻烦。我希望这有帮助。

于 2011-10-21T16:12:42.670 回答
1

在我的情况下,由于 info.plist 中的错误,没有调用 fbDidLogin。URL 方案应添加到 URL 类型中。在这里,fbMyAppId 字符串被添加为项目 0。(错误地我添加了 URL 标识符而不是 URL 方案)

于 2011-10-28T15:52:04.673 回答
0

映射确保它在应用程序委托类中,即:MYAPPAppDelegate.m 表示应用程序:(UIApplication *)应用程序 openURL:方法

于 2011-11-16T20:06:16.990 回答
0

当您按照示例应用程序中的步骤进入您的自定义应用程序时,将控制器类设为单例,然后它就可以工作了!!!

大多数开发人员分配和初始化 2 个实例,因此从不调用委托 fbDidlogin。

希望这可以帮助。

于 2010-12-24T23:24:40.140 回答
0

fbDidLogin 在登录成功后被 Facebook 对象调用,所以请记得分配 seesionDeletegate:

  facebook = [[Facebook alloc] initWithAppId:kFacebookApiKey];
  facebook.sessionDelegate = self;
于 2011-07-15T06:44:46.787 回答