oc唯一标时一部设备

MyUUIDManager.h
#import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface MyUUIDManager : NSObject
+(void)saveUUID:(NSString *)uuid; +(NSString *)getUUID; +(void)deleteUUID;
@end NS_ASSUME_NONNULL_END
MyUUIDManager.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 > 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
MyKeyChainManager.h
#import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface MyKeyChainManager : NSObject + (void)save:(NSString *)service data:(id)data;
+ (id)load:(NSString *)service ;
+ (void)delete:(NSString *)service ;
@end NS_ASSUME_NONNULL_END
MyKeyChainManager.m
#import "MyKeyChainManager.h"
@implementation MyKeyChainManager
+ (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) {
} @finally {
}
}
return ret;
}
+ (void)delete:(NSString *)service {
NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
}
@end
使用:NSLog(@"%@",[MyUUIDManager getUUID]);
//如果uuid为空
if(!uuid){
// 获取UUID 这个是要引入<AdSupport/AdSupport.h>的
if ( [[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled] ) {
uuid = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
return uuid;
}else{
return @"";
}
}
oc唯一标时一部设备的更多相关文章
- SYN1610型B码时统设备
SYN1610型B码时统设备 产品概述 SYN1610型B码时统设备是由西安同步电子科技有限公司精心设计.自行研发生产的一款模块化配置的通用性时统终端,可接收北斗/ GPS信号/ IRIG-B码 ...
- 痞子衡嵌入式:可通过USB Device Path来唯一指定i.MXRT设备进行ROM/Flashloader通信
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是通过USB Device Path来唯一指定i.MXRT设备进行ROM/Flashloader通信. i.MXRT系列高性能微控制器从2 ...
- SYN3305A型 小型时统设备
SYN3305A型 小型时统设备 产品概述 SYN3305A型小型时统设备是由西安同步电子科技有限公司精心设计.自行研发生产的一款高准确度的锁相石英频率标准.内装OCX0恒温晶体振荡器,利用G ...
- iOS开发——底层OC篇&运行时常用
运行时常用 什么是Runtime(前面的文章已经说的很清楚了,这里就简单的介绍一下) 我们写的代码在程序运行过程中都会被转化成runtime的C代码执行,例如[target doSomething]; ...
- iOS OC环信实时语音切换听筒免提听不到声音报错:AVAudioSessionErrorCodeBadParam
出现这个报错:AVAudioSessionErrorCodeBadParam 先看看你的问题是不是在切换听筒免提的时候 听不到声音了, 不是的可以继续搜索去了 问题在这里 把圈住的那个货换成这个就 ...
- 为什么说OC是运行时语言?什么是动态类型、动态绑定、动态加载?
转载:https://www.cnblogs.com/dxb123456/p/5525343.html 动态: 主要是将数据类型的确定由编译时,推迟到了运行时. 这个问题其实浅涉及到两个概念,运行时和 ...
- oc的运行时系统
Objective-C is a class-based object system. Each object is an instance of some class; the object's i ...
- Mysql使用Java UUID作为唯一值时使用前缀索引测试
Mysql可以使用字符串前缀 作为索引 以节约空间. 下面我们以 Java的UUID 生成的 32位(移除UUID中的 中划线)字符串 来做一下 测试. 表结构: CREATE TABLE `test ...
- linux 在 open 时复制设备
管理存取控制的另一个技术是创建设备的不同的私有拷贝, 根据打开它的进程. 明显地, 这只当设备没有绑定到一个硬件实体时有可能; scull 是一个这样的"软件"设备 的例子. /d ...
随机推荐
- Struts2 stracture
- 配置Windows为NTP服务器
建议使用 ntpd for windows,这是一个ntp的windows版,操作和linux相似 下载:https://www.meinbergglobal.com/english/sw/ntp.h ...
- Linux操作系统信息查看命令
1. 查看系统内核信息 uname -a 2. 操作系统版本 cat /etc/issue | grep Linux 3. 查看CPU型号 cat /proc/cpuinfo | grep name ...
- [妙味JS基础]第七课:运算符、流程控制
知识点总结 &&(与).||(或).!(非) 与: alert(20 && 20>100) => false alert(20 && 20& ...
- javascript中的事件处理
事件处理:http://www.cnblogs.com/polk6/archive/2016/02/19/5154470.html#Menu2-DOMEventSpecification addEve ...
- bashrc - PS1(提示符配色)
PS1设置: liBlack="\[\033[0;30m\]"boBlack="\[\033[1;30m\]"liRed="\[\033[0;31m\ ...
- ggplot2 geom相关设置——添加线条
在作图过程中,有时我们可能需要通过添加一些线条,使得图形的可视化变得更好,比如一些趋势线等等. 下面我们来看下,一些线条的添加方式. geom_abline(mapping = NULL, data ...
- storm.yaml 配置项
配置项 配置说明 storm.zookeeper.servers ZooKeeper服务器列表 storm.zookeeper.port ZooKeeper连接端口 storm.local.dir s ...
- SecureCRT - 使用方法和技巧
1. 保活防掉线选项 -> 会话选项 -> 终端勾选 自动重新连接, 发送协议 NO-OP 每60秒 2. 拷贝与粘贴的设置选项 -> Global options -> Te ...
- 国外vps品牌vultr宣布100%可用,宕机加倍补偿
全球知名的vps品牌vultr最近发狠招了,宣布所有vps服务器保证100%上线可用.如果出现宕机故障,提供加倍补偿方案.没有一家vps敢声称自己的产品100%可用,行业标准99.99%上线率已经是非 ...