• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 使用 KeychainItemWrapper 中保存的凭据自动登录

[复制链接]
菜鸟教程小白 发表于 2022-12-13 03:02:15 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用 KeychainItemWrapper 来保存登录凭据,这个功能对我来说很好用,但是我在使用这些存储的凭据时遇到了一些问题。

我的第一个 View 总是登录 View ;第一次在文本字段中显示没有凭据,其余时间在文本字段中显示凭据。我可以做些什么来检查存储在钥匙串(keychain)中的用户名和密码并自动转到主应用程序菜单?我知道我想要的是一种自动登录,即应用程序的典型行为。 如果您需要有关项目任何部分的更多信息,请告诉我。

PS。在以下代码行中,isUserLogged 始终返回 FALSE。

AppDelegate 有:

- (BOOL)applicationUIApplication *)application didFinishLaunchingWithOptionsNSDictionary *)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;
}



Best Answer-推荐答案


如果您打算只存储用户的登录名和密码,我认为您应该首先尝试在以下位置仅使用一个标识符:

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;
}

首先尝试一下,看看它是否有效......

关于ios - 使用 KeychainItemWrapper 中保存的凭据自动登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17405822/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap