获取设备唯一码

有些企业内部程序需要对访问程序的真机做白名单限制,对于设备唯一码,苹果做出了如下限制:


1.从iOS7之后,获取MAC地址会返回固定值“02:00:00:00:00:00”。


2.试图获取UDID(设备唯一码)的程序不会通过苹果的审核。

 

解决方案:
苹果推荐使用UUID(其实微软的GUID就是它的一种实现)。

我们可以在程序第一次启动时生成这个ID并保存起来,但是,如果用户删除该应用再次安装时,又会生成新的字符串,所以不能保证唯一识别该设备,所以这个ID不能存在沙盒里,应该存在KeyChain里。

KeyChain可以理解为是一个更安全的UserDefaults,它不会因为App卸载重装而消失,而且允许在一定限制的前提下令应用程序之间共享数据(参考帖子:http://www.2cto.com/kf/201311/255684.html)。

 

核心代码:

首先是生成UUID的代码,建议封装成静态类:

1     CFUUIDRef puuid = CFUUIDCreate(nil);
2     CFStringRef uuidString = CFUUIDCreateString(nil, puuid);
3     NSString *result = (NSString *)CFStringCreateCopy(NULL, uuidString);
4     CFRelease(puuid);
5     CFRelease(uuidString);
6     NSLog(@"%@" ,result);

对KeyChain的操作:

首先下载KeyChaind的包装库:http://download.csdn.net/download/u011439689/6877641

导入类库后导入Security.framework,代码如下:

 1     //为应用程序定义KeyChain访问的包装器
 2     KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number" accessGroup:@"YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier"];
 3     
 4     //写入数据(这里的key一定要用系统提供的枚举)
 5     [wrapper setObject:@"<帐号>" forKey:(id)kSecAttrAccount];
 6     [wrapper setObject:@"<帐号密码>" forKey:(id)kSecValueData];
 7 
 8     //取出数据
 9     NSString *password = [wrapper objectForKey:(id)kSecValueData];
10     
11     //清理数据
12     [wrapper resetKeychainItem];

注意这些代码都是MRC下的。

 

posted @ 2014-07-04 15:49  肉排君  阅读(473)  评论(0编辑  收藏  举报