iOS UUIDUDID
iOS UDID&&UUID
一、基本概念
- UDID
Unique Device Identifier :设备唯一标识符,用来唯一识别某台设备。在很多需要限制一台设备一个账号的应用中经常会用到,在Symbian时代,我们是使用IMEI作为设备的唯一标识的,可惜的是Apple官方不允许开发者获得设备的IMEI. - UUID
Universally Unique Identifier :通用唯一标识符,它能让你在不同地点,不借助中央服务器的情况下为任何项目创建唯一的标识符。例如:如果你要在App里加入一个永不会和其它ID冲突的用户ID,你可以自己建一个服务器,并用脚本为每个客户端分配一个ID。但这种集中管理的方式受网络影响,速度慢,而且服务器处理时间也影响速度。事实上你可以用UUID,它在每个客户端上生成ID,生成的ID不会跟任何ID重复(UUID生成条件:
1.当前日期和时间
2.时钟序列
3.全局唯一的IEEE机器识别号,如果有网卡从网卡MAC地址获得,没有网卡以其他方式获得)。
二、iOS中的使用
- UDID
[[UIDevice currentDevice] uniqueIdentifier]
iOS5.0之后,苹果为了保护用户隐私,取消了获取UDID的方法.
- UUID
//使用CFUUID生成UUID
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
CFStringRef strRef = CFUUIDCreateString(kCFAllocatorDefault, uuidRef);
NSString *uuidString = [NSString stringWithString:(NSString*)strRef];
CFRelease(strRef);
CFRelease(uuidRef);
//使用NSUUID生成UUID
NSString *uuid = [NSUUID UUID].UUIDString;
- 测试几个UUID相关方法
for (int i = 0; i < 3; i++){//返回当前的设备唯一标识UUID,该标识会随app卸载而更改NSUUID *uuid = [UIDevice currentDevice].identifierForVendor;NSLog(@"uuid 1 = %@",uuid.UUIDString);}NSLog(@"----------------------------------------------------");for (int i = 0; i < 3; i++){//随机生成一个UUID,每一个时刻的UUID值都不同NSString *uuid = [NSUUID UUID].UUIDString;NSLog(@"uuid 2 = %@",uuid);}NSLog(@"----------------------------------------------------");for (int i = 0; i < 3; i++) {//通过KeyChain+BoundleID+CFUUID生成的UUID,可用于设备识别,不会随设备删除APP而更改NSLog(@"uuid 3 = %@", [UUID getUUID]);}/*///打印结果
2018-07-13 09:52:24.019429+0800 UUID&UDID[939:297892] uuid 1 = D0F0DF48-AA92-4C59-915C-2B59C6FCD342
2018-07-13 09:52:24.019914+0800 UUID&UDID[939:297892] uuid 1 = D0F0DF48-AA92-4C59-915C-2B59C6FCD342
2018-07-13 09:52:24.020497+0800 UUID&UDID[939:297892] uuid 1 = D0F0DF48-AA92-4C59-915C-2B59C6FCD342
2018-07-13 09:52:24.020522+0800 UUID&UDID[939:297892] ----------------------------------------------------
2018-07-13 09:52:24.020544+0800 UUID&UDID[939:297892] uuid 2 = 24FFCCC0-736B-41BC-8057-B89E4D173040
2018-07-13 09:52:24.020560+0800 UUID&UDID[939:297892] uuid 2 = E9477585-5FDF-4CEB-99C4-F24CE23137A2
2018-07-13 09:52:24.020574+0800 UUID&UDID[939:297892] uuid 2 = 05E0B08F-9827-4D6B-B00F-8C8D087FC69B
2018-07-13 09:52:24.020605+0800 UUID&UDID[939:297892] ----------------------------------------------------
2018-07-13 09:52:24.025173+0800 UUID&UDID[939:297892] uuid 3 = 7B751FCB-5FA6-4A53-8268-626C10E7D879
2018-07-13 09:52:24.026516+0800 UUID&UDID[939:297892] uuid 3 = 7B751FCB-5FA6-4A53-8268-626C10E7D879
2018-07-13 09:52:24.027810+0800 UUID&UDID[939:297892] uuid 3 = 7B751FCB-5FA6-4A53-8268-626C10E7D879*/
实现上面例子中的[UUID getUUID]方法,使用UUID替代UDID
这里需要实现2个工具类
KeyChainStore 和 UUIDKeyChainStore.h
#import <Foundation/Foundation.h>@interface KeyChainStore : NSObject+ (void)save:(NSString *)service data:(id)data;+ (id)load:(NSString *)service;+ (void)deleteKeyData:(NSString *)service;@end
KeyChainStore.m
#import "KeyChainStore.h"@implementation KeyChainStore+ (NSMutableDictionary *)getKeyChainQuery:(NSString *)service{return [NSMutableDictionary dictionaryWithObjectsAndKeys:(id)kSecClassGenericPassword, (id)kSecClass,service, (id)kSecAttrService,service, (id)kSecAttrAccount,(id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,nil]; }+ (void)save:(NSString *)service data:(id)data{//获取到查询字典NSMutableDictionary *keychainQuery = [self getKeyChainQuery:service];//添加新的item之前删除旧的SecItemDelete((CFDictionaryRef)keychainQuery);//添加新的对象用来查询字典[keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData]; ;//将查询结果添加到keychain中SecItemAdd((CFDictionaryRef)keychainQuery, NULL); }+ (id)load:(NSString *)service{id ret = nil;NSMutableDictionary *keychainQuery = [self getKeyChainQuery:service];[keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];[keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];CFDataRef keyData = NULL;if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {@try {ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];} @catch (NSException *e) {NSLog(@"Unarchive of %@ failed: %@", service, e);} @finally {}}if (keyData){CFRelease(keyData);}return ret; }+ (void)deleteKeyData:(NSString *)service {NSMutableDictionary *keychainQuery = [self getKeyChainQuery:service];SecItemDelete((CFDictionaryRef)keychainQuery); } @end
UUID.h
#import <Foundation/Foundation.h>@interface UUID : NSObject+ (NSString *)getUUID;@end
UUID.m
#import "UUID.h"#import "KeyChainStore.h"@implementation UUID+ (NSString *)getUUID{NSString *bundleID = [[NSBundle mainBundle] bundleIdentifier];NSString *strUUID = (NSString *)[KeyChainStore load:bundleID];if ([strUUID isEqualToString:@""] || !strUUID) {CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);strUUID = (NSString *)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuidRef));[KeyChainStore save:bundleID data:strUUID];}return strUUID; }@end
iOS UUIDUDID相关推荐
- Xcode couldn‘t find any iOS App Development provisioning profiles matching ‘com.example.***‘
在更新完iOS14.3后,Xcode真机调试时报错,无法进行真机测试: 报以下错误: No profiles for 'com.example.software.Login' were found: ...
- iOS视频硬编码技术
iOS视频硬编码技术 一.iOS视频采集硬编码 基本原理 硬编码 & 软编码 硬编码:通过系统自带的Camera录制视频,实际上调用的是底层的高清编码硬件模块,即显卡,不使用CPU,速度快 软 ...
- iphone smtp服务器没有响应,电子邮件卡在iPhone或iPad上的发件箱?如何修复iOS中的未发送邮件 | MOS86...
您曾经在iOS中发送电子邮件,只能将信息卡在iPhone,iPad或iPod touch的邮件应用发件箱中?你知道这是什么时候发生的,因为在iOS的Mail应用程序的底部,状态栏在iOS中显示1个未发 ...
- layer弹窗在IOS上,被软键盘挤到上边的解决方法
就像这种情况,经过多番请教跟尝试,找到一个能解决这个问题的方法,但可能有点笨重.就是在当前弹框里,设置offset的值,里边的值可以随意写,然后再下边给弹框追加一个样式即可. <!DOCTYPE ...
- iOS开发8:使用Tool Bar切换视图
之前讨论的都是单视图应用程序,而在实际应用中,我们可能要多个视图,并根据用户的需要切换视图. iOS中几种典型的多视图程序: (1)Tab Bar Application:程序的底部有一排按钮,轻触其 ...
- 25个增强iOS应用程序性能的提示和技巧 — 中级篇
本文由破船译自:raywenderlich 转载请注明出处:BeyondVincent的博客 _____________ 在开发iOS应用程序时.让程序具有良好的性能是非常关键的.这也是用户所期望的. ...
- iOS Webview打开不受信的URL
在我们开发过程中经常会碰到直接访问开发人员的私有地址, 这样在app 上是无法打开指定的网页的. 在iOS中需要对WKWebView 进行如下设置: 1.在工程的Plist 文件中添加一下选项 App ...
- iOS蓝牙开发---CoreBluetooth[BLE 4.0] 初级篇[内附Demo地址]
一.蓝牙基础知识 (一)常见简称 1.MFI make for ipad ,iphone, itouch 专们为苹果设备制作的设备,开发使用ExternalAccessory 框架(认证流程貌似挺复 ...
- iOS 开发经验总结
iOS 开发经验总结http://www.cocoachina.com/ios/20170216/18699.html 1.cocoa pods 常用的framework 1 2 3 4 5 6 7 ...
最新文章
- FPGA中系统运行频率计算方法
- linux下进制是如何转换?
- android打开项目更换版本,android1.6项目,换成其他包的方法,及修改默认启动虚拟机的版本...
- c 引用mysql报错_安装TPCC-MySQL报错
- net中一些所封装的类
- HDU - 4990 Reading comprehension(矩阵快速幂,水题)
- 图像处理-自适应中值滤波
- [html] 你认为写出什么样的html代码才是好代码呢?
- python执行效果_使用tqdm显示Python代码执行进度功能
- vue 数组添加元素_Vue躬行记(3)——样式和表单
- 机器学习利器——决策树和随机森林
- python psutil 进行系统管理 no.2
- centos7安装tomcat9过程
- 卡诺模型(KANO Model)
- 支付宝免签 个人支付宝到银行卡
- 【2014/10/28】Python string类型
- 研电赛项目之双目测距,涉及matlab相机标定,opencv多线程编程,摄像头读取,行人检测、BM立体匹配等等
- 修复WIN10下Prolific USB-to-Serial Comm Port驱动无法使用
- 表格中insertBefore方法的使用(The node before which the new node is to be inserted is not a child of this no)
- C语言课设物资管理系统,C语言课设之物资管理系统.doc
热门文章
- 联众世界某网站SQL注射漏洞
- 消息人士透露JDI今年开始为苹果Apple Watch供应OLED屏幕
- 微信小程序上拉触底案例添加loading效果
- 奥比中光Orbbec Astra Pro RGBD 3D视觉传感器在ROS(indigo和kinetic)使用说明 rgb depth同时显示
- 一些免费Api分享(持续更新中...)
- OCaml 第一章习题
- Day 12 狂神说Java基础笔记(JVM01-14)
- 达观数据推荐算法实现:协同过滤之item embedding
- java socket发送定长报文_java使用Socket类接收和发送数据
- java的for的执行顺序_对java for 循环执行顺序的详解