如何使用KeyChain保存和获取UDID。iOS7获取唯一标示符的方法

iOS获取UDID问题 iOS唯一标识的一个替代方案:生成UUID,并存储在keychain,pasteboard,NSUserDefaults中,保证至少一个APP卸载后重装UUID不变 阅读详情

转自:http://www.haodaima.net/art/2388057


本文主要介绍使用KeyChain保存和获取APP数据,解决iOS7上获取不变UDID的问题。并给出一个获取UDID的工具类,使用方便,只需要替换两个地方即可。

一、iOS不用版本获取UDID的方法比较

  1)iOS 5.0

  iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是目前为止唯一可以确认唯一的标示符。好景不长,因为该唯一标识符与手机一一对应,苹果觉得可能会泄露用户隐私,所以在 iOS 5.0之后该方法就被废弃掉了。

  而且苹果做的更狠,今年5月份以后提交App Store的产品都不允许再用uniqueIdentifier接口,甚至有些朋友因为代码中有UDID还被打回来,看来这条路是被封死了。

  2)iOS 6.0

  iOS 6.0系统新增了两个用于替换uniqueIdentifier的接口,分别是:identifierForVendor,advertisingIdentifier。

  identifierForVendor接口的官方文档介绍如下:

The value of this property is the same for apps that come from the same vendor running on the same device. 
A different value is returned for apps on the same device that come from different vendors, and for apps on different devices regardless of vendor. The value of this property may be nil if the app is running in the background, before the user has unlocked the device the first time after the device has been restarted. If the value is nil, wait and get the value again later. The value in this property remains the same while the app (or another app from the same vendor) is installed on the iOS device. The value changes when the user deletes all of that vendor’s apps from the device and subsequently reinstalls one or more of them. Therefore, if your app stores the value of this property anywhere, you should gracefully handle situations where the identifier changes.


大概意思就是“同一开发商的APP在指定机器上都会获得同一个ID。当我们删除了某一个设备上某个开发商的所有APP之后,下次获取将会获取到不同的ID。” 也就是说我们通过该接口不能获取用来唯一标识设备的ID,问题总是难不倒聪明的程序员,于是大家想到了使用WiFi的mac地址来取代已经废弃了的uniqueIdentifier方法。具体的方法晚上有很多,大家感兴趣的可以自己找找,这儿提供一个网址:  http://stackoverflow.com/questions/677530/how-can-i-programmatically-get-the-mac-address-of-an-iphone

3)iOS 7.0  

  iOS 7中苹果再一次无情的封杀mac地址,使用之前的方法获取到的mac地址全部都变成了02:00:00:00:00:00。有问题总的解决啊,于是四处查资料,终于有了思路是否可以使用KeyChain来保存获取到的唯一标示符呢,这样以后即使APP删了再装回来,也可以从KeyChain中读取回来。有了方向以后就开始做,看关于KeyChain的官方文档,看官方使用KeyChain的Demo,大概花了一下午时间,问题终于解决了。 

二、KeyChain介绍

   我们搞iOS开发,一定都知道OS X里面的KeyChain(钥匙串),通常要乡镇及调试的话,都得安装证书之类的,这些证书就是保存在KeyChain中,还有我们平时浏览网页记录的账号密码也都是记录在KeyChain中。iOS中的KeyChain相比OS X比较简单,整个系统只有一个KeyChain,每个程序都可以往KeyChain中记录数据,而且只能读取到自己程序记录在KeyChain中的数据。iOS中Security.framework框架提供了四个主要的方法来操作KeyChain:

// 查询 OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result); 
// 添加 OSStatus SecItemAdd(CFDictionaryRef attributes, CFTypeRef *result); 
// 更新KeyChain中的Item OSStatus SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate); 
// 删除KeyChain中的Item OSStatus SecItemDelete(CFDictionaryRef query)

这四个方法参数比较复杂,一旦传错就会导致操作KeyChain失败,这块儿文档中介绍的比较详细,大家可以查查官方文档Keychain Services Reference。

  前面提到了每个APP只允许访问自己在KeyChain中记录的数据,那么是不是就没有别的办法访问其他APP存在KeyChain的数据了?

  苹果提供了一个方法允许同一个发商的多个APP访问各APP之间的途径,即在调SecItemAdd添加数据的时候指定AccessGroup,即访问组。一个APP可以属于同事属于多个分组,添加KeyChain数据访问组需要做一下两件事情:

  a、在APP target的bulibSetting里面设置Code Signing Entitlements,指向包含AceessGroup的分组信息的plist文件。该文件必须和工程文件在同一个目录下,我在添加访问分组的时候就因为plist文件位置问题,操作KeyChain失败,查找这个问题还花了好久的时间。

  b、在工程目录下新建一个KeychainAccessGroups.plist文件,该文件的结构中最顶层的节点必须是一个名为“keychain-access-groups”的Array,并且该Array中每一项都是一个描述分组的NSString。对于String的格式也有相应要求,格式为:"AppIdentifier.com.***",其中APPIdentifier就是你的开发者帐号对应的ID。

  c、在代码中往KeyChain中Add数据的时候,设置kSecAttrAccessGroup,代码如下:

NSString *accessGroup = [NSString stringWithUTF8String:"APPIdentifier.com.cnblogs.smileEvday"]; 
if (accessGroup != nil) 
{ 
#if TARGET_IPHONE_SIMULATOR 
// Ignore the access group if running on the iPhone simulator. 
// // Apps that are built for the simulator aren't signed, so there's no keychain access group 
// for the simulator to check. This means that all apps can see all keychain items when run 
// on the simulator. 
// // If a SecItem contains an access group attribute, SecItemAdd and SecItemUpdate on the 
// simulator will return -25243 (errSecNoAccessForItem). 
#else 
[dictForQuery setObject:accessGroup forKey:(id)kSecAttrAccessGroup]; 
#endif 
}

这段代码是从官方的Demo中直接拷贝过来的,根据注释我们可以看到,模拟器是不支持AccessGroup的,所以才行了预编译宏来选择性添加。

  注:appIdentifer就是开发者帐号的那一串标识,如下图所示:

   

  打开xcode的Organizer,选择Device选项卡,连接设备就可以看到设备上安装的开发者账号描述文件列表,其中第五列最开始的10个字符即为App Identifier,这块儿前面写的不是很清楚,好多朋友加我qq问我,今天特地补上。

 

三、使用KeyChain保存和获取UDID

  

  说了这么多终于进入正题了,如何在iOS 7上面获取到不变的UDID。我们将第二部分所讲的知识直接应用进来就可以了轻松达到我们要的效果了,下面我们先看看往如何将获取到的identifierForVendor添加到KeyChain中的代码。

+ (BOOL)settUDIDToKeyChain:(NSString*)udid 
{ 
NSMutableDictionary *dictForAdd = [[NSMutableDictionary alloc] init]; 
[dictForAdd setValue:(id)kSecClassGenericPassword forKey:(id)kSecClass]; 
[dictForAdd setValue:[NSString stringWithUTF8String:kKeychainUDIDItemIdentifier] forKey:kSecAttrDescription]; 
[dictForAdd setValue:@"UUID" forKey:(id)kSecAttrGeneric]; 
// Default attributes for keychain item. 
[dictForAdd setObject:@"" forKey:(id)kSecAttrAccount]; 
[dictForAdd setObject:@"" forKey:(id)kSecAttrLabel]; 
// The keychain access group attribute determines if this item can be shared 
// amongst multiple apps whose code signing entitlements contain the same keychain access group. 
NSString *accessGroup = [NSString stringWithUTF8String:kKeyChainUDIDAccessGroup]; 
if (accessGroup != nil) 
{ 
#if TARGET_IPHONE_SIMULATOR 
// Ignore the access group if running on the iPhone simulator. 
// // Apps that are built for the simulator aren't signed, so there's no keychain access group 
// for the simulator to check. This means that all apps can see all keychain items when run 
// on the simulator. 
// // If a SecItem contains an access group attribute, SecItemAdd and SecItemUpdate on the 
// simulator will return -25243 (errSecNoAccessForItem). 
#else 
[dictForAdd setObject:accessGroup forKey:(id)kSecAttrAccessGroup]; 
#endif 
} 
const char *udidStr = [udid UTF8String]; 
NSData *keyChainItemValue = [NSData dataWithBytes:udidStr length:strlen(udidStr)]; 
[dictForAdd setValue:keyChainItemValue forKey:(id)kSecValueData]; 
OSStatus writeErr = noErr; 
if ([SvUDIDTools getUDIDFromKeyChain]) 
{ 
// there is item in keychain 
[SvUDIDTools updateUDIDInKeyChain:udid]; 
[dictForAdd release]; return YES; 
} 
else 
{ 
// add item to keychain 
writeErr = SecItemAdd((CFDictionaryRef)dictForAdd, NULL); 
if (writeErr != errSecSuccess) 
{ 
NSLog(@"Add KeyChain Item Error!!! Error Code:%ld", writeErr); 
[dictForAdd release]; 
return NO; 
} 
else 
{ 
NSLog(@"Add KeyChain Item Success!!!"); 
[dictForAdd release]; return YES; 
} 
} 
[dictForAdd release]; 
return NO; 
}

上面代码中,首先构建一个要添加到KeyChain中数据的Dictionary,包含一些基本的KeyChain Item的数据类型,描述,访问分组以及最重要的数据等信息,最后通过调用SecItemAdd方法将我们需要保存的UUID保存到KeyChain中。

  获取KeyChain中相应数据的代码如下:

+ (NSString*)getUDIDFromKeyChain 
{ 
NSMutableDictionary *dictForQuery = [[NSMutableDictionary alloc] init]; 
[dictForQuery setValue:(id)kSecClassGenericPassword forKey:(id)kSecClass]; 
// set Attr Description for query 
[dictForQuery setValue:[NSString stringWithUTF8String:kKeychainUDIDItemIdentifier] forKey:kSecAttrDescription]; 
// set Attr Identity for query 
NSData *keychainItemID = [NSData dataWithBytes:kKeychainUDIDItemIdentifier length:strlen(kKeychainUDIDItemIdentifier)]; 
[dictForQuery setObject:keychainItemID forKey:(id)kSecAttrGeneric]; 
// The keychain access group attribute determines if this item can be shared 
// amongst multiple apps whose code signing entitlements contain the same keychain access group. 
NSString *accessGroup = [NSString stringWithUTF8String:kKeyChainUDIDAccessGroup]; 
if (accessGroup != nil) 
{ 
#if TARGET_IPHONE_SIMULATOR 
// Ignore the access group if running on the iPhone simulator. 
// // Apps that are built for the simulator aren't signed, so there's no keychain access group 
// for the simulator to check. This means that all apps can see all keychain items when run 
// on the simulator. 
// // If a SecItem contains an access group attribute, SecItemAdd and SecItemUpdate on the 
// simulator will return -25243 (errSecNoAccessForItem). 
#else 
[dictForQuery setObject:accessGroup forKey:(id)kSecAttrAccessGroup]; 
#endif 
} 
[dictForQuery setValue:(id)kCFBooleanTrue forKey:(id)kSecMatchCaseInsensitive]; 
[dictForQuery setValue:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit]; 
[dictForQuery setValue:(id)kCFBooleanTrue forKey:(id)kSecReturnData]; 
OSStatus queryErr = noErr; 
NSData *udidValue = nil; 
NSString *udid = nil; 
queryErr = SecItemCopyMatching((CFDictionaryRef)dictForQuery, (CFTypeRef*)&udidValue); 
NSMutableDictionary *dict = nil; 
[dictForQuery setValue:(id)kCFBooleanTrue forKey:(id)kSecReturnAttributes]; 
queryErr = SecItemCopyMatching((CFDictionaryRef)dictForQuery, (CFTypeRef*)&dict); 
if (queryErr == errSecItemNotFound) 
{ 
NSLog(@"KeyChain Item: %@ not found!!!", [NSString stringWithUTF8String:kKeychainUDIDItemIdentifier]); 
} 
else if (queryErr != errSecSuccess) 
{ 
NSLog(@"KeyChain Item query Error!!! Error code:%ld", queryErr); 
} 
if (queryErr == errSecSuccess) 
{ 
NSLog(@"KeyChain Item: %@", udidValue);
if (udidValue) 
{ 
udid = [NSString stringWithUTF8String:udidValue.bytes]; 
} 
} 
[dictForQuery release]; 
return udid; 
}

上面代码的流程也差不多一样,首先创建一个Dictionary,其中设置一下查找条件,然后通过SecItemCopyMatching方法获取到我们之前保存到KeyChain中的数据。

  

四、总结

  本文介绍了使用KeyChain实现APP删除后依然可以获取到相同的UDID信息的解决方法。

  你可能有疑问,如果系统升级以后,是否仍然可以获取到之前记录的UDID数据?

  答案是肯定的,这一点我专门做了测试。就算我们程序删除掉,系统经过升级以后再安装回来,依旧可以获取到与之前一致的UDID。但是当我们把整个系统还原以后是否还能获取到之前记录的UDID,这一点我觉得应该不行,不过手机里面数据太多,没有测试,如果大家有兴趣可以测试一下,验证一下我的猜想。

  

  完整代码地址: https://github.com/smileEvday/SvUDID

  大家如果要在真机运行时,需要替换两个地方:

  第一个地方是plist文件中的accessGroup中的APPIdentifier。

  第二个地方是SvUDIDTools.m中的kKeyChainUDIDAccessGroup的APPIdentity为你所使用的profile的APPIdentifier。

  文章和代码中如果有什么不对的地方,欢迎指正,在这儿先谢过了。



swift-UDID的代替UUIDKeychain UDID的代替UUID Keychain 立即下载

相关推荐

408计算机复试专业课问答汇总

408计算机复试专业课问答汇总

weixin_45930223的博客 3699

iOS7: 如何获取不变的UDID

如何使用KeyChain保存和获取UDID     本文是iOS7系列文章第一篇文章,主要介绍使用KeyChain保存和获取APP数据,解决iOS7上获取不变UDID的问题。并给出一个获取UDID的工具类,使用方便,只需要替换两个地方即可。   一、iOS不用版本获取UDID的方法比较      1)iOS 5.0   iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符...

weixin_34255793的博客 287

从零到千兆:KSZ9031 PHY芯片在Zynq PS端的驱动移植心路历程

本文详细记录了在Xilinx Zynq-7000平台(基于XC7Z020芯片)上,为KSZ9031千兆以太网PHY芯片移植LwIP协议栈驱动的完整过程。从硬件连接配置、Vivado工程设置到LwIP库的深度修改与调试,分享了解决PHY识别、自协商及性能优化等关键问题的实战经验,助力开发者实现稳定的千兆网络连接。

honey的博客 1106

ios设备唯一标识获取策略

英文原文:In iOS 7 and later, if you ask for the MAC address of an iOS device, the system returns the value 02:00:00:00:00:00. If you need to identify the device, use the identifierForVendor property of

为你超神 853

别再踩坑了!Vue3 + Vant 手把手教你搞定飞书网页应用免登(SSO),附完整代码和重定向URL配置

本文详细介绍了如何使用Vue3和Vant实现飞书H5应用的免登(SSO)功能,包括飞书后台配置的关键细节、Vue3前端实现的最佳实践以及常见问题排查指南。特别针对重定向URL配置、安全设置和错误处理等常见陷阱提供了解决方案,并附有完整代码示例和性能优化建议。

weixin_29323551的博客 406

第二十三章 Nest集成日志框架Winston

Winston是一个非常流行的Node.js日志框架,而Nest.js是一个基于Node.js的后端框架。修改 winston.module.ts 内容如下 添加 forRoot 方法,接收 winston 的 createLogger 方法的参数,返回动态模块的 providers、exports。这里用到了 printf 的 format 函数,它可以自定义打印的日志格式 且使用了chalk 加上了颜色,并且打印了 dayjs 格式化的时间。可以看到控制台打印了自定义的 logger 的自定义。

枫ゞ的博客 1069

macOS 更新后找不到钥匙串访问工具的解决方案

随着macOS的不断更新,一些系统工具的位置可能会发生变化,给用户带来不便。钥匙串访问(Keychain Access)是macOS中一个非常重要的工具,用于管理密码、证书等敏感信息。最近,一些用户在更新到最新版本的macOS后发现,在“实用工具”文件夹中找不到钥匙串访问APP。本文将提供详细的解决方案,帮助您找回钥匙串访问工具。

smileKH的博客 1万+

例题讲解拉格朗日乘子法、线性可分支持向量机(SVM)的推导

支持向量机(Support Vector Machine, SVM)的简单推导及例题

zzzssszzzzsz的博客 5683

swift获取openuuid_iOS获取设备唯一标识:UDID、IDFA、IDFV、OpenIDFA、SimulateIDFA等.

1. UDIDUDID全称是Unique Device Identifier,顾名思义,它就是苹果iOS设备的唯一标识码,它由40个字符的字母和数字组成。在很多需要限制一台设备一个张红的应用中经常会用到。哎iOS5中可以获取到设备的UDID,iOS7中已经完全禁用了它。iOS7之前的使用app如果在iOS7以上的设备运行,它不会反悔设备的UDID,而是会返回一串字符串,以FFFFF开头,跟着一串十...

weixin_36429702的博客 2461

第5.1节 构网控制:电压源特性与电压调节

摘要: 构网型变流器的核心物理本质是作为可控交流电压源,通过戴维南等效模型(受控电势源+低输出阻抗)自主建立并调节电压,增强电网电压刚度。其电压调节通过无功-电压闭环控制实现,内环为自动电压调节器(AVR),外环为无功-电压下垂特性,模拟同步发电机功能。关键技术包括自适应增益、虚拟阻抗补偿及动态限流策略,以应对弱电网稳定性、故障过流等问题。该设计满足《规范》对电压调节范围、动态无功支撑的要求,是高比例新能源电力系统电压稳定的关键解决方案。

技术工作者 1110

【Docker】搭建一个媒体服务器插件后端API服务 - MetaTube

本教程基于群晖的NAS设备DS423+的docker功能进行搭建,DSM版为 7.2.1-69057 Update 5。MetaTube是一个媒体服务器插件,主要用于Emby和Jellyfin媒体服务器。它的主要功能是从互联网上抓取内容并响应 JSON 数据,然后通过预安装的 MetaTube 插件请求服务器并下载相应的元数据,以与 Jellyfin/Emby 服务器配合使用。使用 MetaTube 的步骤大致如下:部署后端:首先,需要部署一个名为​ 的后端 API 服务器来抓取内容。

小小笔记大大用处 1万+

转:如何使用KeyChain保存和获取UDID。 iOS7获取唯一标示符的方法

本文转自:http://www.cnblogs.com/smileEvday/p/UDID.html (一片枫叶) 如何使用KeyChain保存和获取UDID   本文是iOS7系列文章第一篇文章,主要介绍使用KeyChain保存和获取APP数据,解决iOS7上获取不变UDID的问题。并给出一个获取UDID的工具类,使用方便,只需要替换两个地方即可。 一、iOS不用版本获...

weixin_30725315的博客 90

抖音创作者必备工具!免费一键批量下载无水印视频 + 一键提取抖音视频文案

抖音创作者必备工具!免费一键批量下载无水印视频 + 一键提取抖音视频文案

XiaoqiangClub的博客 3364

如何使用KeyChain保存和获取UDID

本文是iOS7系列文章第一篇文章,主要介绍使用KeyChain保存和获取APP数据,解决iOS7上获取不变UDID的问题。并给出一个获取UDID的工具类,使用方便,只需要替换两个地方即可。   一、iOS不用版本获取UDID的方法比较      1)iOS 5.0   iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可

The Life with iOS 1762

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

iOS 获取设备唯一标示符 UDID UUID IDFA IDFV IMEI IMSI MAC地址 OpenUUID

各种获取设备唯一标识的方法介绍一.UDID(Unique Device Identifier)UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它由40位16进制数的字母和数字组成(越狱的设备通过某些工具可以改变设备的UDID)。移动网络可利用UDID来识别移动设备,但是,从IOS5.0(2011年8月份)开始,苹果宣布将不再支持用uniqueId...

SJ_1314的博客 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

KeyChain保存和获取应用的UDID

KeyChain保存和获取应用的UDIDTODO手机网络游戏,希望玩家不用输入账号就能自动登录到游戏中,这样就需要生成设备的唯一UDID作为账号,需求在删除游戏重新安装、升级游戏等情况下UDID账号不会更改。思路1.生成一个UDID 2.iOS手机上把UDID保存到keychain(钥匙链)中1.1在iOS系统中,获取设备唯一标识的方法有很多:一.UDID(Unique Device Identi

Teng's world 3460

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

keychain(钥匙串,设备唯一标示获取)

WWDC 2013已经闭幕,IOS7 Beta随即发布,界面之难看无以言表...,简直就是山寨Android。 更让IOS程序猿悲催的是,设备唯一标识的MAC Address在IOS7中也失效了。 IOS系统中,获取设备唯一标识的方法有很多: 一.UDID(Unique Device Identifier)  UDID的全称是Unique Device Identifier

u010679895的专栏 2386

iOS获取设备的唯一标识的方

iOS获取设备的唯一标识的方法

lmyuanhang的专栏 2818

iOS获取设备的唯一标识的方法

各种获取设备唯一标识的方法介绍 一.UDID(Unique Device Identifier) UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它由40位16进制数的字母和数字组成(越狱的设备通过某些工具可以...

wwj256的专栏 2525

iOS开发之UDID获取和使用

UDID 项目 说明 全称 Unique Device Identifier,设备唯一标识符。 格式 40个字符长度的字符串(字母+数字) 特点 每台 iOS设备唯一的、仅与设备相关的,这点与设备序列号相似 作用 区分 iOS 设备(包括 iPhone、iPad 等),将其他数据与设备关联起来。 场景 设备注册、埋点统计等。 获取方法 1. 通过 iTunes/...

悄然林静的博客 2088

转载:如何使用KeyChain保存和获取UDID

一、关于为什么在iOS中使用UDIDTools...在 iOS6之前开发一般都是使用设备的mac地址来唯一标示每一台设备,可是,在iOS7之后由于系统的原因,每次获得mac地址,所有、获得的值都是:02:00:00:00:00:00如此,在iOS7之后的使用中在通过获得设备的mac地址来表示设备便不再管用了。作为替代,iOS 中有个方法也是可以获得设备的id的,即可以通过 [[UIDev...

dicuolu4266的博客 135

如何使用KeyChain保存和获取UDID - Flex/AS Programmer

原文 http://www.cnblogs.com/yssgyw/p/3364370.html 本文是iOS7系列文章第一篇文章,主要介绍使用KeyChain保存和获取APP数据,解决iOS7上获取不变UDID的问题。并给出一个获取UDID的工具类,使用方便,只需要替换两个地方即可。 一、iOS不用版本获取UDID的方法比较 1)iOS 5.0 iOS 2.0版本以...

143

【iOS】—— 获取设备唯一标识

一、UDID(Unique Device Identifier) UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它由40位16进制数的字母和数字组成(越狱的设备通过某些工具可以改变设备的UDID)。移动网络可利用UDID来识别移动设备,但是,从IOS5.0(2011年8月份)开始,苹果宣布将不再支持用uniqueIdentifier方法获取设备的UDID,iOS5以下是可以用的。苹果从iOS5开始就移除了通过代码访问UDID的权限。从2013年5月1日起

m0_55124878的博客 6022

ios 设备获取idfa_获取iOS设备唯一标示UUID

在开发过程中,我们经常会被要求获取每个设备的唯一标示,以便后台做相应的处理。我们来看看有哪些方法来获取设备的唯一标示,然后再分析下这些方法的利弊。具体可以分为如下几种:UDIDIDFAIDFVMACkeychain下面我们来具体分析下每种获取方法的利弊1、UDID什么是UDIDUDID 「Unique Device Identifier Description」是由子母和数字组成的40个字符串的序...

weixin_42133329的博客 2073
上一篇: ios Mac 地址获取
下一篇: android 中国天气网天气预报
骑行的蜗牛
博客等级 码龄21年 107粉丝 86原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值