iOS中keyChain 实现UUID 设备唯一标识符碰到的问题

废话少说,置入正题:

最近在研究实现获取设备唯一标识符时,经过各方面调研,发现使用苹果官方推荐的keyChain还是挺不错的。

Apple提供了一个叫GenericKeychain的例子程序,在这里:http://developer.apple.com/library/ios/#samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_h.html#//apple_ref/doc/uid/DTS40007797-Classes_KeychainItemWrapper_h-DontLinkElementID_9,其中封装了一个简化Keychain操作的类:KeychainItemWrapper,可以拿来直接使用,记得加入Security.framework!吐槽下。苹果demo也有内存泄漏,而且没有适配arc,所以有警告记得在Build
Phases 的.m文件后加上-fno-objc-arc.

然后在Capabilities里打开keyChain Sharing ,新版本Xcode会自动生成一个name.entitlements文件,旧版本就需要自己在工程目录下新建一个KeychainAccessGroups.plist文件,该文件的结构中最顶层的节点必须是一个名为“keychain-access-groups”的Array,并且该Array中每一项都是一个描述分组的NSString。对于String的格式也有相应要求,格式为:"AppIdentifier.com.xxxx.name",其中APPIdentifier就是你的开发者帐号对应的ID。

其中AppIdentifier 这个新版本xcode要去钥匙串里去找。1.打开钥匙串  2.选择我的证书 3.看自己使用的证书名字后面有个(xxxxxx)这十个大写字母就是我们要找的东西。

这个写错了是有要报错的。

下面在一个公共类里加上

/*

uiid

*/

+(NSString *)getUUID

{

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc]

initWithIdentifier:@"UUID"

accessGroup:@"4VXZQB2W6T.com.yjxh.pengsi"];//YOUR_BUNDLE_SEED.

NSString *strUUID = [keychainItem objectForKey:(id)CFBridgingRelease(kSecValueData)];

//首次执行该方法时,uuid为空

if ([strUUID isEqualToString:@""])

{

CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);

strUUID = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));

[keychainItem setObject:strUUID forKey:(id)CFBridgingRelease(kSecValueData)];

}

return strUUID;

}

就ok了

实现本功能借鉴了几个大婶的文章

链接如下:

http://www.cnblogs.com/smileEvday/p/UDID.html#!comments

http://blog.k-res.net/archives/1081.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-30 04:58:11

iOS中keyChain 实现UUID 设备唯一标识符碰到的问题的相关文章

[转] ios中KeyChain用途

转自  http://www.2cto.com/kf/201311/255684.html 一.在应用间利用KeyChain共享数据 我们可以把KeyChain理解为一个Dictionary,所有数据都以key-value的形式存储,可以对这个Dictionary进行add. update.get.delete这四个操作.对于每一个应用来说,KeyChain都有两个访问区,私有区和公共区.私有区是一个sandbox,本 程序存储的任何数据都对其他程序不可见.而要想在将存储的内容放在公共区,需要先

ios中KeyChain用途

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

iOS中keychain存储结构的研究

keychain在ios中是保存在sqlite数据库中的. 这个数据库文件的位置: 真机: /private/var/Keychains/keychain-2.db 虚拟机: /Users/USER-HOME/Library/Developer/CoreSimulator/Devices/26DCA62C-B516-4DEA-A601-5C2D0EA07710/data/Library/Keychains/keychain-2-debug.db 在虚拟机中,这个数据库考出来就不能读了,很奇怪.

ios中KeyChain用途(整理)

原文地址http://blog.csdn.net/u011439689/article/details/18707387 一.在应用间利用KeyChain共享数据 我们可以把KeyChain理解为一个Dictionary,所有数据都以key-value的形式存储,可以对这个Dictionary进行add.update.get.delete这四个操作.对于每一个应用来说,KeyChain都有两个访问区,私有区和公共区.私有区是一个sandbox,本程序存储的任何数据都对其他程序不可见.而要想在将存

【IOS工具类】获得设备唯一标识(兼容IOS5,6,7)

UIDevice+IdentifierAddition.h: #import <Foundation/Foundation.h> @interface UIDevice (IdentifierAddition) - (NSString *) uniqueDeviceIdentifier; @end UIDevice+IdentifierAddition.m #import "UIDevice+IdentifierAddition.h" #import "NSStr

iOS 获取设备唯一标示符的方法

在开发中会遇到应用需要记录设备标示,即使应用卸载后再安装也可重新识别的情况,在这写一种实现方式--读取设备的UUID(Universally Unique Identifier)并通过KeyChain记录. 首先iOS中获取设备唯一标示符的方法一直随版本的更新而变化.iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是目前为止唯一可以确认唯一的标示符.好景不长,因为该唯一标识符与手机一一对应,苹果觉得

现有IOS设备唯一标示符的方案比较

现有IOS设备唯一标示符的方案比较 UDID [[UIDevice currentDevice] uniqueIdentfier] iOS官方最早提供的UDID方案,根据某一公式,使用设备序列号.网卡地址等信息作为参数计算而来,iOS6之后该计算公式发生了改变. 该方法返回的结果在所有应用中都相同,并且卸载应用.刷机.还原设备均不会发生改变,是最为准确的设备唯一标示符. iOS5之后,该方法被标记为废弃!最终,在2013年5月1号之后,AppStore禁止任何使用该方法的应用上架. iOS7中对

iOS中的KeyChain的用途

ios中KeyChain用途 一.在应用间利用KeyChain共享数据 我们可以把KeyChain理解为一个Dictionary,所有数据都以key-value的形式存储,可以对这个Dictionary进行add.update.get.delete这四个操作.对于每一个应用来说,KeyChain都有两个访问区,私有区和公共区.私有区是一个sandbox,本程序存储的任何数据都对其他程序不可见.而要想在将存储的内容放在公共区,需要先声明公共区的名称,官方文档管这个名称叫“keychain acce

iOS 设备获取唯一标识符汇总

在2013年3月21日苹果已经通知开发者,从2013年5月1日起,访问UIDID的应用将不再能通过审核,替代的方案是开发者应该使用“在iOS 6中介绍的Vendor或Advertising标示符”. unique Identifier即将退出,苹果给了我们Vendor和Advertising identifier两个选择,但应该用哪一个?文档并没有给出确切答案,具体使用哪个完全由你根据自己app的目的来决定.下面我将列出iOS中目前支持的,以及被废弃的唯一标示符方法,并对其做出相应的解释,希望可