一、讨论
保存用户的信息并获得苹果设备的唯一标识是开发者们一直讨论的东西,早期苹果是有提供方法来直接获取到用户手机的udid作为唯一标识,但是不久之后这个方法就被禁止了。然后机智的大神们想到获取设备的MAC地址来作为唯一标识,但是仍然不幸的被苹果给无情的拒绝了。
现在的话我们可以通过[UIDevice currentDevice].identifierForVendor.UUIDString
这个方法获取标识,但是这串字符串在应用卸载后重新安装操作后会发生改变,因此并不能唯一的标识设备。so,keychain就登场了。
二、keychain
keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个ios程序都有一个独立的keychain存储。相对于 NSUserDefaults
、文件保存等一般方式,keychain保存更为安全,而且keychain里保存的信息不会因App被删除而丢失,所以在重装App后,keychain里的数据还能使用。并且还允许同一开发商的不同APP之间的访问。
三、Xcode配置
- 使用keychain得导入
Security.framework
库 -
配置一个.plist文件,里面包含的就是AceessGroup的分组信息
plist文件 -
设置文件路径
文件路径
.plist中的
$(AppIdentifierPrefix)com.****
字符串说明
- AppIdentifierPrefix:开发者帐号ID,是一个10个字符组成的
bundle seed id
,在申请账号的时候会自动生成。因此需要跟xcode选择的证书相匹配。eg:33LE83RVLQ - com.****:代表公司名称。
- 这字符串是开发者自己定义的
- 关于这字符串的详细说明可参照这个链接https://appworker.wordpress.com/2011/12/02/ios-bundle-id-or-bundle-seed-id-%E8%A7%A3%E8%AA%AA/
还有一种更方便的设置方法:打开KeyChain Sharing开关,然后设置好主KEY的名称。跟着设置步骤走即可,生成的.entitlements跟上面的.plist文件是一样的。
四、代码实现
方法1、使用苹果官方封装的类实现
将KeychainItemWrapper
类添加到目录当中即可
类中的一些方法说明
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number"
accessGroup:@"YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier"];
//保存帐号
[wrapper setObject:@"<帐号>" forKey:(id)kSecAttrAccount];
//保存密码
[wrapper setObject:@"<帐号密码>" forKey:(id)kSecValueData];
//从keychain里取出帐号密码
NSString *password = [wrapper objectForKey:(id)kSecValueData];
//清空设置
[wrapper resetKeychainItem];
waring:方法- (void)setObject:(id)inObject forKey:(id)key;
里参数forKey
的值应该是Security.framework 里头文件“SecItem.h”里定义好的key,用其他字符串做key程序会崩溃!
方法2、使用第三方库SFHFKeychainUtils
使用方法请参照这个链接http://www.wahenzan.com/a/mdev/ios/2014/1129/130.html
网友评论