【问题标题】:iOS Facebook SDK: An active access token must be used to query information about the current useriOS Facebook SDK:必须使用活动访问令牌来查询有关当前用户的信息
【发布时间】:2012-10-19 02:25:46
【问题描述】:

我已经关注了许多示例,并查看了有关此访问令牌错误的许多问题,但我似乎无法找出我得到它的原因或如何解决它。

我像在 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 的访问令牌调试器,它表明我有一个好的令牌:

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

我一定是在设置或其他东西中遗漏了一些小细节。

提前谢谢大家!

【问题讨论】:

    标签: ios facebook facebook-ios-sdk


    【解决方案1】:

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

    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"])
    }
    

    【讨论】:

      【解决方案2】:

      /* 不推荐用于 google 和 facebook func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: AnyObject) -> Bool { 让 googleDidHandle = GIDSignIn.sharedInstance().handle(url, 源应用程序:源应用程序, 注释:注释)

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

      打开:网址, 源应用程序:源应用程序, 注释:注释) 打印(facebookDidHandle) 返回 googleDidHandle || facebookDidHandle } */

      所以我用了, func应用程序(_应用程序: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

      【讨论】:

        【解决方案3】:

        我在 SDK 的 v4 中尝试使用在登录之前创建的 FBSDKGraphRequest 对象时遇到此错误。当我将其更改为在使用它之前立即创建 FBSDKGraphRequest 时(即在登录后)它工作得很好。似乎此类的初始化程序设置了一些在请求启动时未刷新的令牌。

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 我并没有真正找到接受的答案解决了我的问题,但这个解决了。
          【解决方案5】:

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

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

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

          [FBSession setActiveSession:self.fb];
          

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

          【讨论】:

          • 谢谢!我知道它必须是小东西:)
          • @C Abernathy 什么是“FBSession”?在内置课程中?我不能在我的项目中导入这个?执行此操作需要任何额外的框架吗?
          • FBSession 是 Facebook SDK for iOS 中的一个类。有关与 SDK 集成的更多详细信息,请从此处开始:developers.facebook.com/ios
          猜你喜欢
          • 1970-01-01
          • 2013-04-07
          • 1970-01-01
          • 2015-02-26
          • 1970-01-01
          • 2012-11-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多