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

iOS Facebook SDK:必须使用活动访问令牌来查询有关当前用户的信息,ios,facebook,facebook-ios-sdk,Ios,Facebook,Facebook Ios Sdk,我已经遵循了许多示例,并研究了许多有关此访问令牌错误的问题,但我似乎无法找出为什么会出现此错误或如何修复它 我初始化Facebook就像他们在3.1 sdk示例中所做的那样: NSArray* permissions = [[NSArray alloc] initWithObjects:@"publish_stream", @"publish_actions", nil]; self.fb = [[FBSession alloc] initWithPermissions:permission

我已经遵循了许多示例,并研究了许多有关此访问令牌错误的问题,但我似乎无法找出为什么会出现此错误或如何修复它

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

 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}}
FBSDKLog:FBURLConnection:
持续时间:936毫秒
响应大小:0 kB
MIME类型:text/javascript
答复:
{“error”:{“message”:“必须使用活动访问令牌来查询有关当前用户的信息。”,“type”:“OAutheException”,“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
应用程序ID:
元数据:{“sso”:“iphone safari”}
用户ID:
发出日期:1351525817(约一小时前)
有效期:1356709817(约2个月后)
有效:正确
来源:移动网页Faceweb
范围:创建\备注照片\上传发布\操作发布\流共享\项目状态\更新视频\上传
我一定是在设置中遗漏了一些小细节什么的

提前谢谢大家

根据文件

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

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

[FBSession setActiveSession:self.fb];

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

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

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

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

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

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

打开:url, sourceApplication:sourceApplication, 注释:注释) 打印(facebookDidHandle) 返回googleDidHandle | | facebookDidHandle } */

所以我用, func应用程序(u应用程序:ui应用程序, 打开url:url,选项:[字符串:AnyObject])->Bool {


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

谢谢!我就知道一定是小东西:)@C Abernathy什么是“FBSession”?内置类?我无法将其导入到我的项目中?需要任何额外的框架吗?FBSession是Facebook iOS SDK中的一个类。有关与SDK集成的更多详细信息,请从这里开始:我没有真正找到可接受的答案来解决我的问题,但这一个解决了。
    return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: options) || GIDSignIn.sharedInstance().handle(url as URL!, sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String, annotation: options[UIApplicationOpenURLOptionsAnnotationKey])
}
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"])
}