我的问题是如何检查我的FaceBook应用程序是否已被用户授权发布,无法找到任何相关信息。
我正在使用:
Facebook* facebook = [[Facebook alloc] initWithAppId:@"1234567"];
[facebook authorize:[NSArray arrayWithObjects:@"read_stream", @"offline_access",nil] delegate:self];
弹出一个对话框,要求我授权该应用,完成后我很好,可以做:
[facebook dialog:@"feed" andDelegate:self];
在该应用上发布笔记。
但是,如果用户在显示发布对话框之前阻止或删除了我想再次进行授权的应用程序,则在调用授权之前找不到获取该类信息的方法。
感谢任何帮助。
感谢。
答案 0 :(得分:3)
我也必须处理这个问题。
调用dialog方法时,发送一个符合FBDialogDelegate的委托,该委托有一个方法,当对话由于错误而无法加载时调用该方法。但是在应用程序未经授权的情况下,对话框会向用户显示登录屏幕,但在设置用户和密码后,会出现第二个表单,让用户知道发生了错误。委托也被调用,但收到的错误只是表明他的方法失败了,没有确切的原因,甚至错误号。应该在任何事情之前使用正确的错误调用此方法,以便应用程序可以相应地执行操作。
所以我找到了一个解决方案,也许这不是最好的方法,但它确实有效。如果应用程序未被用户授权,您通过请求对Facebook图形API执行的任何调用都将失败。所以我做的是在调用feed对话框方法之前检查它。
添加以下行,您需要测试该应用是否仍然有效:
if ([facebook isSessionValid])
//isSessionValid only checks if the access token is set, and the expiration date is still valid. Lets make a call and see if we really are authorized to post to this user from this app.
[facebook requestWithGraphPath:@"me" andDelegate:self];
else
//authorize Facebook connect
这将只调用返回用户基本信息的方法。如果一切正常,将从委托调用以下方法:
- (void)request:(FBRequest *)request didLoad:(id)result
{
//Everything is ok. You can call the dialog method. It should work.
}
如果应用程序未被用户授权,则会调用委托中的以下方法:
- (void)request:(FBRequest *)request didFailWithError:(NSError *)error;
{
NSString *type = [[[error userInfo] objectForKey:@"error"] objectForKey:@"type"];
if (type)
{
if ([type isEqualToString:@"OAuthException"]) //aha!
{
//user has unauthorized the app, lets logout from Facebook connect. Also clear the access and expiration date tokens
[facebook logout:self];
//Call the authorize method again. Or let the user know they need to authorize the app again.
}
}
}
所以,正如我之前所说,不是最好的方式,而是完成工作。希望Facebook将添加一种方法来检查这个特定的场景,或者向代表添加一个新的方法来处理未经授权的应用程序问题。
答案 1 :(得分:0)
我不确定如何使用Facebook的SDK完成此操作,但您可以使用FQL来查询permissions。查询URL看起来像
https://api.facebook.com/method/fql.query?query=SELECT+uid,+read_stream,+offline_access+FROM+permissions+WHERE+uid=me()&access_token=...
看似requestWithMethodName:andParams:andHttpMethod:andDelegate:
传递fql.query
因为方法可行,只要您可以安排isSessionValid
为真(或以某种方式提供access_token
在你自己的params。)