ionic获取ios唯一设备id的解决方案
经常有朋友来问这个问题。
每次都去解释这个问题也浪费不少时间,
所以还是开一篇文章,
把这个问题说清楚吧。
先纠正一个误区吧:
有同学可以通过ionic natvie的device插件获取。
我们在文档里可以找到有serial这个属性。

通过这个属性,我们的确获取到一串字符串。
但是我们也会发现,当我们卸载app之后,这串数值会变,所以这个不能作为我们的唯一设备id。
回归到ios。
我们列举一下可以想到的办法。
ios获取设备id的方法
UUID
设备的唯一标识符,然而在ios6以后就已经被废弃了,现在试图获取这一数值的app会被禁止上架。
MAC
设备的mac地址具备唯一性。然后ios7之后,所有获取的设备mac地址为:02:00:00:00:00:00。
IDFV
相同vendor下(即相同包前缀下)获取的值是一样的,卸载或重装app后,此值会变化。
IDFA
广告id,同一个设备下不同APP都相同且唯一。当然,如果用户在设备里手动重置或禁用广告追踪,这一数值可能会变化或者无法取到。
UUID
这个方法的思路是使用uuid生成一段随机数(重复概率极低),然后使用ios的keychain保存到钥匙链里,这样即使app重新安装和卸载后也不会改变,除非系统刷机和重装系统。
纵观上面所列的方法,我们发现只有最终只有后2种方法接近我们的答案,当然还有一些不完美,但是已经基本符合我们的需求了。
最终的方案:
如果你的工程可以支持adsupport
IDFA+KeyChain
如果你的工程不支持adsupport
UUID+KeyChain
如何实现?
IDFA+KeyChain
1、引入adsupport.fraemwrok
2、获取idfa
NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
3、存储到keychian里。
+ (void)setValue:(NSString *)value forKey:(NSString *)key inService:(NSString *)service {
NSMutableDictionary *keychainItem = [[NSMutableDictionary alloc] init];
keychainItem[(__bridge id)kSecClass] = (__bridge id)kSecClassGenericPassword;
keychainItem[(__bridge id)kSecAttrAccessible] = (__bridge id)kSecAttrAccessibleAlways;
keychainItem[(__bridge id)kSecAttrAccount] = key;
keychainItem[(__bridge id)kSecAttrService] = service;
keychainItem[(__bridge id)kSecValueData] = [value dataUsingEncoding:NSUTF8StringEncoding];
SecItemAdd((__bridge CFDictionaryRef)keychainItem, NULL);
}
特别说明:
由于引入了Adsupport, 所以当你的应用提交到appstore的时候,如果没有接入广告的话,需要正确的选择广告接入选项,否则有被拒的风险。具体参考如下:

UUID+KeyChain
1、生成UUID
+ (NSString *)randomUUID {
if(NSClassFromString(@"NSUUID")) { // only available in iOS >= 6.0
return [[NSUUID UUID] UUIDString];
}
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
CFStringRef cfuuid = CFUUIDCreateString(kCFAllocatorDefault, uuidRef);
CFRelease(uuidRef);
NSString *uuid = [((__bridge NSString *) cfuuid) copy];
CFRelease(cfuuid);
return uuid;
2、写入到keychain
代码同上。
特别说明:
由于Keychain默认是存放在当前app的私有域下的,所以如果想要在app之间共享uuid数据的话,需要开启keychain sharing ,具体操作方法:xcode--capabililties--keychain sharing,然后填写相同的group名字

讲了半天,大家可能会说,这些都是原生的方法,怎么在js里调用啊。
那么cordova其实就是干这个事情的。
为了方便大家使用,我封装成插件,直接安装即可调用。
IDFA+KEYCHAIN
https://github.com/jasonz1987/cordova-plugin-keychain-idfa
UUID+KEYCHAIN
https://github.com/jasonz1987/cordova-plugin-keychain-uuid
ionic获取ios唯一设备id的解决方案的更多相关文章
- IOS7.0唯一“设备ID”的获取方法
ios7.0 以后通过sysctl获得的mac地址已经失效,所有设备均为020000000000. 可以通过苹果的keychain机制,实现设备的唯一ID标示. 具体过程:在app第一次安装时,生成一 ...
- IOS开发之——OpenUDID的使用获取用户唯一设备
下载网址:https://github.com/ylechelle/OpenUDID OpenUDID测试结果分析 1)优点: a.没有用到MAC地址.MAC地址跟UDID一样,存在隐私问题.不能保证 ...
- iOS 唯一设备号
https://github.com/fabiocaccamo/FCUUID 目前比较好的解决方案.
- 【转】获取android设备 id
关于本文档 Android的开发者在一些特定情况下都需要知道手机中的唯一设备ID.例如,跟踪应用程序的安装,生成用于复制保护的DRM时需要使用设备的唯一ID.在本文档结尾处提供了作为参考的示例代码片段 ...
- 获取iOS设备唯一标识
[获取iOS设备唯一标识] 1.已禁用-[UIDevice uniqueIdentifier] 苹果总是把用户的隐私看的很重要.-[UIDevice uniqueIdentifier]在iOS5实际在 ...
- Android能够获取到唯一的设备ID吗?
Android是否有唯一的设备ID,如果有的话,该怎样快速有效获取? Settings.Secure#ANDROID_ID 返回Android ID ,是一个64位的16进制字符串 1 2 3 imp ...
- 【转】iOS设备的UDID是什么?苹果为什么拒绝获取iOS设备UDID的应用?如何替代UDID?
本文讲诉的主要是为什么苹果2011年8月发布iOS 5后就开始拒绝App获取设备的UDID以及UDID替补方案,特别提醒开发者苹果App Store禁止访问UDID的应用上架(相关推荐:APP被苹果A ...
- IOS 生成设备唯一标识
前言 iOS设备5.0以上放弃使用[[UIDevice currentDevice] uniqueIdentifier]来获得设备唯一ID iOS设备私有方法禁止用户获取和使用IMEI 需求 需要一个 ...
- iOS学习——获取iOS设备的各种信息
不管是在Android开发还是iOS开发过程中,有时候我们需要经常根据设备的一些状态或信息进行不同的设置和性能配置,例如横竖屏切换时,电池电量低时,内存不够时,网络切换时等等,我们在这时候需要进行一些 ...
随机推荐
- 【BZOJ1205】[HNOI2005]星际贸易(动态规划)
[BZOJ1205][HNOI2005]星际贸易(动态规划) 题面 BZOJ 洛谷 题解 第一问就是一个裸\(dp\),因为什么都不用考虑... 所以设\(f[i][j]\)表示当前停靠在第\(i\) ...
- SP8093 JZPGYZ - Sevenk Love Oimaster 解题报告
SP8093 JZPGYZ - Sevenk Love Oimaster 题目大意 给定\(n(n\le 10000)\)个模板串,以及\(m(m\le 60000)\)个查询串(模板串总长\(\le ...
- linux BASH shell下设置字体及背景颜色
BASH shell下设置字体及背景颜色 echo -e "\e[31mtest\e[41m" \e[30m 将字符的显示颜色改为黑色 \e[31m 将字符的显示颜色改为红色 \e ...
- JXL读取,写入Excel
JXL读取,写入Excel2003 相关阅读:poi 读写excel2003:http://www.cnblogs.com/gavinYang/p/3576739.htmlpoi 读写excel200 ...
- 单字节编码&双字节编码
单字节编码(WINDOWS-1252.ISO-8859-1.UTF-8) 双字节编码(UTF-16) Windows 记事本默认会将文件保存为单字节的 ANSI(ASCII).如果您选择 " ...
- 20155305乔磊2016-2017-2《Java程序设计》第六周学习总结
20155305乔磊2016-2017-2<Java程序设计>第六周学习总结 教材学习内容总结 InputStream与OutputStream 串流设计 1.串流:Java将输入/输出抽 ...
- XMPP用户登录
CHENYILONG Blog XMPP用户登录 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilon ...
- javascript的this分别代表什么
鉴于大家对this到底代表的是什么有疑问,现在将我个人理解的this的情况整理如下.有错误请指正. 第一种情况: 如果是一个全局的function,则this相当于window对象. 这个打印出来的 ...
- VCForPython27.msi安装后, 还显示error: Unable to find vcvarsall.bat
C:\Users\zpc\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC 增加环境变量: SET VCPYTH ...
- 善用backtrace解决大问题【转】
转自:https://www.2cto.com/kf/201107/97270.html 一.用途: 主要用于程序异常退出时寻找错误原因 二.功能: 回溯堆栈,简单的说就是可以列出当前函数调用关系 三 ...