IOS Facebook SDK: токен активного доступа должен использоваться для запроса информации о текущем пользователе
Я рассмотрел множество примеров и посмотрел на многие вопросы относительно этой ошибки токена доступа, но я не могу понять, почему я получаю его или как его исправить.
Я запускаю 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}}
Я взял токен доступа из своей 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
Мне нужно пропустить небольшую деталь в настройках или что-то в этом роде.
Спасибо всем заблаговременно!
Ответы
Ответ 1
В соответствии с документами https://developers.facebook.com/docs/reference/ios/3.1/class/FBRequestConnection
"Запрос использует активный сеанс, представленный [FBSession activeSession].
Это относится к статическим методам обработки запросов. Итак, что вы хотите сделать, убедитесь, что вы установили активный сеанс. Выполните следующие действия:
[FBSession setActiveSession:self.fb];
Перед тем, как вы вызовете первый метод * FBRequestConnection start *.
Ответ 2
Ну По прошествии некоторого времени, заметив, что FBSession.activeSession не был ник, что я пропал перед отправкой запроса:
if (!FBSession.activeSession.isOpen) {
[FBSession openActiveSessionWithAllowLoginUI: YES];
}
Ответ 3
Я получил эту ошибку в v4 SDK при попытке использовать объект FBSDKGraphRequest
, который был создан до входа в систему. Когда я изменил это, чтобы создать FBSDKGraphRequest
непосредственно перед его использованием (т.е. после входа в систему) он работал нормально. Кажется, что инициализатор для этого класса устанавливает некоторый токен, который не обновляется при запуске запроса.
Я попытался обновить свойство request tokenString
после входа в систему, но по какой-то причине это свойство readonly
.
Ответ 4
/* устарел для google и facebook func application (_ application: UIApplication, open url: URL, sourceApplication: String?, аннотация: AnyObject) → Bool { let googleDidHandle = GIDSignIn.sharedInstance(). handle (url, sourceApplication: sourceApplication, аннотация: аннотация)
let facebookDidHandle = FBSDKApplicationDelegate.sharedInstance().application(
application,
open: url, sourceApplication: sourceApplication, аннотация: аннотация) печать (facebookDidHandle) return googleDidHandle || facebookDidHandle } */
Итак, я использовал,
func application (_ 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
Ответ 5
вы можете попробовать это тоже, работает для меня
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"])
}