MyUUIDManager.h

  1. #import <Foundation/Foundation.h>
  2.  
  3. NS_ASSUME_NONNULL_BEGIN
  4.  
  5. @interface MyUUIDManager : NSObject
  6. +(void)saveUUID:(NSString *)uuid;
  7.  
  8. +(NSString *)getUUID;
  9.  
  10. +(void)deleteUUID;
  11. @end
  12.  
  13. NS_ASSUME_NONNULL_END

MyUUIDManager.m

  1. #import "MyUUIDManager.h"
  2. #import "MyKeyChainManager.h"
  3. @implementation MyUUIDManager
  4. static NSString * const KEY_IN_KEYCHAIN = @"com.myuuid.uuid";
  5.  
  6. +(void)saveUUID:(NSString *)uuid{
  7. if (uuid && uuid.length > 0) {
  8. [MyKeyChainManager save:KEY_IN_KEYCHAIN data:uuid];
  9. }
  10. }
  11.  
  12. +(NSString *)getUUID{
  13. //先获取keychain里面的UUID字段,看是否存在
  14. NSString *uuid = (NSString *)[MyKeyChainManager load:KEY_IN_KEYCHAIN];
  15.  
  16. //如果不存在则为首次获取UUID,所以获取保存。
  17. if (!uuid || uuid.length == 0) {
  18. CFUUIDRef puuid = CFUUIDCreate( nil );
  19.  
  20. CFStringRef uuidString = CFUUIDCreateString( nil, puuid );
  21.  
  22. uuid = [NSString stringWithFormat:@"%@", uuidString];
  23.  
  24. [self saveUUID:uuid];
  25.  
  26. CFRelease(puuid);
  27.  
  28. CFRelease(uuidString);
  29. }
  30.  
  31. return uuid;
  32. }
  33.  
  34. +(void)deleteUUID{
  35. [MyKeyChainManager delete:KEY_IN_KEYCHAIN];
  36. }
  37.  
  38. @end

MyKeyChainManager.h

  1. #import <Foundation/Foundation.h>
  2.  
  3. NS_ASSUME_NONNULL_BEGIN
  4.  
  5. @interface MyKeyChainManager : NSObject
  6.  
  7. + (void)save:(NSString *)service data:(id)data;
  8. + (id)load:(NSString *)service ;
  9. + (void)delete:(NSString *)service ;
  10. @end
  11.  
  12. NS_ASSUME_NONNULL_END

MyKeyChainManager.m

  1. #import "MyKeyChainManager.h"
  2.  
  3. @implementation MyKeyChainManager
  4.  
  5. + (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
  6. return [NSMutableDictionary dictionaryWithObjectsAndKeys:
  7. (__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass,
  8. service, (__bridge_transfer id)kSecAttrService,
  9. service, (__bridge_transfer id)kSecAttrAccount,
  10. (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,(__bridge_transfer id)kSecAttrAccessible,
  11. nil];
  12. }
  13.  
  14. + (void)save:(NSString *)service data:(id)data {
  15. //Get search dictionary
  16. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  17. //Delete old item before add new item
  18. SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
  19. //Add new object to search dictionary(Attention:the data format)
  20. [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData];
  21. //Add item to keychain with the search dictionary
  22. SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL);
  23. }
  24.  
  25. + (id)load:(NSString *)service {
  26. id ret = nil;
  27. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  28. //Configure the search setting
  29. [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];
  30. [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];
  31. CFDataRef keyData = NULL;
  32. if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
  33. @try {
  34. ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];
  35. } @catch (NSException *e) {
  36.  
  37. } @finally {
  38. }
  39. }
  40. return ret;
  41. }
  42.  
  43. + (void)delete:(NSString *)service {
  44. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  45. SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
  46. }
  47.  
  48. @end

使用:NSLog(@"%@",[MyUUIDManager getUUID]);

//如果uuid为空

  1. if(!uuid){
  2. // 获取UUID 这个是要引入<AdSupport/AdSupport.h>的
  3. if ( [[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled] ) {
  4. uuid = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
  5. return uuid;
  6. }else{
  7. return @"";
  8. }
  9. }

oc唯一标时一部设备的更多相关文章

  1. SYN1610型B码时统设备

       SYN1610型B码时统设备 产品概述 SYN1610型B码时统设备是由西安同步电子科技有限公司精心设计.自行研发生产的一款模块化配置的通用性时统终端,可接收北斗/ GPS信号/ IRIG-B码 ...

  2. 痞子衡嵌入式:可通过USB Device Path来唯一指定i.MXRT设备进行ROM/Flashloader通信

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是通过USB Device Path来唯一指定i.MXRT设备进行ROM/Flashloader通信. i.MXRT系列高性能微控制器从2 ...

  3. SYN3305A型 小型时统设备

       SYN3305A型  小型时统设备 产品概述 SYN3305A型小型时统设备是由西安同步电子科技有限公司精心设计.自行研发生产的一款高准确度的锁相石英频率标准.内装OCX0恒温晶体振荡器,利用G ...

  4. iOS开发——底层OC篇&运行时常用

    运行时常用 什么是Runtime(前面的文章已经说的很清楚了,这里就简单的介绍一下) 我们写的代码在程序运行过程中都会被转化成runtime的C代码执行,例如[target doSomething]; ...

  5. iOS OC环信实时语音切换听筒免提听不到声音报错:AVAudioSessionErrorCodeBadParam

    出现这个报错:AVAudioSessionErrorCodeBadParam 先看看你的问题是不是在切换听筒免提的时候 听不到声音了, 不是的可以继续搜索去了   问题在这里 把圈住的那个货换成这个就 ...

  6. 为什么说OC是运行时语言?什么是动态类型、动态绑定、动态加载?

    转载:https://www.cnblogs.com/dxb123456/p/5525343.html 动态: 主要是将数据类型的确定由编译时,推迟到了运行时. 这个问题其实浅涉及到两个概念,运行时和 ...

  7. oc的运行时系统

    Objective-C is a class-based object system. Each object is an instance of some class; the object's i ...

  8. Mysql使用Java UUID作为唯一值时使用前缀索引测试

    Mysql可以使用字符串前缀 作为索引 以节约空间. 下面我们以 Java的UUID 生成的 32位(移除UUID中的 中划线)字符串 来做一下 测试. 表结构: CREATE TABLE `test ...

  9. linux 在 open 时复制设备

    管理存取控制的另一个技术是创建设备的不同的私有拷贝, 根据打开它的进程. 明显地, 这只当设备没有绑定到一个硬件实体时有可能; scull 是一个这样的"软件"设备 的例子. /d ...

随机推荐

  1. sql proc触发异常处理回滚

    sql proc触发异常处理回滚 针对proc嵌套proc很有用 begin begin try begin tran --判断错误 BEGIN --ROLLBACK TRAN SET @vcResu ...

  2. C语言 · 数的统计

    问题描述 在一个有限的正整数序列中,有些数会多次重复出现在这个序列中. 如序列:3,1,2,1,5,1,2.其中1就出现3次,2出现2次,3出现1 次,5出现1次. 你的任务是对于给定的正整数序列,从 ...

  3. ensp实战之防火墙安全转发策略

    本次实验用防火墙是USG6000V,拓扑图如下: 步骤一: 按上面配好PC1.2.3以及WWW服务器的IP地址.子网掩码以及网关: 步骤二: 进入防火墙的CLI命令模式下,按一下命令配置: 配置各个接 ...

  4. USACO 2.4 Cow Tours

    Cow Tours Farmer John has a number of pastures on his farm. Cow paths connect some pastures with cer ...

  5. ZS and The Birthday Paradox

    ZS and The Birthday Paradox 题目链接:http://codeforces.com/contest/711/problem/E 数学题(Legendre's formula) ...

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

  7. EasyuiAPI:菜单

    一.LinkButton(按钮) 1.通过标签创建: <a id="btn" href="#" class="easyui-linkbutton ...

  8. C socket指南

    1.介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措? ...

  9. C/C++的静态库与动态库

    C/C++编程中相关文件后缀(以Linux系统下为例): .a:           静态库(archive) .c/.cpp:  C/C++源程序 .h/.hpp: C/C++源程序的头文件 .i: ...

  10. Gym 100553B Burrito King 无脑背包

    题意就是你有n和m两个上限 吃一个东西会同时增加两个东西 m的值不能超过给定的m 问最后的n m值和每个东西吃了多少 贪心一下就好了 算一下性价比 从最大的开始吃 直到吃满了m n也一定是最大了 只是 ...