AndrewShmig / Vkontakte-iOS-SDK-LV

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

Не могу выполнить logout #78

Closed Nikaladze closed 10 years ago

Nikaladze commented 10 years ago

Добрый день!

У меня для входа и выхода одна кнопка Для выхода, в делегате UIAlertView и проверки на нажатую кнопку, делаю:

[[VKConnector sharedInstance] clearCookies];

при этом в консоль честно выдает:

2013-12-12 15:49:43.227 SimpleConnectTestServer[6542:70b] (49, VKConnector, sharedInstance) 
2013-12-12 15:49:43.227 SimpleConnectTestServer[6542:70b] (288, VKConnector, clearCookies)

Потом нажимаю на кнопку ВКонтакте:

- (IBAction)vkButtonTapped:(id)sender {
    if (![VKUser currentUser]) {
        RegistrationViewController *registrationVC = [[RegistrationViewController alloc] initWithSelectedSocialNetwork:SocialServiceVK];
        registrationVC.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        [self presentViewController:registrationVC animated:YES completion:nil];
    } else {
        UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Log out" message:@"Do you really want logout?" delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil];
        av.tag = SocialServiceVK;
        [av show];
    }
}

, а оно мне все равно выдает вопрос: "Вы действительно хотите выйти?" (хотя должно отобразится окно registrationVC) Тогда я перезапускаю приложение, нажимаю на кнопку - эффект тот же.

Помогите пожалуйста!

AndrewShmig commented 10 years ago

@Nikaladze дело в том, что вызов метода clearCookies не влияет на текущего активного установленного пользователя [VKUser currentUser] Если вы явно после clearCookies запросите повторно авторизовать пользователя ваше приложение (отобразите UIWebView), то увидите страницу авторизации (ввод логина и пароля)

Nikaladze commented 10 years ago

Спасибо за ответ @AndrewShmig Я так уже делал: после логаута записываю, что данный юзер вышел (UserDefaults) и просто отображаю страницу WebView при нажатии на кнопку, или есть какие-то методы в СДК, которые позволяют сделать подобную проверку?

AndrewShmig commented 10 years ago

@Nikaladze , добавил в текущую версию СДК метод deactivate в класс VKUser, который будет сбрасывать текущего активного пользователя. Можете теперь после очистки куков вызывать этот метод и после спрашивать авторизацию - должно работать как надо.

AndrewShmig commented 10 years ago

@Nikaladze когда проблема будет решена - сообщите, закрою репорт. Либо, если понадобится еще что-то добавить - пишите.

Nikaladze commented 10 years ago

Спасибо @AndrewShmig После очистки куков я делаю деактивацию:

                [[VKConnector sharedInstance] clearCookies];
                if ([[VKUser currentUser] deactivate]) {
                    NSLog(@"All good");
                } else {
                    NSLog(@"Can't deactivate");
                }

В дебагере в методе деактивации на собственные глаза вижу, что

_currentUser    VKUser *    nil 0x00000000

Но потом когда запрашиваю

VKUser *currentUser = [VKUser currentUser];

То в дебагере вижу следующие поля:

v    currentUser    VKUser *    0x8b54cd0   0x08b54cd0
     >   NSObject   NSObject        
     >   _storageItem   VKStorageItem * 0x8a64300   0x08a64300
     >   _accessToken   VKAccessToken * nil 0x00000000

Если я хочу достучаться к accessToken, то он естественно мне выдает из storageItem:

(lldb) print currentUser.accessToken
2013-12-13 10:22:57.696 SimpleConnectTestServer[1551:70b] (137, VKUser, accessToken) 
(VKAccessToken *) $0 = 0x08b69040

Суть в том, что он не пустой

То есть, если я очищаю куки, делаю деактивацию, а потом по старому методу нажимаю на кнопку ВКонтакте (так как написано в первом сообщение без запоминания состояния в дефолтах), то он мне выводит сообщение о выходе

AndrewShmig commented 10 years ago

@Nikaladze да уж, я ступил. Метод деактивации уберу вообще тогда, ибо нафиг нужен он.

А чтобы решить вашу "проблему", то надо либо очистить всё хранилище (если один пользователь всегда, то не проблема), либо удалить запись об авторизованном пользователе из хранилища.

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

AndrewShmig commented 10 years ago

@Nikaladze написал метод logout, который полностью деавторизует текущего пользователя. Если вы работаете с только с одним пользователем всегда, то всё нормально и не стоит задаваться другими вопросами. Однако, если вы работаете с несколькими пользователями, метод [VKUser currentUser] после логаута пользователя будет возвращать произвольного пользователя из хранилища. Чтобы установить определенного пользователя из хранилища активным необходимо использовать метод activateUserWithID:.

Nikaladze commented 10 years ago

Спасибо @AndrewShmig все работает прекрасно ;)