经常有朋友来问这个问题。

每次都去解释这个问题也浪费不少时间,

所以还是开一篇文章,

把这个问题说清楚吧。

先纠正一个误区吧:

有同学可以通过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);
}
Objective-c

特别说明:

由于引入了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;
Objective-c

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的解决方案的更多相关文章

  1. IOS7.0唯一“设备ID”的获取方法

    ios7.0 以后通过sysctl获得的mac地址已经失效,所有设备均为020000000000. 可以通过苹果的keychain机制,实现设备的唯一ID标示. 具体过程:在app第一次安装时,生成一 ...

  2. IOS开发之——OpenUDID的使用获取用户唯一设备

    下载网址:https://github.com/ylechelle/OpenUDID OpenUDID测试结果分析 1)优点: a.没有用到MAC地址.MAC地址跟UDID一样,存在隐私问题.不能保证 ...

  3. iOS 唯一设备号

    https://github.com/fabiocaccamo/FCUUID 目前比较好的解决方案.

  4. 【转】获取android设备 id

    关于本文档 Android的开发者在一些特定情况下都需要知道手机中的唯一设备ID.例如,跟踪应用程序的安装,生成用于复制保护的DRM时需要使用设备的唯一ID.在本文档结尾处提供了作为参考的示例代码片段 ...

  5. 获取iOS设备唯一标识

    [获取iOS设备唯一标识] 1.已禁用-[UIDevice uniqueIdentifier] 苹果总是把用户的隐私看的很重要.-[UIDevice uniqueIdentifier]在iOS5实际在 ...

  6. Android能够获取到唯一的设备ID吗?

    Android是否有唯一的设备ID,如果有的话,该怎样快速有效获取? Settings.Secure#ANDROID_ID 返回Android ID ,是一个64位的16进制字符串 1 2 3 imp ...

  7. 【转】iOS设备的UDID是什么?苹果为什么拒绝获取iOS设备UDID的应用?如何替代UDID?

    本文讲诉的主要是为什么苹果2011年8月发布iOS 5后就开始拒绝App获取设备的UDID以及UDID替补方案,特别提醒开发者苹果App Store禁止访问UDID的应用上架(相关推荐:APP被苹果A ...

  8. IOS 生成设备唯一标识

    前言 iOS设备5.0以上放弃使用[[UIDevice currentDevice] uniqueIdentifier]来获得设备唯一ID iOS设备私有方法禁止用户获取和使用IMEI 需求 需要一个 ...

  9. iOS学习——获取iOS设备的各种信息

    不管是在Android开发还是iOS开发过程中,有时候我们需要经常根据设备的一些状态或信息进行不同的设置和性能配置,例如横竖屏切换时,电池电量低时,内存不够时,网络切换时等等,我们在这时候需要进行一些 ...

随机推荐

  1. Problem A: 踢罐子 解题报告

    Problem A: 踢罐子 Description 平面上有\(n\)个点,其中任意2点不重合,任意3点不共线. 我们等概率地选取一个点A,再在剩下的\(n-1\)个点中等概率地选取一个点B,再在剩 ...

  2. webpack插件去除没用到的css

    去除没用到的css需要用到purifycss-webpack插件,而这个插件又依赖于purify-css 1.安装 npm i purifycss-webpack purify-css -D 2.加入 ...

  3. Java基础-逻辑运算符Logic Operators

    Java基础-逻辑运算符Logic Operators 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.逻辑运算符 逻辑运算符是对布尔值进行操作运算的,常见的有: 1>.逻 ...

  4. MingW-v4.8.0+EDE-v13.04 配置使用C语言图形库

    From: http://www.cnblogs.com/killerlegend/p/3946768.html Author:KillerLegend Date:2014.8.30 MingW的配置 ...

  5. 【学习笔记】Spring AOP注解使用总结

    Spring AOP基本概念 是一种动态编译期增强性AOP的实现 与IOC进行整合,不是全面的切面框架 与动态代理相辅相成 有两种实现:基于jdk动态代理.cglib Spring AOP与Aspec ...

  6. JMS学习(二)之ActiveMQ

    1,ActiveMQ是Apache实现的基于JMS的一个消息服务器.下面记录ActiveMQ的一些基本知识. 2,ActiveMQ connectors:ActiveMQ providesconnec ...

  7. ASP.Net巧用窗体母版页

    背景:每个网页的基本框架结构类似: 浏览网站的时候会发现,好多网站中,每个网页的基本框架都是一样的,比如,最上面都是网站的标题,中间是内容,最下面是网站的版权.开发提供商等信息: 在这些网页中,表头. ...

  8. AngularJs-$parsers自我理解-解析

    $parsers 首先先了解下它具体的作用,当用户与控制器进行交互的时候.ngModelController中的$setViewValue()方法就会被调用,$parsers的数组中函数就会以流水线的 ...

  9. 洛谷 P1045 【麦森数】快速幂

    不用快速幂,压位出奇迹! 本人是个蒟蒻,不太熟悉快速幂,这里给大家介绍一种压位大法. 让我们来分析一下题目,第一位是送分的,有一个专门求位数的函数:n*log10(2)+1. 然后题目中p<=3 ...

  10. 解决MySQL新增用户无法登陆问题

    1. 新增用户 grant all on *.* to '库名'@'%' identified by '库名'; 2. 刷新授权表 flush privileges; 3. 删除空用户 use mys ...