iOS编程——经过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)
iOS编程——通过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)
很多的应用都需要用到手机的唯一标示,而且要求这个唯一标示不能因为应用app的卸载或者改变而变化。
在iOS7以前是可以通过Mac地址来实现这个功能的,但是iOS7(包含)以后是无法获得Mac地址的;苹果官方推荐使用UUID,但是每次随着APP的卸载重装,UUID会随之发生变化,那该如何处理呢?
我们需要一个能在app卸载重装后不会改变的值,而keyChain恰巧就可以做到。配合UUID就可以实现了!让我们来分析下:
1.我们首先需要导入Security.frameWork(keychain依赖它),然后需要一个keychain管理器,一个uuid管理器,文件组成如下:
2.首先来看MyKeychainManager,其实就是对keychain的增、删、改、查,类似于数据库的处理。
先通过.h文件来开放下增、删、改、查四个接口:
#import <Foundation/Foundation.h>@interface MyKeyChainManager : NSObject+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service;+ (void)save:(NSString *)service data:(id)data;+ (id)load:(NSString *)service;+ (void)delete:(NSString *)service;@end
.m文件实现接口,keychain的使用网上很多,直接贴代码了:
#import "MyKeyChainManager.h"@implementation MyKeyChainManager : NSObject + (NSMutableDictionary *)getKeychainQuery:(NSString *)service {return [NSMutableDictionary dictionaryWithObjectsAndKeys:(__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass,service, (__bridge_transfer id)kSecAttrService,service, (__bridge_transfer id)kSecAttrAccount,(__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,(__bridge_transfer id)kSecAttrAccessible,nil];
}+ (void)save:(NSString *)service data:(id)data {//Get search dictionaryNSMutableDictionary *keychainQuery = [self getKeychainQuery:service];//Delete old item before add new item
SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);//Add new object to search dictionary(Attention:the data format)[keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData];//Add item to keychain with the search dictionary
SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL);
}+ (id)load:(NSString *)service {id ret = nil;NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];//Configure the search setting[keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];[keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];CFDataRef keyData = NULL;if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {@try {ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];} @catch (NSException *e) {NSLog(@"Unarchive of %@ failed: %@", service, e);} @finally {}}return ret;
}+ (void)delete:(NSString *)service {NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
}@end
3.再来看下MyUUIDManager文件,实现的是对UUID的增、删、改、查,其中save既是增也是改:
#import <Foundation/Foundation.h>@interface MyUUIDManager: NSObject+(void)saveUUID:(NSString *)uuid;+(NSString *)getUUID;+(void)deleteUUID;@end
.m文件来实现它:
#import "MyUUIDManager.h" #import "MyKeyChainManager.h"@implementation MyUUIDManagerstatic NSString * const KEY_IN_KEYCHAIN = @"com.myuuid.uuid";+(void)saveUUID:(NSString *)uuid{if (uuid && uuid.length > 0) {[MyKeyChainManager save:KEY_IN_KEYCHAIN data:uuid];} }+(NSString *)getUUID{//先获取keychain里面的UUID字段,看是否存在NSString *uuid = (NSString *)[MyKeyChainManager load:KEY_IN_KEYCHAIN];//如果不存在则为首次获取UUID,所以获取保存。if (!uuid || uuid.length == 0) {CFUUIDRef puuid = CFUUIDCreate( nil );CFStringRef uuidString = CFUUIDCreateString( nil, puuid );uuid = [NSString stringWithFormat:@"%@", uuidString];[self saveUUID:uuid];CFRelease(puuid);CFRelease(uuidString);}return uuid; }+(void)deleteUUID{[MyKeyChainManager delete:KEY_IN_KEYCHAIN]; }@end
4.测试一下:
NSString *uuid = [MyUUIDManager getUUID];NSLog(@"uuid: %@",uuid); 2015-08-10 18:14:07.641 MyTest[3190:220331] uuid: 839E055B-09A5-42E1-A46C-DF4481E23333
5.把app删除掉重新安装一下,再打印一下:
2015-08-10 18:22:37.122 MyTest[3214:222053] uuid: 839E055B-09A5-42E1-A46C-DF4481E23333
转载于:https://www.cnblogs.com/DoNetCShap/p/5175401.html
iOS编程——经过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)相关推荐
- iOS进阶:【Mac地址】iOS another way to get mac address after iOS 7:getMacAddressFromMDNS
文章目录 前言 I.MAC地址是什么? 1.1 MAC地址一共分为三类 1.2 根据MAC地址的OUI查询生产厂商信息 II.iOS another way to get mac address af ...
- Linux 网络编程——原始套接字实例:MAC 地址扫描器
如果 A (192.168.1.1 )向 B (192.168.1.2 )发送一个数据包,那么需要的条件有 ip.port.使用的协议(TCP/UDP)之外还需要 MAC 地址,因为在以太网数据包中 ...
- unity基础开发----Unity获取PC,Ios系统的mac地址等信息
在软件开发中可以会用到mac地址作为,设备的唯一标示,我们也可以通过unity获取,经测试pc,ios都可以但是安卓没有获取到. 代码如下: using UnityEngine; using Syst ...
- ios 设备获取idfa_获取iOS设备唯一标示UUID
在开发过程中,我们经常会被要求获取每个设备的唯一标示,以便后台做相应的处理.我们来看看有哪些方法来获取设备的唯一标示,然后再分析下这些方法的利弊. 具体可以分为如下几种: UDID IDFA IDFV ...
- swift获取openuuid_获取iOS设备唯一标示UUID——Swift版
在开发过程中,我们经常会被要求获取每个设备的唯一标示,以便后台做相应的处理.我们来看看有哪些方法来获取设备的唯一标示,然后再分析下这些方法的利弊. 具体可以分为如下几种: UDID IDFA IDFV ...
- ios 通过搜索设备MAC地址绑定
养小猫咪的伙伴来我的店铺逛逛吧!抖音商城搜索#早睡早起的猫咪小铺子 最近做了一个物联网项目,涉及到了设备绑定配网这块,需要了解一下iOS BLE与设备绑定的相关知识点,第一次接触蓝牙相关的项目,所以开 ...
- 网络编程懒人入门(九):通俗讲解,有了IP地址,为何还要用MAC地址?
1.前言 标题虽然是为了解释有了 IP 地址,为什么还要用 MAC 地址,但是本文的重点在于理解为什么要有 IP 这样的东西.本文对读者的定位是知道 MAC 地址是什么,IP 地址是什么. (本文同步 ...
- MAC X or Ios平台上的学习工具
2019独角兽企业重金招聘Python工程师标准>>> 本专题介绍了20款左右的应用,由于数量很多,不可能把每个应用都介绍得很详细.以后笔者还会专门写一些帖子介绍某一个应用的使用心得 ...
- 网络编程之通俗讲解,有了IP地址,为何还要用MAC地址?
网络编程之通俗讲解,有了IP地址,为何还要用MAC地址? 前言 书上说的 基本概念: 什么是MAC地址? 什么是IP地址? 为什么要用到MAC地址? IP地址与MAC地址的区别是什么? MAC地址涉及 ...
最新文章
- php 单一入口 seo,网站结构分类(单一入口还是多入口)
- 吴思教授:揭秘视觉信息处理的闭环
- 杭电2055 另一种
- css实验内容,12个令人惊叹的CSS实验项目
- SAP_常用业务数据表设计
- Qt / Qt5 事件(event)机制详解
- sh脚本学习之: sh脚本 、sed、awk
- C#只用属性来解决兔子,不用方法和循环
- Python基础知识:字符串
- 给表空间增加数据文件
- 如何在博客中插入数学公式
- 兼容性测试中如何切换和管理多个JDK版本
- 架构之美第三章-美丽架构之道
- C++和VC++学习方法
- xss之CSP bypass
- SaaS行业的六大安全问题
- 利用ptython中的tutle画了一个表情包——2020冲冲冲!!
- 15-python推导式
- ZEGO即构科技荣获36氪【WISE2020中国新经济之王最具影响力企业】
- 【51单片机实验笔记】2. 数码管的基本控制
热门文章
- format 转化时间格式不起作用
- 【问链财经-区块链基础知识系列】 第十九课 区块链应用于电子存证
- oracle和mysql查询_Oracle和MySQL分组查询GROUP BY
- java控制一次传10条数据_java 定时同步数据的任务优化
- JZOJ 5475. 【NOIP2017提高组正式赛】逛公园
- java 初始化一个实体对象_Java 对象初始化
- 关于QMap的几点总结思考
- 什么叫基于web的网站_什么叫响应式网站?响应式网站模板教程
- 手机浏览器不支持jquery_简洁清新实用适合做浏览器主页 支持手机浏览器
- 利用Matlab求解线性规划问题