我正在使用弹出式Facebook对话框进行用户登录并在他/她的信息流中发布帖子
NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: apiKey, @"api_key", nil];
[facebook dialog:@"stream.publish" andParams:params andDelegate:self];
它可以工作,但是当用户登录时,永远不会调用fbDidLogin方法。 为什么? 这样我就无法请求用户名,访问令牌也始终为空。
修改
随着10月份的facebook api我部分地解决了我的问题。
答案 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:方法