iOS开发之获取设备唯一标识UUID
<p>首先我们知道获取设备标识的三种方法</p><div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*卸载应用重新安装后会不一致</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
+ (NSString *<span style="color: rgba(0, 0, 0, 1)">)getUUID{
CFUUIDRef uuid </span>=<span style="color: rgba(0, 0, 0, 1)"> CFUUIDCreate(NULL);
NSString </span>*UUID = (__bridge_transfer NSString *<span style="color: rgba(0, 0, 0, 1)">)CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> UUID;
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*卸载应用重新安装后会不一致</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
+ (NSString *<span style="color: rgba(0, 0, 0, 1)">)getUUID{
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> .identifierForVendor.UUIDString;;
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">* 不会因为应用卸载改变
* 但是用户在设置-隐私-广告里面限制广告跟踪后会变成@"00000000-0000-0000-0000-000000000000"
* 重新打开后会变成另一个,还原广告标识符也会变
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
+ (NSString *<span style="color: rgba(0, 0, 0, 1)">)getUUID{
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> [[ advertisingIdentifier] UUIDString];
}</span></pre>
</div>
<p>我们看这三个方法是不是都不稳妥,可能都会改变,那我们得想个办法把值存好了,存到钥匙串</p>
<p>首先打开钥匙串权限</p>
<p><img src="https://img2018.cnblogs.com/blog/1347820/201909/1347820-20190920100426826-2138695968.png" alt=""></p>
<p> </p>
<p> 然后是核心存储代码</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">#import</span> <Foundation/Foundation.h>
<span style="color: rgba(0, 0, 255, 1)">@interface</span><span style="color: rgba(0, 0, 0, 1)"> KeyChainStore : NSObject
</span>+ (<span style="color: rgba(0, 0, 255, 1)">void</span>)save:(NSString*)service data:(<span style="color: rgba(0, 0, 255, 1)">id</span><span style="color: rgba(0, 0, 0, 1)">)data;
</span>+ (<span style="color: rgba(0, 0, 255, 1)">id</span>)load:(NSString*<span style="color: rgba(0, 0, 0, 1)">)service;
</span>+ (<span style="color: rgba(0, 0, 255, 1)">void</span>)deleteKeyData:(NSString*<span style="color: rgba(0, 0, 0, 1)">)service;
</span><span style="color: rgba(0, 0, 255, 1)">@end</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">#import</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">KeyChainStore.h</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">@implementation</span><span style="color: rgba(0, 0, 0, 1)"> KeyChainStore
</span>+ (NSMutableDictionary*)getKeychainQuery:(NSString*<span style="color: rgba(0, 0, 0, 1)">)service {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">[NSMutableDictionary dictionaryWithObjectsAndKeys:
(</span><span style="color: rgba(0, 0, 255, 1)">id</span>)kSecClassGenericPassword,(<span style="color: rgba(0, 0, 255, 1)">id</span><span style="color: rgba(0, 0, 0, 1)">)kSecClass,
service,(</span><span style="color: rgba(0, 0, 255, 1)">id</span><span style="color: rgba(0, 0, 0, 1)">)kSecAttrService,
service,(</span><span style="color: rgba(0, 0, 255, 1)">id</span><span style="color: rgba(0, 0, 0, 1)">)kSecAttrAccount,
(</span><span style="color: rgba(0, 0, 255, 1)">id</span>)kSecAttrAccessibleAfterFirstUnlock,(<span style="color: rgba(0, 0, 255, 1)">id</span><span style="color: rgba(0, 0, 0, 1)">)kSecAttrAccessible,
nil];
}
</span>+ (<span style="color: rgba(0, 0, 255, 1)">void</span>)save:(NSString*)service data:(<span style="color: rgba(0, 0, 255, 1)">id</span><span style="color: rgba(0, 0, 0, 1)">)data{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Get search dictionary</span>
NSMutableDictionary*keychainQuery =<span style="color: rgba(0, 0, 0, 1)"> ;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Delete old item before add new item</span>
<span style="color: rgba(0, 0, 0, 1)"> SecItemDelete((CFDictionaryRef)keychainQuery);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Add new object to searchdictionary(Attention:the data format)</span>
forKey:(<span style="color: rgba(0, 0, 255, 1)">id</span><span style="color: rgba(0, 0, 0, 1)">)kSecValueData];
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Add item to keychain with the searchdictionary</span>
<span style="color: rgba(0, 0, 0, 1)"> SecItemAdd((CFDictionaryRef)keychainQuery,NULL);
}
</span>+ (<span style="color: rgba(0, 0, 255, 1)">id</span>)load:(NSString*<span style="color: rgba(0, 0, 0, 1)">)service {
</span><span style="color: rgba(0, 0, 255, 1)">id</span> ret =<span style="color: rgba(0, 0, 0, 1)">nil;
NSMutableDictionary</span>*keychainQuery =<span style="color: rgba(0, 0, 0, 1)"> ;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Configure the search setting
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Since in our simple case we areexpecting only a single attribute to be returned (the password) wecan set the attribute kSecReturnData to kCFBooleanTrue</span>
;
;
CFDataRef keyData </span>=<span style="color: rgba(0, 0, 0, 1)">NULL;
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(SecItemCopyMatching((CFDictionaryRef)keychainQuery,(CFTypeRef*)&keyData) ==<span style="color: rgba(0, 0, 0, 1)">noErr){
</span><span style="color: rgba(0, 0, 255, 1)">@try</span><span style="color: rgba(0, 0, 0, 1)">{
ret </span>=;
}</span><span style="color: rgba(0, 0, 255, 1)">@catch</span>(NSException *<span style="color: rgba(0, 0, 0, 1)">e) {
NSLog(</span><span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">Unarchiveof %@ failed: %@</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,service, e);
}</span><span style="color: rgba(0, 0, 255, 1)">@finally</span><span style="color: rgba(0, 0, 0, 1)">{
}
}
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(keyData)
CFRelease(keyData);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> ret;
}
</span>+ (<span style="color: rgba(0, 0, 255, 1)">void</span>)deleteKeyData:(NSString*<span style="color: rgba(0, 0, 0, 1)">)service {
NSMutableDictionary</span>*keychainQuery =<span style="color: rgba(0, 0, 0, 1)"> ;
SecItemDelete((CFDictionaryRef)keychainQuery);
}
</span><span style="color: rgba(0, 0, 255, 1)">@end</span></pre>
</div>
<p>调用代码</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*获取UUID</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
+ (NSString *<span style="color: rgba(0, 0, 0, 1)">)getUUIDByKeyChain{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 这个key的前缀最好是你的BundleID</span>
NSString*strUUID = (NSString*);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">首次执行该方法时,uuid为空</span>
<span style="color: rgba(0, 0, 255, 1)">if</span>(|| !<span style="color: rgba(0, 0, 0, 1)">strUUID)
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取UUID 这个是要引入<AdSupport/AdSupport.h>的</span>
strUUID =<span style="color: rgba(0, 0, 0, 1)"> [[ advertisingIdentifier] UUIDString];
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(strUUID.length ==<span style="color: rgba(128, 0, 128, 1)">0</span> || )
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">生成一个uuid的方法</span>
CFUUIDRef uuidRef=<span style="color: rgba(0, 0, 0, 1)"> CFUUIDCreate(kCFAllocatorDefault);
strUUID </span>= (NSString*<span style="color: rgba(0, 0, 0, 1)">)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault,uuidRef));
CFRelease(uuidRef);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将该uuid保存到keychain</span>
;
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> strUUID;
}</span></pre>
</div>
<p>借鉴链接 https://blog.csdn.net/lg767201403/article/details/80568798</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/hecanlin/p/11555184.html
頁:
[1]