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

我跟着很多例子,看了很多关于这个访问令牌错误的问题,但我似乎无法找出为什么我得到它或如何解决它。

我像在3.1 sdk示例中一样初始化Facebook:

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的访问令牌debugging器,它显示我有一个很好的令牌:

 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开始*方法之前。

那么过了一段时间,注意到FBSession.activeSession不是零,我发送请求之前缺less的是:

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

当试图使用在login之前创build的FBSDKGraphRequest对象时,我在SDK的v4中出现了这个错误。当我改变这个在使用之前立即创buildFBSDKGraphRequest (即在login之后),它工作正常。 看来这个类的初始化器设置了一些在请求开始时没有刷新的标记。

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

/ *弃用谷歌和Facebook的func应用程序(_应用程序:UIApplication,打开url:URL,sourceApplication:string,注释:AnyObject) – > Bool {let googleDidHandle = GIDSignIn.sharedInstance()。handle(url,sourceApplication:sourceApplication,注释:注释)

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

打开:url,sourceApplication:sourceApplication,annotation:annotation)print(facebookDidHandle)return googleDidHandle || facebookDidHandle} * /

所以我用func应用程序(_ application:UIApplication,open url:URL,options:[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"]) }