iOS Facebook SDK: токен активного доступа должен использоваться для запроса информации о текущем пользователе

Я следил за многими примерами и посмотрел на многие вопросы, касающиеся этой ошибки маркера доступа, но я не могу понять, почему я получаю его или как его исправить.

Я init 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

Я должен отсутствовать некоторые мелкие детали в настройках или что-то.

спасибо всем заранее!

5 ответов


согласно документам, https://developers.facebook.com/docs/reference/ios/3.1/class/FBRequestConnection

" запрос использует активный сеанс, представленный [fbsession activeSession]."

это относится к статическим методам обработки запросов. Поэтому вы хотите убедиться, что вы установили активный сеанс. Сделайте следующее:

[FBSession setActiveSession:self.fb];

непосредственно перед вызовом первого метода fbrequestconnection start*.


ну через некоторое время, заметив, что FBSession.activeSession не был нулевым, чего мне не хватало перед отправкой запроса:

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

Я получил эту ошибку в V4 SDK при попытке использовать FBSDKGraphRequest объект, который был создан до входа в систему. Когда я изменил это, чтобы создать FBSDKGraphRequest непосредственно перед его использованием (т. е. после регистрации в) он работал нормально. Кажется, инициализатор для этого класса устанавливает некоторый токен, который не обновляется при запуске запроса.

Я попытался обновить запрос tokenString собственность после входа в систему, но по какой-то причине это readonly собственность.


/* не рекомендуется для google и facebook применение Функ(_ приложение: UIApplication, открыть URL-адрес: URL-адрес, источнику приложения: строку?, аннотация: AnyObject) - > Bool { пусть googleDidHandle = GIDSignIn.sharedInstance().ручка(URL-адрес, источнику приложения: источнику приложения, аннотация: аннотация)

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

открыть: URL-адрес, источнику приложения: источнику приложения, аннотация: аннотация) печать (facebookDidHandle) возвращение googleDidHandle | / facebookDidHandle } */

поэтому я использовал, приложение func (_application: UIApplication, откройте URL-адрес: URL-адрес, параметры: [строкой: какой-либо объект]) -> 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"])
}