iOS 設(shè)備唯一標(biāo)識(shí)符


心境自然涼,涼召夹,涼岩喷,37度都要化了。早起頂著太陽(yáng)走到公司监憎,既能鍛煉身體又能思考問(wèn)題纱意,我不會(huì)說(shuō)太陽(yáng)烤死了,走一路要40分鐘鲸阔,曬的透透的偷霉,吃了個(gè)面包,喝了盒酸奶褐筛,很營(yíng)養(yǎng)类少,這酸奶一定有問(wèn)題,鬧肚子渔扎。又能愉快的寫(xiě)代碼了硫狞,設(shè)計(jì)沒(méi)有,后臺(tái)沒(méi)更新,我了個(gè)擦擦残吩。


方案一

回歸正題了财忽,咳咳
iOS6 之前用的Mac地址,但在iOS7以后會(huì)返回固定值泣侮,方法失效即彪,才有了今天的討論。

IDFA這是iOS 6中另外一個(gè)新的方法活尊,是AdSupport.framework框架中ASIdentifierManager單例提供了一個(gè)方法advertisingIdentifier隶校,通過(guò)調(diào)用該方法會(huì)返回一個(gè)的NSUUID實(shí)例。這一段是我無(wú)恥抄的

作為唯一標(biāo)識(shí)符酬凳,兩個(gè)思路惠况。第一,程序生成宁仔,但保證每次生成結(jié)果一致并唯一稠屠。第二,程序每次生成不一致翎苫,但由系統(tǒng)存儲(chǔ)权埠,不由程序沙盒管理。
IDFA是由系統(tǒng)存儲(chǔ)的煎谍,并且每次生成都是一致攘蔽,太好了,可以拿來(lái)用呐粘。但萬(wàn)物都不可能是完美的满俗,用它需要注意,在往App Store提交時(shí)作岖,對(duì)于廣告選擇選擇234唆垃。再有IDFA 有心的被重置的風(fēng)險(xiǎn)較大,所以這里并不十分推薦痘儡,無(wú)論如何還是要寫(xiě)上步驟辕万。
1、添加框架

AdSupport.framework  

2沉删、添加頭文件

#import <AdSupport/ASIdentifierManager.h>  

3渐尿、使用語(yǔ)句

NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];  

方案二

UUID+keychain

接下來(lái)我摘抄的keychain為鑰匙串,用來(lái)存儲(chǔ)密碼和證書(shū)的一塊加密存儲(chǔ)區(qū)域矾瑰,keychain不是存儲(chǔ)在手機(jī)的沙盒內(nèi)砖茸,而是手機(jī)的某個(gè)公共區(qū)域,手機(jī)重啟和應(yīng)用卸載脯倚,都不會(huì)對(duì)這片存儲(chǔ)區(qū)域造成影響渔彰,因?yàn)槭羌用艽鎯?chǔ)不存在被其他應(yīng)用修改的問(wèn)題嵌屎,所以就有人拿keychain來(lái)存儲(chǔ)唯一標(biāo)識(shí)。
UUID是隨機(jī)的唯一 數(shù)字串恍涂,作為設(shè)備唯一標(biāo)識(shí)宝惰。
兩者結(jié)合實(shí)現(xiàn)了設(shè)備唯一標(biāo)識(shí),當(dāng)然這個(gè)想法是別人想出來(lái)的再沧。
直接上步驟快到飯點(diǎn)了
1.Target - Capabilities - Keychain Sharing - ON尼夺,左側(cè)的目錄會(huì)自動(dòng)生成Entitlements文件,Bundle Identifier炒瘸、Keychain Sharing的Keychain Groups淤堵、Entitlements文件的Keychain Access Groups的第一個(gè)元素,它們要保持一致性顷扩。
2.上代碼 這里是借鑒鐘溪妍的拐邪,她copy的百度的,百度拿的誰(shuí)的
UUID.h

#import  <Foundation/Foundation.h>
@interface UUID : NSObject
+(NSString *)getUUID;

UUID.m

#import "UUID.h"
#import "KeyChainStore.h"


@implementation UUID

+(NSString *)getUUID
{
    NSString * strUUID = (NSString *)[KeyChainStore load:@"com.company.app.usernamepassword"];
    
    //首次執(zhí)行該方法時(shí)隘截,uuid為空
    if ([strUUID isEqualToString:@""] || !strUUID)
    {
        //生成一個(gè)uuid的方法
        CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
        
        strUUID = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));
   
        //將該uuid保存到keychain
        [KeyChainStore save:KEY_USERNAME_PASSWORD data:strUUID];
        
    }
    return strUUID;
}
 
@end

KeyChainStore.h

#import  <Foundation/Foundation.h>

@interface KeyChainStore : NSObject

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

KeyChainStore.m

#import "KeyChainStore.h"


@implementation KeyChainStore

+ (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

在PCH中添加如下宏

#ifndef PrefixHeader_pch
#define PrefixHeader_pch

#define  KEY_USERNAME_PASSWORD @"com.company.app.usernamepassword"
#define  KEY_USERNAME @"com.company.app.username"
#define  KEY_PASSWORD @"com.company.app.password"

#endif

最后的最后

 NSString * uuid= [UUID getUUID];
  NSLog(@"uuid=%@",uuid);
//  uuid 你要的在這

相比心靜自然涼扎阶,倒覺(jué)得心涼自然靜,更有道理婶芭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末东臀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子犀农,更是在濱河造成了極大的恐慌惰赋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呵哨,死亡現(xiàn)場(chǎng)離奇詭異赁濒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)孟害,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)流部,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人纹坐,你說(shuō)我怎么就攤上這事∥璐裕” “怎么了耘子?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)球切。 經(jīng)常有香客問(wèn)我谷誓,道長(zhǎng),這世上最難降的妖魔是什么吨凑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任捍歪,我火速辦了婚禮户辱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糙臼。我一直安慰自己庐镐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布变逃。 她就那樣靜靜地躺著必逆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揽乱。 梳的紋絲不亂的頭發(fā)上名眉,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音凰棉,去河邊找鬼损拢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撒犀,可吹牛的內(nèi)容都是我干的福压。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼绘证,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼隧膏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起嚷那,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胞枕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后魏宽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腐泻,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年队询,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了派桩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚌斩,死狀恐怖铆惑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情送膳,我是刑警寧澤员魏,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站叠聋,受9級(jí)特大地震影響撕阎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碌补,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一虏束、第九天 我趴在偏房一處隱蔽的房頂上張望棉饶。 院中可真熱鬧,春花似錦镇匀、人聲如沸照藻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岩梳。三九已至,卻和暖如春晃择,著一層夾襖步出監(jiān)牢的瞬間冀值,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工宫屠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留列疗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓浪蹂,卻偏偏與公主長(zhǎng)得像抵栈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坤次,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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