Подтвердить что ты не робот

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

Мне нужно пропустить небольшую деталь в настройках или что-то в этом роде.

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

4b9b3361

Ответ 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"])
}