UUID獲取及寫(xiě)入Keychain

在開(kāi)發(fā)過(guò)程中富腊,很多時(shí)候需要查看該用戶是上傳唯一識(shí)別標(biāo)志,安卓設(shè)備可以設(shè)定上傳IMEI赃承。但蘋(píng)果設(shè)備已經(jīng)不支持獲取IMEI,作為替代我們使用UUID來(lái)作唯一標(biāo)示符。
****一悴侵、uuid類和keychain類****

#import <Foundation/Foundation.h>

@interface HAUUID : NSObject
/**
 *  獲取uuid
 *
 *  @param block 返回uuid和是否初裝
 */
+ (void)getUUIDCompletionBlock:(void(^)(NSString*UUIDString,BOOL firstInstall))block;
@end
#import "HAUUID.h"
#import "HAKeyChainStore.h"

#define  KEY_USERNAME_PASSWORD @""
#define  KEY_USERNAME @"com.company.app.username"
#define  KEY_PASSWORD @"com.company.app.password"
@implementation HAUUID
+ (void)getUUIDCompletionBlock:(void(^)(NSString*UUIDString,BOOL firstInstall))block{
    NSString * strUUID = (NSString *)[HAKeyChainStore load:KEY_USERNAME_PASSWORD];
    BOOL installState  =NO;
    //首次執(zhí)行該方法時(shí)瞧剖,uuid為空
    if ([strUUID isEqualToString:@""] || !strUUID)
    {
        installState =YES;//初裝
        //生成一個(gè)uuid的方法
        CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
        
        strUUID = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));
        
        //將該uuid保存到keychain
        [HAKeyChainStore save:KEY_USERNAME_PASSWORD data:strUUID];
        
    }
    block(strUUID,installState);
}


@end
#import <Foundation/Foundation.h>

@interface HAKeyChainStore : NSObject

+ (void)save:(NSString *)service data:(id)data;
+ (id)load:(NSString *)service;
+ (void)deleteKeyData:(NSString *)service;

@end
#import "HAKeyChainStore.h"

@implementation HAKeyChainStore


+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
    return [NSMutableDictionary dictionaryWithObjectsAndKeys:
            (id)kSecClassGenericPassword,(id)kSecClass,
            service, (id)kSecAttrService,
            service, (id)kSecAttrAccount,
            (id)kSecAttrAccessibleAfterFirstUnlock,(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((CFDictionaryRef)keychainQuery);
    //Add new object to search dictionary(Attention:the data format)
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];
    //Add item to keychain with the search dictionary
    SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
}

+ (id)load:(NSString *)service {
    id ret = nil;
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    //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(@"Unarchive of %@ failed: %@", service, e);
        } @finally {
        }
    }
    if (keyData)
        CFRelease(keyData);
    return ret;
}



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

@end

****二、生成Entitlements文件****

左側(cè)的目錄會(huì)自動(dòng)生成Entitlements文件可免,不需要自己創(chuàng)建了抓于。
也就是說(shuō),Bundle Identifier浇借、Keychain Sharing的Keychain Groups捉撮、Entitlements文件的Keychain Access Groups的第一個(gè)元素,它們要保持上圖所示的一致性妇垢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巾遭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子闯估,更是在濱河造成了極大的恐慌灼舍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涨薪,死亡現(xiàn)場(chǎng)離奇詭異骑素,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)刚夺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)献丑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)末捣,“玉大人,你說(shuō)我怎么就攤上這事创橄÷嶙觯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵筐摘,是天一觀的道長(zhǎng)卒茬。 經(jīng)常有香客問(wèn)我,道長(zhǎng)咖熟,這世上最難降的妖魔是什么圃酵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮馍管,結(jié)果婚禮上郭赐,老公的妹妹穿的比我還像新娘。我一直安慰自己确沸,他們只是感情好捌锭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著罗捎,像睡著了一般观谦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桨菜,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天豁状,我揣著相機(jī)與錄音,去河邊找鬼倒得。 笑死泻红,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的霞掺。 我是一名探鬼主播谊路,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼菩彬!你這毒婦竟也來(lái)了缠劝?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挤巡,失蹤者是張志新(化名)和其女友劉穎剩彬,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體矿卑,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喉恋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轻黑。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糊肤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氓鄙,到底是詐尸還是另有隱情馆揉,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布抖拦,位于F島的核電站升酣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏态罪。R本人自食惡果不足惜噩茄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望复颈。 院中可真熱鬧绩聘,春花似錦、人聲如沸耗啦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帜讲。三九已至衅谷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間似将,已是汗流浹背会喝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玩郊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓枉阵,卻偏偏與公主長(zhǎng)得像译红,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兴溜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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