iOS獲取手機唯一標識符來判斷不同終端登錄(IDFA和UUID分析)

11.13更新

廣告標示符蛔六,適用于對外:例如廣告推廣塘揣,換量等跨應用的用戶追蹤等弥激。

是iOS 6中另外一個新的方法,提供了一個方法advertisingIdentifier释牺,通過調(diào)用該方法會返回一個NSUUID實例萝衩,最后可以獲得一個UUID,由系統(tǒng)存儲著的没咙。不過即使這是由系統(tǒng)存儲的猩谊,但是有幾種情況下,會重新生成廣告標示符祭刚。如果用戶完全重置系統(tǒng)((設(shè)置程序 -> 通用 -> 還原 -> 還原位置與隱私) 牌捷,這個廣告標示符會重新生成。另外如果用戶明確的還原廣告(設(shè)置程序-> 通用 -> 關(guān)于本機 -> 廣告 -> 還原廣告標示符) 涡驮,那么廣告標示符也會重新生成暗甥。關(guān)于廣告標示符的還原,有一點需要注意:如果程序在后臺運行捉捅,此時用戶“還原廣告標示符”撤防,然后再回到程序中,此時獲取廣 告標示符并不會立即獲得還原后的標示符棒口。必須要終止程序寄月,然后再重新啟動程序,才能獲得還原后的廣告標示符无牵。

在同一個設(shè)備上的所有App都會取到相同的值漾肮,是蘋果專門給各廣告提供商用來追蹤用戶而設(shè)的,用戶可以在 設(shè)置|隱私|廣告追蹤 里重置此id的值合敦,或限制此id的使用初橘,故此id有可能會取不到值,但好在Apple默認是允許追蹤的,而且一般用戶都不知道有這么個設(shè)置保檐,所以基本上用來監(jiān)測推廣效果耕蝉,是戳戳有余了。

注意:由于idfa會出現(xiàn)取不到的情況夜只,故絕不可以作為業(yè)務分析的主id垒在,來識別用戶。
因此扔亥,IDFA就是用來跟蹤廣告推廣的场躯,而UUID雖然每次不同,但是可以自己手動存入Keychain來進行唯一性的確保旅挤,這么說來IDFA就是如果廣告商投放的時候使用踢关,而UUID就是自己后臺來判斷用戶是否換了設(shè)備,或者信息不一致需要重新登錄的業(yè)務
知乎上看到一個非常詳細介紹IDFA的文章
IDFA看這個就夠了

IDFA

可以理解為廣告id粘茄,apple公司提供的用于追蹤用戶的廣告標識符签舞。缺點:如果用戶完全重置系統(tǒng)((設(shè)置程序 -> 通用 -> 還原 -> 還原位置與隱私) ,這個廣告標示符會重新生成柒瓣。
另外如果用戶明確的還原廣告(設(shè)置程序-> 通用 -> 關(guān)于本機 -> 廣告 -> 還原廣告標示符) 儒搭,那么廣告標示符也會重新生成

這是iOS 6中另外一個新的方法,advertisingIdentifier是新框架AdSupport.framework的一部分芙贫。ASIdentifierManager單例提供了一個方法advertisingIdentifier搂鲫,通過調(diào)用該方法會返回一個上面提到的NSUUID實例。

// 獲取
//需要導入AdSupport.framework這個庫
#import <AdSupport/AdSupport.h>
NSString *idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

// 判斷是否開啟
// 判斷是否開啟  限制廣告跟蹤選項(該選項在設(shè)置-隱私-廣告-限制廣告隱私)
Boolean on = [[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled];

ios10之前開關(guān)限制廣告追蹤選項的確沒什么用磺平,ios10之后魂仍,如果手機開啟限制廣告追蹤的話就不能再得到廣告標識符,得到的是下面的0褪秀。這個開關(guān)是一個簡單的boolean標志蓄诽,當將廣告標示符發(fā)到任意的服務器端時薛训,你最好判斷一下這個值媒吗,然后再做決定。

//開啟的時候
2016-01-05 15:22:19.218 sss[1773:60b] 41B2FD07-695A-4A27-8D26-C30ECE6F7EAD
2016-01-05 15:22:19.233 sss[1773:60b] 0

//關(guān)閉的時候
2016-01-05 15:19:57.502 sss[1763:60b] 7773E145-26FF-4304-A60F-60C948D52B40
2016-01-05 15:19:57.516 sss[1763:60b] 1

開啟和關(guān)閉切換的話乙埃,idfa會變闸英,如果不切換目尖,保持開啟狀態(tài)纫谅,每次都是不會變的,當切換了下之后就會變耕陷,或者還原的話會變

// 獲取IDFA的方法
+ (NSString *)getIDFA
{
    SEL advertisingIdentifierSel = sel_registerName("advertisingIdentifier");
    SEL UUIDStringSel = sel_registerName("UUIDString");

    ASIdentifierManager *manager = [ASIdentifierManager sharedManager];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    if([manager respondsToSelector:advertisingIdentifierSel]) {

        id UUID = [manager performSelector:advertisingIdentifierSel];

        if([UUID respondsToSelector:UUIDStringSel]) {

            return [UUID performSelector:UUIDStringSel];

        }

    }
#pragma clang diagnostic pop
    return nil;
}

UUID

CFUUID—>2.0出現(xiàn)
NSUUID—>6.0出現(xiàn)
這兩個一個是CF框架下的遇伞,一個更加面向?qū)ο笳尬梗@取的時候更方便而已,其實獲取到的都是同一個東西
針對CFUUID需要注意的是:獲得的這個CFUUID值系統(tǒng)并沒有存儲。每次調(diào)用CFUUIDCreate巍耗,系統(tǒng)都會返回一個新的唯一標示符秋麸。如果你希望存儲這個標示符,那么需要自己將其存儲到NSUserDefaults, Keychain, Pasteboard或其它地方炬太。

由于我們后臺判斷App登錄時根據(jù)uuid來判斷的在不同終端登錄的灸蟆,雖然上面提到UUID是獲取的時候一直在變化的,而且不是系統(tǒng)級別的存儲亲族,那么我們就需要自己存儲到系統(tǒng)炒考,用到SSKeyChain,我們自己來保證一個手機理論狀態(tài)下對應一個UUID

+ (NSString *)getUUID{
    NSString  *openUUID = [[NSUserDefaults standardUserDefaults] objectForKey:OpenSessionID];
//    NSLog(@"openUUID 一: %@",openUUID);
    if (openUUID == nil) {

        CFUUIDRef puuid = CFUUIDCreate(kCFAllocatorDefault);
        CFStringRef uuidString = CFUUIDCreateString(kCFAllocatorDefault,puuid);
        NSString *udidStr = (NSString *)CFBridgingRelease(CFStringCreateCopy( NULL, uuidString));
        CFRelease(puuid);
        CFRelease(uuidString);
        openUUID =  [udidStr MD5Hash];

//        NSLog(@"openUUID 二: %@",openUUID);
        NSString *uniqueKeyItem = [SSKeychain  passwordForService:kUniqueIdentifier account:kUniqueIdentifierValue];
        if (uniqueKeyItem == nil || [uniqueKeyItem length] == 0) {
            uniqueKeyItem = openUUID;
            [SSKeychain  setPassword:openUUID forService:kUniqueIdentifier account:kUniqueIdentifierValue];
        }
        [[NSUserDefaults standardUserDefaults] setObject:uniqueKeyItem forKey:OpenSessionID];
        [[NSUserDefaults  standardUserDefaults] synchronize];
//        NSLog(@"uniqueKeyItem: %@",uniqueKeyItem);
        openUUID = uniqueKeyItem;
    }
//    NSLog(@"openUUID 三: %@",openUUID);
    return openUUID;
}

1.首先從沙盒獲取霎迫,沒有的話就調(diào)用CF方法獲取斋枢,然后再去keychain獲取,如果沒獲取到知给,把剛才獲取到的UUID存儲到Keychain杏慰,由于keychain你不刷機,存儲的東西會一直存在炼鞠,因此保證了唯一性缘滥,每次獲取的都是從keychain獲取到的第一次存儲進去的值,那么請求的時候谒主,后臺根據(jù)用戶主鍵盤點uuid是否更改從而判斷是否換了終端登錄朝扼,進行彈框提示

總結(jié):
1.idfa在用戶重置廣告標志符的時候會變化,所以可以把第一次生成的idfa存放到keychain里面霎肯,以后就直接讀取keychain值就可以了擎颖,這樣就能避免用戶重置廣告標志符造成idfa的變化,而keychain的值只有在用戶重置系統(tǒng)的時候才會刪除观游,所以很適合用idfa+keychain的方案
2.那么第二種方法也可以用搂捧,UUID+Keychain的方式也行,上面介紹了懂缕,我們就用的第二種允跑,總之,keychain是個好東西搪柑,根據(jù)app的鍵聋丝,來存儲對應的用戶信息,密碼等重要信息還是不錯的工碾,這里簡單記錄下之前一直疑惑的知識點弱睦,方便以后查閱

IDFA提交Appstore選項相關(guān)

如何確定是否需要選擇IDFA?渊额?况木?先看看下面的終端使用判斷是否需要勾選
iOS審核中如何正確填寫APP廣告標識符IDFA

1垒拢、在 App 內(nèi)投放廣告

2、將此 App 安裝歸因于先前投放的特定廣告

3火惊、將此 App 中發(fā)生的操作歸因于先前投放的特定廣告

4子库、對使用廣告標識符做確認

1.serve advertisements within the app

服務應用中的廣告。如果你的應用中集成了廣告的時候矗晃,你需要勾選這一項仑嗅。

2.Attribute this app installation to a previously served advertisement.

跟蹤廣告帶來的安裝。如果你使用了第三方的工具來跟蹤廣告帶來的激活以及一些其他事件张症,但是應用里并沒有展示廣告你需要勾選這一項仓技。

3.Attribute an action taken within this app to a previously served advertisement

跟蹤廣告帶來的用戶的后續(xù)行為。如果你使用了第三方的工具來跟蹤廣告帶來的激活以及一些其他事件俗他,但是應用里并沒有展示廣告你需要勾選第2項和第3項脖捻。

下邊還有一項

4.Limit Ad Tracking setting in iOS

這一項下的內(nèi)容其實就是對你的應用使用idfa的目的做下確認,只要你選擇了采集idfa兆衅,那么這一項都是需要勾選的地沮。

總結(jié)一下,

(1)如果你的應用里只是集成了廣告羡亩,不追蹤廣告帶來的激活行為摩疑,那么選擇1和4;

(2)如果你的應用里沒有集成廣告畏铆,但是需要追蹤廣告帶來的激活行為雷袋,那么選擇2,3和4;

(3)如果你的應用里集成了廣告辞居,而且使用了sdk等用來追蹤廣告帶來的激活行為楷怒,需要選擇1,2,3和4 。

個人理解:當你有用到IDFA的時候瓦灶,你是必須要勾選YES的鸠删,14年的時候很嚴格,剩下四個選項如果你選錯了很容易悲劇贼陶,現(xiàn)在感覺如果你選了YES刃泡,然后在找個合適的理由勾選,基本上沒問題了每界,例如你集成了UMENG的IDFA SDK捅僵,然后你有啟動廣告家卖,你選1和4眨层,一樣OK了

參考博客,還介紹了其他標識符

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末上荡,一起剝皮案震驚了整個濱河市趴樱,隨后出現(xiàn)的幾起案子馒闷,更是在濱河造成了極大的恐慌,老刑警劉巖叁征,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纳账,死亡現(xiàn)場離奇詭異,居然都是意外死亡捺疼,警方通過查閱死者的電腦和手機疏虫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啤呼,“玉大人卧秘,你說我怎么就攤上這事」倏郏” “怎么了翅敌?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惕蹄。 經(jīng)常有香客問我蚯涮,道長,這世上最難降的妖魔是什么卖陵? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任遭顶,我火速辦了婚禮,結(jié)果婚禮上泪蔫,老公的妹妹穿的比我還像新娘液肌。我一直安慰自己,他們只是感情好鸥滨,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布嗦哆。 她就那樣靜靜地躺著,像睡著了一般婿滓。 火紅的嫁衣襯著肌膚如雪老速。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天凸主,我揣著相機與錄音橘券,去河邊找鬼。 笑死卿吐,一個胖子當著我的面吹牛旁舰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嗡官,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼箭窜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衍腥?” 一聲冷哼從身側(cè)響起磺樱,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纳猫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后竹捉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芜辕,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年块差,在試婚紗的時候發(fā)現(xiàn)自己被綠了侵续。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡憨闰,死狀恐怖询兴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情起趾,我是刑警寧澤诗舰,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站训裆,受9級特大地震影響眶根,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜边琉,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一属百、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧变姨,春花似錦族扰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至砍鸠,卻和暖如春扩氢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爷辱。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工录豺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饭弓。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓双饥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弟断。 傳聞我的和親對象是個殘疾皇子咏花,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

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