iOS如何獲取設(shè)備的唯一標(biāo)識(UUID)

前段時間后臺做統(tǒng)計功能的時候需要用到設(shè)備的唯一標(biāo)識练慕,所以得客戶端這邊獲取設(shè)備的唯一標(biāo)識并將其上傳到服務(wù)器赃绊。對于iOS,說到設(shè)備的唯一標(biāo)識以现,估計大家都會不由自主的想到UUID。那該如何去獲取設(shè)備的UUID呢?其實很簡單约啊,一行代碼即可獲取
[[UIDevice currentDevice] identifierForVendor] UUIDString] .

但是這樣的話存在一定的弊端邑遏,當(dāng)你升級或者重裝軟件的時候,UUID會發(fā)生變化恰矩,這時候我們再去獲取UUID時记盒,得到的值和以前的不一樣,但其實還是同一臺設(shè)備外傅,這樣的話會造成我們的統(tǒng)計數(shù)據(jù)不準(zhǔn)纪吮。所以說我們在獲取到UUID后需要解決的是如何保證它的唯一性俩檬。

keychain顧名思義,是鑰匙串的意思碾盟,是蘋果公司Mac OS中的密碼管理系統(tǒng)棚辽。keychain里保存的信息不會因App被刪除而丟失,在用戶重新安裝App后依然有效巷疼,數(shù)據(jù)還在晚胡。所以我們可以將UUID存儲到keychain里面灵奖,需要用到的時候從keychain中取嚼沿,這樣可以保證UUID的唯一性。

首先瓷患,我們新建一個類AppKeyChain骡尽,管理keychain.
AppKeyChain.h

@interface AppKeyChain : NSObject

+ (void)saveData:(id)data forKey:(NSString *)key;//將數(shù)據(jù)寫入keychain中

+ (id)loadForKey:(NSString *)key;//從keychain中獲取數(shù)據(jù)

+ (void)deleteKeyData:(NSString *)key;//刪除keychain中的相應(yīng)數(shù)據(jù)

@end

AppKeyChain.m中實現(xiàn)相應(yīng)的方法

 #import "AppKeyChain.h"
#import  <Security/Security.h>
 

@implementation AppKeyChain

#pragma mark - 保存和讀取UUID

+ (NSMutableDictionary *)getKeychainQuery:(NSString *)key {
    
    
    return [NSMutableDictionary dictionaryWithObjectsAndKeys:
            (id)kSecClassGenericPassword,(id)kSecClass,
            key, (id)kSecAttrService,
            key, (id)kSecAttrAccount,
            (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible, nil];
}

+ (void)saveData:(id)data forKey:(NSString *)key {
    //獲得keychain字典
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:key];
    
    //刪除舊值
    SecItemDelete((CFDictionaryRef)keychainQuery);
    
    //添加新值
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];
    
//    將新的信息添加到keychain中
    SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
}

+ (id)loadForKey:(NSString *)key {
    
    id ret = nil;
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:key];
    
    //Configure the search setting
    //Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
    [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
    
    CFDataRef keyData = NULL;
    
    if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
        @try {
            ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
        } @catch (NSException *e) {
            NSLog(@"存儲失敗,key-- %@  exception-- %@", key, e);
        } @finally {
        }
    }

    if (keyData) {
        CFRelease(keyData);
    }
    
    return ret;
}

+ (void)deleteKeyData:(NSString *)key {
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:key];
    SecItemDelete((CFDictionaryRef)keychainQuery);
}

@end

然后擅编,再創(chuàng)建一個管理UUID的類UUIDManager

在` UUIDManager.h`中聲明一個獲取設(shè)備UUID的方法
#import <Foundation/Foundation.h>

@interface UUIDManager : NSObject
// 獲取設(shè)備唯一標(biāo)識
+ (NSString *)getDeviceID;
@end

UUIDManager.m中實現(xiàn)對應(yīng)的方法

#import "UUIDManager.h"
#import "AppKeyChain.h"
@implementation UUIDManager
+ (NSString *)getDeviceID {
    // 讀取keyChain存儲的UUID
    NSString * strUUID = (NSString *)[AppKeyChain loadForKey: @"uuid"];
    // 首次運(yùn)行生成一個UUID并用keyChain存儲
    if ([strUUID isEqualToString: @""] || !strUUID) {
        // 生成uuid
        CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
        strUUID = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));
        // 將該uuid用keychain存儲
        [AppKeyChain saveData: strUUID forKey: @"uuid"];
    }
    return strUUID;
}
@end

最后攀细,將UUIDManager導(dǎo)入到自己的工程中。
AppDelegate.m將UUID存儲下來

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  
//存儲設(shè)備的UUID
  [UUIDManager getDeviceID];
    
    return YES;
}

這樣爱态,設(shè)備的UUID已經(jīng)被存儲到keychain中谭贪,這時候你就可以隨時隨地獲取設(shè)備的唯一標(biāo)識UUID了

比如我在ViewController.m中取用UUID,直接進(jìn)入UUIDManager

 
- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *deviceUUID  = [UUIDManager getDeviceID];
 
    NSLog(@"獲取設(shè)備的UUID:%@",deviceUUID);
 
    
}

demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锦担,隨后出現(xiàn)的幾起案子俭识,更是在濱河造成了極大的恐慌,老刑警劉巖洞渔,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件套媚,死亡現(xiàn)場離奇詭異,居然都是意外死亡磁椒,警方通過查閱死者的電腦和手機(jī)堤瘤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浆熔,“玉大人本辐,你說我怎么就攤上這事∫皆觯” “怎么了师郑?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長调窍。 經(jīng)常有香客問我宝冕,道長,這世上最難降的妖魔是什么邓萨? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任地梨,我火速辦了婚禮菊卷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宝剖。我一直安慰自己洁闰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布万细。 她就那樣靜靜地躺著扑眉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赖钞。 梳的紋絲不亂的頭發(fā)上腰素,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音雪营,去河邊找鬼弓千。 笑死,一個胖子當(dāng)著我的面吹牛献起,可吹牛的內(nèi)容都是我干的洋访。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼谴餐,長吁一口氣:“原來是場噩夢啊……” “哼姻政!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岂嗓,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤汁展,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后摄闸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體善镰,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年年枕,在試婚紗的時候發(fā)現(xiàn)自己被綠了炫欺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡熏兄,死狀恐怖品洛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摩桶,我是刑警寧澤桥状,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站硝清,受9級特大地震影響辅斟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芦拿,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一士飒、第九天 我趴在偏房一處隱蔽的房頂上張望查邢。 院中可真熱鬧,春花似錦酵幕、人聲如沸扰藕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邓深。三九已至,卻和暖如春笔刹,著一層夾襖步出監(jiān)牢的瞬間芥备,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工徘熔, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留门躯,地道東北人淆党。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓酷师,卻偏偏與公主長得像,于是被迫代替她去往敵國和親染乌。 傳聞我的和親對象是個殘疾皇子山孔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容