Closed kirillivonin closed 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
я использую это свойство. как раз из-за описанной выше проблемы оно не действует:
NSTimeInterval currentTimestamp = [[NSDate date] timeIntervalSince1970];
if (self.expirationTime == 0 && [self hasPermission:@"offline"])
return NO;
else
return ((self.expirationTime + self.creationTime) < currentTimestamp);
сутки действия токена + текущее время, естественно, меньше текущего времени :)
@kirillivonin странно. self.liveTime = время жизни токена доступа, пусть будут сутки self.creationTime = время создания токена
Покажите пожалуйста description токена доступа.
@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;
}
После чего этот метод больше не вызывается, а значит и время создания не меняется. У вас же судя по всему этот методы вызывается не раз.
Было бы неплохо получить чуточку больше информации, чтобы понять где ошибка и при каких действиях.
Судя по логам, метод вызывается каждый раз, когда я пытаюсь залогиниться. Программа у меня рассчитана на одного пользователя. Вызывается почему-то после этого:
[[VKStorage sharedStorage] count] && [[[VKStorage sharedStorage].storageItems objectAtIndex:0] accessToken].isValid
@kirillivonin ох ты ёмаё)) ну вы много лишнего делаете. После авторизации вызывайте сразу [VKUser currentUser] и будет вам счастье. Для одного пользователя вам не надо заморачиваться с индексами в хранилище и тд. Да и вообще - не используйте хранилище как таковое. Есть класс VKUser, там все необходимые методы есть. Я настоятельно советую вам прочитать сперва документацию или хабр: http://habrahabr.ru/post/185766/
даже если так:
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]
Тогда мне хочется взглянуть на проект в целом: где вызываете окно авторизации, какие методы делегатов реализовали, как вызываете методы пользовательского класса.
И прошу уточнить вопрос, который у вас: не получается настроить и запустить приложение? не получается осуществить запрос от лица пользователя?
Сейчас со всем разберемся и всё настроим.
проблемы только в этом конкретном месте. то есть, если облигатно запускать
[[VKConnector sharedInstance] startWithAppID:kVKAppID permissons:[kVKPermissionsArray componentsSeparatedByString:@","]];
все ок. заметил. честно говоря, только сегодня после истечения срока действия токена :)
перед кодом, написанным выше, ставлю только [[VKConnector sharedInstance] setDelegate:self];
@kirillivonin посмотри в делегате VKConnectorDelegate метод:
/** Метод, вызов которого сигнализирует о том, что токен стал недействительным,
срок его действия истёк.
@param connector объект класса VKConnector отправляющий сообщение.
@param accessToken токен доступа, срок действия которого истёк.
*/
- (void) VKConnector:(VKConnector *)connector
accessTokenInvalidated:(VKAccessToken *)accessToken;
и реализуй его у себя в делегате. Если вызывается этот метод, то в нем должен быть вызов окна авторизации для обновления токена доступа и его срока действия.
хотелось бы, чтобы в вызове, подобном моему, creationTime не обновлялся, все-таки :)
@kirillivonin пока не увижу весь код ничего не могу сказать, ибо тот пример вызовов, что вы показали ничего не дает.
@kirillivonin однако понял в чем могла быть проблема. исправил. проверьте теперь пожалуйста.
При обращении к VKStorageItem.accessToken.creationTime всегда возвращается [[NSDate date] timeIntervalSince1970], таким образом, нельзя проверить, истек ли срок действия токена