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 ...
随机推荐
- sql proc触发异常处理回滚
sql proc触发异常处理回滚 针对proc嵌套proc很有用 begin begin try begin tran --判断错误 BEGIN --ROLLBACK TRAN SET @vcResu ...
- C语言 · 数的统计
问题描述 在一个有限的正整数序列中,有些数会多次重复出现在这个序列中. 如序列:3,1,2,1,5,1,2.其中1就出现3次,2出现2次,3出现1 次,5出现1次. 你的任务是对于给定的正整数序列,从 ...
- ensp实战之防火墙安全转发策略
本次实验用防火墙是USG6000V,拓扑图如下: 步骤一: 按上面配好PC1.2.3以及WWW服务器的IP地址.子网掩码以及网关: 步骤二: 进入防火墙的CLI命令模式下,按一下命令配置: 配置各个接 ...
- USACO 2.4 Cow Tours
Cow Tours Farmer John has a number of pastures on his farm. Cow paths connect some pastures with cer ...
- ZS and The Birthday Paradox
ZS and The Birthday Paradox 题目链接:http://codeforces.com/contest/711/problem/E 数学题(Legendre's formula) ...
- Chapter 2 Open Book——31
"It's too bad about the snow, isn't it?" Edward asked. I had the feeling that he was forci ...
- EasyuiAPI:菜单
一.LinkButton(按钮) 1.通过标签创建: <a id="btn" href="#" class="easyui-linkbutton ...
- C socket指南
1.介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措? ...
- C/C++的静态库与动态库
C/C++编程中相关文件后缀(以Linux系统下为例): .a: 静态库(archive) .c/.cpp: C/C++源程序 .h/.hpp: C/C++源程序的头文件 .i: ...
- Gym 100553B Burrito King 无脑背包
题意就是你有n和m两个上限 吃一个东西会同时增加两个东西 m的值不能超过给定的m 问最后的n m值和每个东西吃了多少 贪心一下就好了 算一下性价比 从最大的开始吃 直到吃满了m n也一定是最大了 只是 ...