全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

在开发中会遇到应用需要记录设备标示,即使应用卸载后再安装也可重新识别的情况,在这写一种实现方式——读取设备的UUID(Universally Unique Identifier)并通过KeyChain记录。

首先iOS中获取设备唯一标示符的方法一直随版本的更新而变化。iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是目前为止唯一可以确认唯一的标示符。好景不长,因为该唯一标识符与手机一一对应,苹果觉得可能会泄露用户隐私,所以在 iOS 5.0之后该方法就被废弃掉了;iOS 6.0系统新增了两个用于替换uniqueIdentifier的接口,分别是:identifierForVendor,advertisingIdentifier,但这两个接口会在应用重新安装时改变数值,并不是唯一的标示符,所以开发者改为使用WiFi的mac地址来取代;iOS 7中苹果又封杀mac地址,所以开发者再次改变思路使用KeyChain来保存获取到的UDID,这样以后即使APP删了再装回来,也可以从KeyChain中读取回来。

首先保存设备的UUID,可以使用类方法+ (id)UUID 是一个类方法,调用该方法可以获得一个UUID。通过下面的代码可以获得一个UUID字符串:

 NSString *uuid = [[NSUUID UUID] UUIDString];

也可以保存在iOS 6中新增的Vindor标示符 (IDFV-identifierForVendor),获取这个IDFV的新方法被添加在已有的UIDevice类中。跟advertisingIdentifier一样,该方法返回的是一个NSUUID对象。

NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

如果用户卸载了同一个vendor对应的所有程序,然后在重新安装同一个vendor提供的程序,此时identifierForVendor会被重置,所以这里要用到KeyChain来保存。

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

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

这四个方法参数比较复杂,一旦传错就会导致操作KeyChain失败,文档中介绍的比较详细,大家可以查查官方文档。而苹果提供的KeyChain使用起来略麻烦,所以这里推荐一个第三方库SAMKeyChains.SAMKeyChains对苹果安全框架API进行了简单封装,支持对存储在钥匙串中密码、账户进行访问,包括读取、删除和设置。SAMKeyChains使用简单,通过实例代码便可掌握。

//保存一个UUID字符串到钥匙串:
CFUUIDRef uuid = CFUUIDCreate(NULL);
assert(uuid != NULL);
CFStringRef uuidStr = CFUUIDCreateString(NULL, uuid);
 [SAMKeychain setPassword: [NSString stringWithFormat:@"%@", uuidStr]
 forService:@"com.yourapp.yourcompany"account:@"user"];

//从钥匙串读取UUID:
NSString *retrieveuuid = [SAMKeychain passwordForService:@"com.yourapp.yourcompany"account:@"user"];

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

更多详细用法说明可以看SAMKeyChains Documentation

基本的实现思路便是这样,下面是具体的一种具体实现代码,仅供参考。

+ (NSString *)getDeviceId
{
  NSString * currentDeviceUUIDStr = [SAMKeychain passwordForService:@" "account:@"uuid"];
  if (currentDeviceUUIDStr == nil || [currentDeviceUUIDStr isEqualToString:@""])
  {
    NSUUID * currentDeviceUUID = [UIDevice currentDevice].identifierForVendor;
    currentDeviceUUIDStr = currentDeviceUUID.UUIDString;
    currentDeviceUUIDStr = [currentDeviceUUIDStr stringByReplacingOccurrencesOfString:@"-" withString:@""];
    currentDeviceUUIDStr = [currentDeviceUUIDStr lowercaseString];
    [SAMKeychain setPassword: currentDeviceUUIDStr forService:@" "account:@"uuid"];
  }
  return currentDeviceUUIDStr;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。、


# iOS  # 获取设备唯一标示符 


相关文章: php条件判断怎么写_ifelse和switchcase的使用区别【对比】  如何快速建站并高效导出源代码?  济南企业网站制作公司,济南社保单位网上缴费步骤?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  宁波自助建站系统如何快速打造专业企业网站?  建站之星如何配置系统实现高效建站?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  制作门户网站的参考文献在哪,小说网站怎么建立?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  常州企业网站制作公司,全国继续教育网怎么登录?  长沙做网站要多少钱,长沙国安网络怎么样?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  如何用PHP快速搭建CMS系统?  如何做静态网页,sublimetext3.0制作静态网页?  建站主机是否等同于虚拟主机?  焦点电影公司作品,电影焦点结局是什么?  建站之星北京办公室:智能建站系统与小程序生成方案解析  如何用景安虚拟主机手机版绑定域名建站?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  如何在VPS电脑上快速搭建网站?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  定制建站方案优化指南:企业官网开发与建站费用解析  h5网站制作工具有哪些,h5页面制作工具有哪些?  深圳网站制作平台,深圳市做网站好的公司有哪些?  网站制作网站,深圳做网站哪家比较好?  ui设计制作网站有哪些,手机UI设计网址吗?  建站之星后台密码如何安全设置与找回?  网站制作公司排行榜,四大门户网站排名?  网站设计制作企业有哪些,抖音官网主页怎么设置?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  网页设计网站制作软件,microsoft office哪个可以创建网页?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  如何配置支付宝与微信支付功能?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  如何通过FTP服务器快速搭建网站?  已有域名能否直接搭建网站?  XML的“混合内容”是什么 怎么用DTD或XSD定义  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  黑客如何通过漏洞一步步攻陷网站服务器?  如何快速配置高效服务器建站软件?  婚礼视频制作网站,学习*后期制作的网站有哪些?  浅谈Javascript中的Label语句  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  香港服务器租用每月最低只需15元?  如何在万网主机上快速搭建网站?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。