FaceBook iOS - 如何检查我的Facebook应用是否已经获得授权?

7
我的问题是如何检查用户是否已经授权我的Facebook应用程序发布帖子,我找不到任何相关信息。
我正在使用:
 Facebook* facebook = [[Facebook alloc] initWithAppId:@"1234567"];
 [facebook authorize:[NSArray arrayWithObjects:@"read_stream", @"offline_access",nil] delegate:self];

当我打开应用时,会弹出一个对话框要求我授权该应用程序。完成后,我就可以愉快地使用它了,可以执行以下操作:

 [facebook dialog:@"feed" andDelegate:self];

在该应用程序上发布笔记。

但是,如果用户阻止或删除了应用程序,在显示发布对话框之前,我希望再次进行授权,但找不到在调用授权之前获取此类信息的方法。

任何帮助都将不胜感激。

谢谢。

2个回答

3
我也曾遇到此问题。
当调用对话框方法时,您发送一个应符合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 能添加一种方法来检查这种特定情况,或者添加一个处理未经授权应用程序问题的新委托方法。

0

我不确定如何使用Facebook的SDK来实现,但是你可以使用FQL来查询权限。查询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)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接