2015-05-25 3 views
3

Для справки: Я использую последнюю версию IOS SDK v4 и последнюю версию Parse v1.7.4 и ParseFacebookUtilsV4 SDK.Почему accesstoken не задан PFFacebookUtils logInInBackgroundWithReadPermissions method?

Так что я использую PFFacebookUtils loginInBackgroundWithReadPermissions: block: метод для входа пользователя с учетными данными Facebook и создания PFUser с этими учетными данными. И затем приступил к созданию запроса графика facebook с FBSDKGraphRequest, который из того, что я читал, предполагает, что установлен действительный токен (для него не передается параметр токена).

Но запрос графика facebook не удался, и в отслеживании проблемы я заметил, что «токен доступа» никогда не устанавливается методом loginInBackgroudnWithReadPermissions. То, что этот метод делает только, - это создать PFUser и экземпляр Session в Parse и сохранить там строку токена сеанса, но она не устанавливает currentAccessToken. Когда я делаю вызов [[FBSDKAccessToken currentAccessToken] tokenString] в блоке, я получаю (null). Но если я прочитаю «токенную строку» из класса PFSession, я получу хранилище «токенов» в экземпляре класса Session в Parse.

Смотрите код ниже:

- (IBAction)fbLoginAction:(id)sender { 

// Set permissions required from the facebook user account 
NSArray *permissionsArray = @[ @"email", @"user_friends"]; 
// Login PFUser using Facebook 
[PFFacebookUtils logInInBackgroundWithReadPermissions:permissionsArray block:^(PFUser *user, NSError *error) { 
    if (!user) { 
     NSLog(@"Uh oh. The user cancelled the Facebook login."); 
    } else if (user.isNew) { 
     NSLog(@"User signed up and logged in through Facebook!"); 


     // Check if the current token has been set 
     NSLog(@"self.myCurrentToken string = %@", [[FBSDKAccessToken currentAccessToken] tokenString]); // returns (null) 

     // Get the token string from the PFSession 
     [PFSession getCurrentSessionInBackgroundWithBlock:^(PFSession *session, NSError *error) { 
        NSString *tokenString = session.sessionToken; 
        NSLog(@"Session token = %@", tokenString); 

       }]; 

}

А вот вывод отладочной консоли enter image description here

Так что я не уверен, что происходит. Если токен PFSession установлен на что-то, то не должен FBSDKAccessToken currentAccessToken не возвращать этот же токен PFsession?

И если я должен установить accessToken вручную, как я могу преобразовать токенную строку, которая хранится в Parse, в экземпляр FBSDKAccessToken? Кажется, нет способа сделать это?

благодаря

+0

Вы могли понять это? – jhk

ответ

0

Это происходит потому, что вам нужно добавить следующий код в нижней части AppDelegate didFinishLaunchingWithOptions:

return [[FBSDKApplicationDelegate sharedInstance] application:application 
            didFinishLaunchingWithOptions:launchOptions]; 

Добавив код, ваш currentAccessToken больше не будет нулевым, и вы можете сделать обращается к FB сразу.

FYI, мне удалось обнаружить, что acccessToken был нулевым, потому что каждый раз, когда я пытался использовать FBSDKGraphRequest, я получал следующую ошибку. Поэтому, если кто-либо еще получит ошибку ниже, убедитесь, что ваш accessToken не равен нулю даже после входа в систему!

{"error":{"message":"An active access token must be used to query information about the current user.","type":"OAuthException","code":2500}} 
0

@jhk:

Да. Я получил объяснение от поддержки Facebook. Вход через Parse - это двухэтапный процесс. Первый шаг - это шаг авторизации, на котором пользователь аутентифицируется с помощью Facebook. Он переключается на приложение Facebook, и приложение получает токен доступа Facebook, когда он завершается успешно. И вторым шагом является то, что приложение аутентифицируется с помощью Parse (т. Е. Вашего приложения) с использованием токена Facebook. Если он соответствует существующему пользователю/сеансу, вы успешно вошли в систему. Тем не менее, я удалял PFSession вручную из бэкэнда синтаксического анализа, одновременно проверяя каждый раз, когда я пытался войти в систему, чтобы отменить сеанс, хранящийся в бэкэнд, и после первого шага, когда приложение получает разрешение и получает accesstoken, система понимает, что локальная сессия не соответствует анализируемой сохраненной сессии и недействительна accesstoken, она устанавливает ее в nil. Вот почему я вижу, что токен установлен на ноль.

Смежные вопросы