我已经关注了许多示例,并查看了有关此访问令牌错误的许多问题,但我似乎无法找到我获取它或如何修复它的原因。
我像在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
我必须错过设置中的一些小细节或其他东西。
提前谢谢大家!
答案 0 :(得分:29)
根据文档https://developers.facebook.com/docs/reference/ios/3.1/class/FBRequestConnection
“请求使用[FBSession activeSession]表示的活动会话。”
这适用于处理请求的静态方法。所以你要做的是确保你设置活动会话。执行以下操作:
[FBSession setActiveSession:self.fb];
在您调用第一个FBRequestConnection start *方法之前。
答案 1 :(得分:11)
好一段时间后,注意到FBSession.activeSession不是nil,我在发送请求之前缺少的是:
if (!FBSession.activeSession.isOpen) {
[FBSession openActiveSessionWithAllowLoginUI: YES];
}
答案 2 :(得分:1)
当我尝试使用在登录前创建的FBSDKGraphRequest
对象时,我在SDK的第4版中遇到此错误。当我在使用之前将其更改为创建FBSDKGraphRequest
时(即之后)已登录)它工作正常。看来这个类的初始化程序设置了一些在请求启动时没有刷新的标记。
我在登录后尝试更新请求的tokenString
属性,但由于某种原因,这是readonly
属性。
答案 3 :(得分:0)
/ * 谷歌和脸书网已弃用 func application(_ application:UIApplication,open url:URL,sourceApplication:String?,annotation:AnyObject) - &gt;布尔{ 让googleDidHandle = GIDSignIn.sharedInstance()。handle(url, sourceApplication:sourceApplication, 注释:注释)
let facebookDidHandle = FBSDKApplicationDelegate.sharedInstance().application(
application,
打开:网址, sourceApplication:sourceApplication, 注释:注释) 打印(facebookDidHandle) 返回googleDidHandle || facebookDidHandle } * /
所以我用过, func应用程序(_ application:UIApplication, open url:URL,options:[String:AnyObject]) - &gt;布尔 {
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
答案 4 :(得分:0)
你也可以尝试这个,对我有用
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"])
}