fbDidLogin从未调用过(facebook-ios-sdk)

时间:2010-11-18 14:28:56

标签: ios facebook facebook-ios-sdk

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

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

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

修改

随着10月份的facebook api我部分地解决了我的问题。

10 个答案:

答案 0 :(得分:9)

我遇到了同样的问题并解决了它。你需要实施

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

在您的app委托类中,而不是您的自定义UIViewController或任何其他类。然后将来自您的应用代表的电话指向负责您的Facebook的任何控制器。

答案 1 :(得分:7)

您是否注册了应用以处理您的Facebook应用ID网址?如果没有,有说明如何在Facebook iOS SDK网站上这样做。您还需要告诉您的应用委托处理此URL的调用。为此,请将以下代码添加到您的应用委托实施中:

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

[控制器Facebook]是您的Facebook类的实例。

答案 2 :(得分:2)

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

    self.facebook.sessionDelegate = self;

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

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

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

是必要的。

答案 3 :(得分: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继续查看您仍然经过身份验证

希望有所帮助

答案 4 :(得分:1)

我刚遇到这个问题并相信我可能找到了你的解决方案。在Facebook上创建应用程序时,您必须编辑应用程序设置以允许本机ios应用程序。所选的ios软件包ID必须与您正在创建的应用程序中的软件包ID完全匹配。 Facebook声明他们在授权您的应用之前检查了这一点。有趣的是,如果您从设备中删除Facebook应用程序,然后尝试验证它使用Web浏览器,似乎完全转换这个“安全”。 Facebook不会发回错误消息,因此追踪会很有趣。我想我会把这个答案扔到那里,希望能为未来的开发者节省一些麻烦。我希望这会有所帮助。

答案 5 :(得分:1)

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

答案 6 :(得分: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。

亲切的问候。

答案 7 :(得分:0)

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

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

希望这有帮助。

答案 8 :(得分:0)

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

  facebook = [[Facebook alloc] initWithAppId:kFacebookApiKey];
  facebook.sessionDelegate = self;

答案 9 :(得分:0)

map确定它位于应用程序委托类中,即:MYAPPAppDelegate.m 意思是应用程序:(UIApplication *)app openURL:方法