搜索
您的当前位置:首页正文

钥匙串(KeyChain)保存和获取用户名和密码

来源:二三娱乐

苹果推荐的就是使用IDFA、IDFV
idfa: 适用于对外:例如广告推广,换量等跨应用的用户追踪等
idfv: 适用于对内:例如分析用户在应用内的行为等

idfa:主要用于广告,可能会获取不到,iOS用户也可以--> 设置|隐私|广告追踪,里重置此id的值,虽然玩家一般不会重置,但是上述理由已经不足以把idfa作为账号了

肯定不能将idfv存入NSUserDefaults,因为一旦应用被卸载,那么数据将不复存在,idfv有可能就会改变。keychain不会这样。那么介绍下keychain:

我们可以把KeyChain理解为一个Dictionary,所有数据都以key-value的形式存储,可以对这个Dictionary进行add、update、get、delete这四个操作。对于每一个应用来说,KeyChain都有两个访问区,私有区和公共区。私有区是一个sandbox,本程序存储的任何数据都对其他程序不可见。而要想在将存储的内容放在公共区,需要先声明公共区的名称,官方文档管这个名称叫“keychain access group”,声明的方法是新建一个plist文件,名字随便起,内容如下:



iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个ios程序都有一个独立的keychain存储。相对于NSUserDefaults、文件保存等一般方式,keychain保存更为安全,而且keychain里保存的信息不会因App被删除而丢失,所以在重装App后,keychain里的数据还能使用。

在应用里使用使用keyChain,我们需要导入Security.framework ,keychain的操作接口声明在头文件SecItem.h里。直接使用SecItem.h里方法操作keychain,需要写的代码较为复杂,为减轻咱们程序员的开发,我们可以使用一些已经封装好了的工具类,apple官方提出了两个工具类:KeychainItemWrapper和SFHFKeychainUtils。

1.使用KeychainItemWrapper

把KeychainItemWrapper下载下来,然后将“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷贝到我们项目,并导入Security.framework
下面是我在appDelegate.m中的代码:因为我不需要在应用间共享keychain中的内容,所以accessGroup设置为nil

- (NSString *)getIdfv
{
    NSString *str;
    KeychainItemWrapper *keychainItem = [[KeychainItemWrapperalloc]initWithIdentifier:@"UUID"accessGroup:nil];

    MYLog(@"%@",[keychainItem objectForKey:(__bridgeid)kSecValueData]);
    NSString *uuidStr = [keychainItemobjectForKey:(__bridgeid)kSecValueData];
    MYLog(@"%@",[[UIDevice currentDevice] identifierForVendor]);
    if ([uuidStrisKindOfClass:[NSDictionaryclass]]) 
    { //代表里面还没有存值
        NSString *myUUIDStr = [[[UIDevicecurrentDevice] identifierForVendor]UUIDString];
        [keychainItem setObject:myUUIDStrforKey:(__bridgeid)kSecValueData];
        str = myUUIDStr;
    }
    else{
        str = [keychainItem objectForKey:(__bridgeid)kSecValueData];
    }
    MYLog(@"======%@",str);
    return str;
}

2.SSKeyChains

使用SSKeyChain
通过以下类方法来使用SSKeyChain(请查看SSKeyChain.h):

  • (NSArray *)allAccounts;
  • (NSArray *)accountsForService:(NSString *)serviceName;
  • (NSString *)passwordForService:(NSString *)serviceNameaccount:(NSString *)account;
  • (BOOL)deletePasswordForService:(NSString *)serviceNameaccount:(NSString *)account;
  • (BOOL)setPassword:(NSString )password forService:(NSString)serviceName account:(NSString *)account;

[SSKeychain setPassword: [NSString stringWithFormat:@"%@", uuidStr]
forService:@"com.yourapp.yourcompany"account:@"user"];

然后,从钥匙串读取UUID:
NSString *retrieveuuid = [SSKeychainpasswordForService:@"com.yourapp.yourcompany"account:@"user"];

注意: setPassword和passwordForSevice方法中的services 和 accounts 参数应该是一致的。

3.SFHFKeychainUtils

[SFHFKeychainUtils storeUsername:@"dd"  
                   andPassword:@"aa"
                   forServiceName:SERVICE_NAME 
                   updateExisting:1 
                   error:nil];

[SFHFKeychainUtils deleteItemForUsername:@"dd"               
                   andServiceName:SERVICE_NAME 
                   error:nil];

4、取密码:

NSString *passWord =  [SFHFKeychainUtils getPasswordForUsername:@"dd"
                                         andServiceName:SERVICE_NAME 
                                         error:nil];
Top