AndrewShmig / Vkontakte-iOS-SDK-LV

[iOS] Powerful & flexible Vkontakte iOS SDK Latest Version
79 stars 23 forks source link

Access Token creation time #17

Closed kirillivonin closed 11 years ago

kirillivonin commented 11 years ago

При обращении к VKStorageItem.accessToken.creationTime всегда возвращается [[NSDate date] timeIntervalSince1970], таким образом, нельзя проверить, истек ли срок действия токена

AndrewShmig commented 11 years ago

Воспользуйтесь этим свойством класса VKAccessToken:

/**
 Истекло ли время действия текущего токена доступа или нет.
 NO - если токен всё еще действует, иначе - YES.

 NO в следующих случаях:

 - Время истечения токена больше нуля и больше текущего времени.
 - Время истечения токена равно нулю и в списке доступов присутствует "offline" доступ

 */
@property (nonatomic, readonly) BOOL isExpired;

Кстати в документации есть информация об этом. Советую использовать. Документация: https://github.com/AndrewShmig/Vkontakte-iOS-SDK-v2.0/tree/master/Project/Vkontakte-iOS-SDK-v2.0/docs

kirillivonin commented 11 years ago

я использую это свойство. как раз из-за описанной выше проблемы оно не действует:

NSTimeInterval currentTimestamp = [[NSDate date] timeIntervalSince1970];

if (self.expirationTime == 0 && [self hasPermission:@"offline"])
    return NO;
else
    return ((self.expirationTime + self.creationTime) < currentTimestamp);

сутки действия токена + текущее время, естественно, меньше текущего времени :)

AndrewShmig commented 11 years ago

@kirillivonin странно. self.liveTime = время жизни токена доступа, пусть будут сутки self.creationTime = время создания токена

Покажите пожалуйста description токена доступа.

AndrewShmig commented 11 years ago

@kirillivonin так, кажется я понимаю почему у вас могут возникнуть проблемы такие. Единственное место, где происходит инициализация времени создания токена доступа в этом методе:

- (instancetype)initWithUserID:(NSUInteger)userID
                   accessToken:(NSString *)token
                      liveTime:(NSTimeInterval)liveTime
                   permissions:(NSArray *)permissions
{
    INFO_LOG();

    if (self = [super init]) {
        _userID = userID;
        _token = [token copy];
        _liveTime = liveTime;
        _permissions = [permissions copy];
        _creationTime = [[NSDate date] timeIntervalSince1970];
    }

    return self;
}

После чего этот метод больше не вызывается, а значит и время создания не меняется. У вас же судя по всему этот методы вызывается не раз.

Было бы неплохо получить чуточку больше информации, чтобы понять где ошибка и при каких действиях.

kirillivonin commented 11 years ago

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

[[VKStorage sharedStorage] count] && [[[VKStorage sharedStorage].storageItems objectAtIndex:0] accessToken].isValid

AndrewShmig commented 11 years ago

@kirillivonin ох ты ёмаё)) ну вы много лишнего делаете. После авторизации вызывайте сразу [VKUser currentUser] и будет вам счастье. Для одного пользователя вам не надо заморачиваться с индексами в хранилище и тд. Да и вообще - не используйте хранилище как таковое. Есть класс VKUser, там все необходимые методы есть. Я настоятельно советую вам прочитать сперва документацию или хабр: http://habrahabr.ru/post/185766/

kirillivonin commented 11 years ago

даже если так:

VKUser* me = [VKUser currentUser];
me.delegate = self;
if (me.accessToken.isValid){
    _loginCompletion(nil);
}

то в логах все равно:

+[VKStorage sharedStorage] -[VKStorage init] -[VKStorage loadStorage] -[VKAccessToken initWithCoder:] -[VKStorage fullCacheStoragePath] -[VKStorageItem initWithAccessToken:mainCacheStoragePath:] -[VKAccessToken copyWithZone:]

-[VKAccessToken initWithUserID:accessToken:expirationTime:permissions:] -[VKCachedData initWithCacheDirectory:] -[VKCachedData createDirectoryIfNotExists:] -[VKStorage fullCacheStoragePath] -[VKStorage isEmpty] -[VKStorage sharedStorage]

AndrewShmig commented 11 years ago

Тогда мне хочется взглянуть на проект в целом: где вызываете окно авторизации, какие методы делегатов реализовали, как вызываете методы пользовательского класса.

И прошу уточнить вопрос, который у вас: не получается настроить и запустить приложение? не получается осуществить запрос от лица пользователя?

Сейчас со всем разберемся и всё настроим.

kirillivonin commented 11 years ago

проблемы только в этом конкретном месте. то есть, если облигатно запускать

[[VKConnector sharedInstance] startWithAppID:kVKAppID permissons:[kVKPermissionsArray componentsSeparatedByString:@","]];

все ок. заметил. честно говоря, только сегодня после истечения срока действия токена :)

перед кодом, написанным выше, ставлю только [[VKConnector sharedInstance] setDelegate:self];

AndrewShmig commented 11 years ago

@kirillivonin посмотри в делегате VKConnectorDelegate метод:

/** Метод, вызов которого сигнализирует о том, что токен стал недействительным,
 срок его действия истёк.

 @param connector объект класса VKConnector отправляющий сообщение.
 @param accessToken токен доступа, срок действия которого истёк.
 */
- (void)   VKConnector:(VKConnector *)connector
accessTokenInvalidated:(VKAccessToken *)accessToken;

и реализуй его у себя в делегате. Если вызывается этот метод, то в нем должен быть вызов окна авторизации для обновления токена доступа и его срока действия.

kirillivonin commented 11 years ago

хотелось бы, чтобы в вызове, подобном моему, creationTime не обновлялся, все-таки :)

AndrewShmig commented 11 years ago

@kirillivonin пока не увижу весь код ничего не могу сказать, ибо тот пример вызовов, что вы показали ничего не дает.

AndrewShmig commented 11 years ago

@kirillivonin однако понял в чем могла быть проблема. исправил. проверьте теперь пожалуйста.