Автоматический вход с сохраненными учетными данными из KeychainItemWrapper

Я использую KeychainItemWrapper для сохранения учетных данных для входа, эта функция отлично работает для меня, но у меня есть несколько проблем с использованием этих сохраненных учетных данных.

Всегда мой первый просмотр — это вход в систему; первый раз отображается без учетных данных в текстовых полях, а в остальное время с учетными данными в текстовых полях. Что я могу сделать, чтобы проверить имя пользователя и пароль, хранящиеся в связке ключей, и автоматически перейти в главное меню приложения? Я так понимаю, что я хочу некий автологин, типичное поведение приложений. Если вам нужна дополнительная информация о какой-либо части проекта, пожалуйста, дайте мне знать.

PS. В следующих строках кода isUserLogged всегда возвращает FALSE.

AppDelegate имеет:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    sleep(2);
    [[UIApplication sharedApplication] setStatusBarHidden:NO];

    LoginViewController *loginVC = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"login"];
    NSString *identifier;

    if(loginVC.isUserLogged == TRUE)
    {
        identifier=@"Menu";
    }
    else
    {
        identifier=@"Inicio";
    }

    UIStoryboard *storyboardobj=[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *screen = [storyboardobj instantiateViewControllerWithIdentifier:identifier];
    [self.window setRootViewController:screen];

    return YES;
}

LoginViewControllerимеет:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    txtNick.delegate = self;
    txtPass.delegate = self;

    // Create instance of keychain wrapper
    keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"login" accessGroup:nil];

    // Get username from keychain (if it exists)
    [txtNick setText:[keychain objectForKey:(__bridge id)kSecAttrAccount]];
    // Get password from keychain (if it exists)
    [txtPass setText:[keychain objectForKey:(__bridge id)kSecValueData]];
}

- (BOOL)isUserLogged
{
    keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"nick" accessGroup:nil];
    if ( [[keychain objectForKey:(__bridge id)kSecAttrAccount] isEqualToString:@""] ) {
        return FALSE;
    } else {
        txtNick = [NSString stringWithString:[keychain objectForKey:(__bridge id)kSecAttrAccount]];
    }

    keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"pass" accessGroup:nil];
    if ( [[keychain objectForKey:(__bridge id)kSecAttrAccount] isEqualToString:@""] ) {
        return FALSE;
    } else {
        txtPass = [NSString stringWithString:[keychain objectForKey:(__bridge id)kSecValueData]];
    }
    return TRUE;
}

person Community    schedule 01.07.2013    source источник


Ответы (1)


Если вы планируете хранить только логин и пароль вашего пользователя, я думаю, вам следует сначала попробовать использовать только один идентификатор в:

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"My_Unique_Id" accessGroup:nil];

Затем, когда вы подключаете своего пользователя, вы используете:

[wrapper setObject:userName forKey:(__bridge id)kSecAttrAccount];
[wrapper setObject:password forKey:(__bridge id)kSecValueData];

И тогда ваш метод, чтобы увидеть, получил ли пользователь уже учетные данные, становится:

- (BOOL)isUserLogged
{
    KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"My_Unique_Id" accessGroup:nil];
    NSString *username = [wrapper objectForKey:(__bridge id)kSecAttrAccount];
    NSString *password = [wrapper objectForKey:(__bridge id)kSecValueData];
    BOOL isLogged = ([username length] > 0 && [password length] > 0);
    return isLogged;
}

Попробуйте сначала и посмотрите, получится ли...

person Drayae    schedule 04.07.2013
comment
Вы правы, у меня была неправильная реализация функции isUserLogged. Поставил как у вас, добавил звонок с подключением к базе и все работает! Спасибо. - person ; 04.07.2013