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版)相关推荐

  1. 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 ...

  2. Linux 网络编程——原始套接字实例:MAC 地址扫描器

    如果 A (192.168.1.1 )向 B (192.168.1.2 )发送一个数据包,那么需要的条件有 ip.port.使用的协议(TCP/UDP)之外还需要 MAC 地址,因为在以太网数据包中 ...

  3. unity基础开发----Unity获取PC,Ios系统的mac地址等信息

    在软件开发中可以会用到mac地址作为,设备的唯一标示,我们也可以通过unity获取,经测试pc,ios都可以但是安卓没有获取到. 代码如下: using UnityEngine; using Syst ...

  4. ios 设备获取idfa_获取iOS设备唯一标示UUID

    在开发过程中,我们经常会被要求获取每个设备的唯一标示,以便后台做相应的处理.我们来看看有哪些方法来获取设备的唯一标示,然后再分析下这些方法的利弊. 具体可以分为如下几种: UDID IDFA IDFV ...

  5. swift获取openuuid_获取iOS设备唯一标示UUID——Swift版

    在开发过程中,我们经常会被要求获取每个设备的唯一标示,以便后台做相应的处理.我们来看看有哪些方法来获取设备的唯一标示,然后再分析下这些方法的利弊. 具体可以分为如下几种: UDID IDFA IDFV ...

  6. ios 通过搜索设备MAC地址绑定

    养小猫咪的伙伴来我的店铺逛逛吧!抖音商城搜索#早睡早起的猫咪小铺子 最近做了一个物联网项目,涉及到了设备绑定配网这块,需要了解一下iOS BLE与设备绑定的相关知识点,第一次接触蓝牙相关的项目,所以开 ...

  7. 网络编程懒人入门(九):通俗讲解,有了IP地址,为何还要用MAC地址?

    1.前言 标题虽然是为了解释有了 IP 地址,为什么还要用 MAC 地址,但是本文的重点在于理解为什么要有 IP 这样的东西.本文对读者的定位是知道 MAC 地址是什么,IP 地址是什么. (本文同步 ...

  8. MAC X or Ios平台上的学习工具

    2019独角兽企业重金招聘Python工程师标准>>> 本专题介绍了20款左右的应用,由于数量很多,不可能把每个应用都介绍得很详细.以后笔者还会专门写一些帖子介绍某一个应用的使用心得 ...

  9. 网络编程之通俗讲解,有了IP地址,为何还要用MAC地址?

    网络编程之通俗讲解,有了IP地址,为何还要用MAC地址? 前言 书上说的 基本概念: 什么是MAC地址? 什么是IP地址? 为什么要用到MAC地址? IP地址与MAC地址的区别是什么? MAC地址涉及 ...

最新文章

  1. php 单一入口 seo,网站结构分类(单一入口还是多入口)
  2. 吴思教授:揭秘视觉信息处理的闭环
  3. 杭电2055 另一种
  4. css实验内容,12个令人惊叹的CSS实验项目
  5. SAP_常用业务数据表设计
  6. Qt / Qt5 事件(event)机制详解
  7. sh脚本学习之: sh脚本 、sed、awk
  8. C#只用属性来解决兔子,不用方法和循环
  9. Python基础知识:字符串
  10. 给表空间增加数据文件
  11. 如何在博客中插入数学公式
  12. 兼容性测试中如何切换和管理多个JDK版本
  13. 架构之美第三章-美丽架构之道
  14. C++和VC++学习方法
  15. xss之CSP bypass
  16. SaaS行业的六大安全问题
  17. 利用ptython中的tutle画了一个表情包——2020冲冲冲!!
  18. 15-python推导式
  19. ZEGO即构科技荣获36氪【WISE2020中国新经济之王最具影响力企业】
  20. 【51单片机实验笔记】2. 数码管的基本控制

热门文章

  1. format 转化时间格式不起作用
  2. 【问链财经-区块链基础知识系列】 第十九课 区块链应用于电子存证
  3. oracle和mysql查询_Oracle和MySQL分组查询GROUP BY
  4. java控制一次传10条数据_java 定时同步数据的任务优化
  5. JZOJ 5475. 【NOIP2017提高组正式赛】逛公园
  6. java 初始化一个实体对象_Java 对象初始化
  7. 关于QMap的几点总结思考
  8. 什么叫基于web的网站_什么叫响应式网站?响应式网站模板教程
  9. 手机浏览器不支持jquery_简洁清新实用适合做浏览器主页 支持手机浏览器
  10. 利用Matlab求解线性规划问题