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 dictionary
NSMutableDictionary *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 MyUUIDManager static NSString * const KEY_IN_KEYCHAIN = @"com.myuuid.uuid"; +(void)saveUUID:(NSString *)uuid{
if (uuid && uuid.length > ) {
[MyKeyChainManager save:KEY_IN_KEYCHAIN data:uuid];
}
} +(NSString *)getUUID{
//先获取keychain里面的UUID字段,看是否存在
NSString *uuid = (NSString *)[MyKeyChainManager load:KEY_IN_KEYCHAIN]; //如果不存在则为首次获取UUID,所以获取保存。
if (!uuid || uuid.length == ) {
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);
-- ::07.641 MyTest[:] uuid: 839E055B-09A5-42E1-A46C-DF4481E23333
5.把app删除掉重新安装一下,再打印一下:
-- ::37.122 MyTest[:] uuid: 839E055B-09A5-42E1-A46C-DF4481E23333
iOS编程——经过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)的更多相关文章
- iOS开发之 -- 获取设备的唯一标示符
各种获取设备唯一标识的方法介绍 一.UDID(Unique Device Identifier) UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它 ...
- iOS开发——获取手机当前WiFi名和MAC地址
获取手机WiFi信息. iOS9以前的方法,还是能用,警告就警告吧!iOS9以后使用的是苹果最新的API框架,NetworkExtension/NEHotspotHelper.h,这个框架,第一次开放 ...
- unity基础开发----Unity获取PC,Ios系统的mac地址等信息
在软件开发中可以会用到mac地址作为,设备的唯一标示,我们也可以通过unity获取,经测试pc,ios都可以但是安卓没有获取到. 代码如下: using UnityEngine; using Syst ...
- iOS UDID和UUID详解
这篇是普及知识来了,纯属消遣时间,有需要的可以遛一遛. UDID的全名为 Unique Device Identifier :设备唯一标识符.从名称上也可以看出,UDID这个东西是和设备有关的,而且是 ...
- ios 唯一标示符
大家知道苹果每部 iOS 设备都有一个 UDID,它就像设备的身份证一样,记录着设备的名称.类型甚至一些关于用户的私人信息.通常情况下,UDID 的一个最大功能就是帮助广告发布商向特定用户推送定向广告 ...
- 网络编程懒人入门(九):通俗讲解,有了IP地址,为何还要用MAC地址?
1.前言 标题虽然是为了解释有了 IP 地址,为什么还要用 MAC 地址,但是本文的重点在于理解为什么要有 IP 这样的东西.本文对读者的定位是知道 MAC 地址是什么,IP 地址是什么. (本文同步 ...
- Unity3d获得Android和ios设备的唯一标识
android为mac地址,ios为advertisingIdentifier 函数都比较简单,网上也搜得到,我也就不多说了,主要是对于我们没做过安卓和IOS开发的人来说,整合进工程有各种的问题. 我 ...
- [译] 二、开始iOS编程之前,你还需要做什么?
声明:本文翻译自AppCoda网站的文章:What You Need to Begin iOS Programming?,作者是创建者Simon Ng.如有异议,请联系博主. 更新:帖子已经重新被 ...
- IOS编程User Interface基础
IOS编程之User Interface基础 目录 概述 相关概念 常见问题 状态栏的隐藏 应用图标的设置 概述 IOS用户界面是APP呈现给用户最直观.最常用的方式,因此学会用户界面的编程是学习IO ...
随机推荐
- 【Unity3D插件】NGUI屏幕自适应(转)
屏幕自适应 NGUI可以比较方便的实现屏幕自适应,但是它的官方教程里面针对这个问题没有详细的教程,所以可能在实现的时候会走比较多的弯路.以下是我在开发过程中找到的一个比较方便的实现方法. 主要组件 1 ...
- CISCO 双线接入MAP配置详解
随着我国宽带技术的普及,各个公司都会有一至二条Internet接入线路,这些线路可能由电信.网通.长宽.联通等不同的IS提供,尽管他们在局端采用的技术可能有不同,但对客户而言都是同样接入方式,以太 ...
- java_DAO类基本设计
package cn.itcast.oa.base; import java.util.List; public interface BaseDao<T> { void save(T en ...
- php运行步骤解析
2000年, PHP4.0发布的时候,引入了Zend Engine. Zend引擎把PHP代码的执行切分成两个阶段: 一. Zend Engine 解析PHP代码并生成二进制中间码Zend Opcod ...
- Codec工具类
import java.math.BigInteger; import org.apache.commons.codec.DecoderException; import org.apache.com ...
- SSH Spring3\Java1.8 “Unable to instantiate Action, xxAction, defined for 'xxAction_login' in namespace '/'null”
1.Stacktraces Unable to instantiate Action,xxAction, defined for 'xxAction_login' in namespace '/'nu ...
- lisener在web.xml中设置
/* * servlet监听器开发步骤: * 1.写一个类实现XXXListener接口(6个=3个容器+3个对容器中属性进行操作) * 2.在web.xml中配置<listener> - ...
- Android图片选择器--仿QQ
当做一款APP,需要选择本地图片时,首先考虑的无疑是系统相册,但是Android手机五花八门,再者手机像素的提升,大图无法返回等异常因数,导致适配机型比较困难,微信.QQ都相继的在自己的APP里集成了 ...
- mysql开启外联方法
1.修改Mysql配置文件 /etc/mysql/my.cnf 注释掉 bind-address = 127.0.0.1 2.重启Mysql /etc/init.d/mysql restart 3.r ...
- linux下获取ip
如果打开虚拟机 没有ip置灰显示了 lo 可以使用dhclient自动获取ip 如果想开机就自动获取ip: vim /etc/rc.d/rc.local 在这里插入dhclient命令