iOS Facebook SDK:必须使用活动访问令牌来查询当前用户的信息



我已经学习了很多例子,并研究了许多关于此访问令牌错误的问题,但我似乎不知道为什么会得到它或如何修复它。

我初始化Facebook就像他们在3.1sdk示例中所做的那样:

NSArray* permissions = [[NSArray alloc] initWithObjects:@"publish_stream", @"publish_actions", nil];
self.fb = [[FBSession alloc] initWithPermissions:permissions];
[self.fb openWithCompletionHandler:^(FBSession *session,
FBSessionState status,
NSError *error)
{
[self sessionStateChanged:session :status :error];
}];

这很好,用户会被要求接受Safari中的应用程序权限,然后返回到应用程序。当用户返回到应用程序时,我的FBSessionState为FBSessionStateOpen。

当我尝试这个:

[FBRequestConnection startForMeWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error)
{
[self showAlert:@"logged in?" result:result error:error];
}];

或者这个:

NSMutableDictionary* fbPost = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"post from iOS", @"message", nil];
[FBRequestConnection startWithGraphPath:@"me/feed" parameters:fbPost HTTPMethod:@"POST" completionHandler:^(FBRequestConnection *connection, id result, NSError *error)
{
[self showAlert:@"message posted?" result:result error:error];
}];

但我得到了:

FBSDKLog: FBURLConnection <#1126>:
Duration: 936 msec
Response Size: 0 kB
MIME type: text/javascript
Response:
{"error":{"message":"An active access token must be used to query information about the current user.","type":"OAuthException","code":2500}}

我已经从我的FBSession中获取了访问令牌,并将其放入Facebook的访问令牌调试器中,这表明我有一个好的令牌:

App ID: <hidden>
Metadata: {"sso":"iphone-safari"}
User ID: <hidden>
Issued:  1351525817 (about an hour ago)
Expires: 1356709817 (in about 2 months)
Valid:  True
Origin: Mobile Web Faceweb
Scopes: create_note photo_upload publish_actions publish_stream share_item status_update video_upload

我一定是在设置中遗漏了一些小细节。

提前感谢大家!

根据文档,https://developers.facebook.com/docs/reference/ios/3.1/class/FBRequestConnection

"请求使用由[FBSession-activeSession]表示的活动会话。">

这适用于处理请求的静态方法。因此,您要做的是确保设置了活动会话。执行以下操作:

[FBSession setActiveSession:self.fb];

就在您调用第一个FBRequestConnection start*方法之前。

过了一段时间,注意到FBSession.activeSession不是nil,在发送请求之前我缺少的是:

if (!FBSession.activeSession.isOpen) {
[FBSession openActiveSessionWithAllowLoginUI: YES];
}

在尝试使用登录前创建的FBSDKGraphRequest对象时,我在SDK的v4中遇到了这个错误。当我将其更改为在使用前(即登录后)立即创建FBSDKGraphRequest时,它运行良好。这个类的初始值设定项似乎设置了一些在请求启动时不会刷新的令牌。

登录后,我尝试更新请求的tokenString属性,但由于某种原因,这是readonly属性。

/*反对使用谷歌和脸书func应用程序(_application:UIApplication,open url:url,sourceApplication:String?,annotation:AnyObject)->Bool{let googleDidHandle=GIDSignIn.sharedInstance().handle(url,sourceApplication:sourceApplication,annotation:annotation)

let facebookDidHandle = FBSDKApplicationDelegate.sharedInstance().application(
application,

open:url,sourceApplication:sourceApplication,注释:注释)打印(facebookDidHandle)return googleDidHandle||facebookDidHandle}*/

所以我用,func应用程序(_application:UIApplication,打开url:url,选项:[String:AnyObject])->Bool{

return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: options) || GIDSignIn.sharedInstance().handle(url as URL!, sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String, annotation: options[UIApplicationOpenURLOptionsAnnotationKey])
}

xcode 8 beta 3,ios 10

你也可以试试这个,对我有效

func application(_ application: UIApplication,
open url: URL, 
options: [String: AnyObject]) -> Bool
{
let delegate = FBSDKApplicationDelegate.sharedInstance()
return delegate.application(application, open: url, 
sourceApplication: options["UIApplicationOpenURLOptionsSourceApplicationKey"] as! String, 
annotation: options["UIApplicationOpenURLOptionsAnnotationKey"])
}

最新更新