一、UDID (Unique Device Identifier)
UDID的全稱是Unique Device Identifier据过,顧名思義绳锅,它就是蘋果IOS設(shè)備的唯一識別碼酝掩,它由40個字符的字母和數(shù)字組成。在很多需要限制一臺設(shè)備一個賬號的應(yīng)用中經(jīng)常會用到原朝。在iOS5中可以獲取到設(shè)備的UDID镶苞,后來被蘋果禁止了茂蚓。
二剃幌、UUID(Universally Unique Identifier)
UUID是Universally Unique Identifier的縮寫负乡,中文意思是通用唯一識別碼脊凰。它是讓分布式系統(tǒng)中的所有元素,都能有唯一的辨識資訊切省,而不需要透過中央控制端來做辨識資訊的指定数尿。這樣惶楼,每個人都可以建立不與其它人沖突的 UUID歼捐。在此情況下晨汹,就不需考慮數(shù)據(jù)庫建立時的名稱重復(fù)問題。蘋果公司建議使用UUID為應(yīng)用生成唯一標(biāo)識字符串剥扣。
雖然UUID是官方提出的一種替代UDID的建議方案,但網(wǎng)上有資料說UUID不能保證在以后的系統(tǒng)升級后還能用钠怯。
經(jīng)過我測試目前,UUID在iOS10下均可以使用,而且UUID每次生成的值都不一樣,需要開發(fā)者自行保存UUID曙聂。
如果使用UUID為標(biāo)識保存用戶的資料在網(wǎng)絡(luò)上,當(dāng)用戶重裝軟件后,UUID的值就可能會發(fā)生改變(基本上可說是百分百會發(fā)生改變),用戶則無法重新下載原來的網(wǎng)絡(luò)資料宁脊。
那APP中需要一個能夠標(biāo)識設(shè)備唯一性的ID ,怎么辦呢稳衬?
Apple解決方案
1坐漏、使用CFUUIDCreateString(NULL, CFUUIDCreate(NULL))生成UUID
2碧信、將UUID緩存在本地音婶,sqlite或plist衣式。使用時取出
評價:
坑爹檐什!這種方式每次UUID生成一次都不一樣,如果產(chǎn)品被fuck out of device住册,再裝載會導(dǎo)致兩次UUID不一致瓮具。這個方案明顯適用范圍狠窄啊親。于是乎各路妖魔鬼怪開始了各種解決方案叹阔。
方案一:(Mac地址+bundle_id)
1耳幢、獲取本地mac地址和應(yīng)用bundle_id
2欧啤、將mac+bundle_id進(jìn)行散列運(yùn)算獲得機(jī)器+應(yīng)用的唯一標(biāo)識
3、只將mac進(jìn)行散列運(yùn)算獲得機(jī)器的唯一標(biāo)識
評價:
狠好的解決方案店印,如果沒有2B的聯(lián)通攪局倒慧,這個方案可以說完美了,取wifi的mac地址除院峡,非你修機(jī)器把wifi換掉照激。但是親盹牧,中國曾經(jīng)出過太監(jiān)版3GS励幼,泥馬口柳,這是一種怎樣的考量刪除了wifi啊。這種拍腦袋的做法就是當(dāng)局的2B嵌削,聯(lián)通跟著傻B望艺。what the fuck!你說還有其他方案不艇劫,不要依賴硬件惩激?
方案二:(推送token+bundle_id)
1、應(yīng)用中增加推送用來獲取token
2风钻、獲取應(yīng)用bundle_id
3魄咕、根據(jù)token+bundle_id進(jìn)行散列運(yùn)算
評價:
apple push token保證設(shè)備唯一哮兰,但必須有網(wǎng)絡(luò)情況下才能工作苟弛,該方法不依賴于設(shè)備本身,但依賴于apple push膏秫。加上一定的業(yè)務(wù)邏輯可以解決大部分情景。
方案三:OpenUDID (推薦)
那么有沒有另外的辦法來獲取用戶設(shè)備的唯一標(biāo)識符呢窘哈?答案是有的滚婉,當(dāng)然這樣的標(biāo)識符不是蘋果隱藏的UDID了帅刀,使用OpenUDID開源代碼远剩,這個代碼通過一些特殊的算法瓜晤,創(chuàng)建了每一個設(shè)備的唯一標(biāo)識符腹纳,你可以拿過來用來識別設(shè)備了。ylechelle/OpenUDID
三志群、deviceToken
先簡單介紹下push的機(jī)制
客戶端通過
(void)registerForRemoteNotificationTypes:(UIRemoteNotificationType)types
這個函數(shù)向APNs(Apple Push Service)注冊push蛔钙,types可標(biāo)明接收的push的類型,聲音桑涎,數(shù)字等兼贡。
(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;
當(dāng)app成功注冊通知后,會調(diào)用這個函數(shù)等曼,并把deviceToken返回給應(yīng)用凿蒜。
device token是對APNs來說,設(shè)備的標(biāo)識符州泊,與app無關(guān)漂洋,所以同一臺設(shè)備上,不同的app獲得的device token是一樣的; 一個設(shè)備可能會產(chǎn)生多個device token, 一個device token也可能對應(yīng)多個UDID演训,下面進(jìn)行解釋贝咙。
device token是什么?
對于APS來說乌奇,device token是設(shè)備的標(biāo)識符。device token不同于UIDevice的uniqueIdentifier(即UDID)礁苗,因?yàn)槌鲇诎踩碗[私原因,當(dāng)設(shè)備被擦除后嘁信,device token必須變化疏叨。所以也就是說,一般情況下蚤蔓,device token是不變的,但是在設(shè)備被擦除后单寂,device token會變的。同一個設(shè)備在development和distribution情況下宣决,收到的device token是不同的尊沸,而token是與app無關(guān)的贤惯。