不推薦使用UIDevice uniqueIdentifier-如今該怎麼辦?

剛發現, iOS 5中 不推薦使用UIDevice uniqueIdentifier屬性 ,而iOS 7及更高版本中不提供屬性 。 彷佛沒有其餘可用的方法或屬性。 html

咱們許多現有的應用都緊密依賴此屬性來惟一標識特定設備。 咱們將如何處理這個問題? ios

2011-2012文檔中的建議是: git

特別注意事項 github

不要使用uniqueIdentifier屬性。 要建立特定於您的應用程序的惟一標識符,您能夠調用CFUUIDCreate函數來建立UUID ,而後使用NSUserDefaults類將其寫入默認數據庫。 web

可是,若是用戶卸載並從新安裝該應用程序,則該值將不一樣。 數據庫


#1樓

我敢確定,蘋果公司已經使許多人爲此感到煩惱。 我爲iOS開發了一個簿記應用程序 ,而且具備在線服務來同步在不一樣設備上所作的更改。 該服務維護着全部設備以及須要傳播給它們的更改的數據庫。 所以,瞭解哪些設備是重要的。 我正在使用UIDevice uniqueIdentifier跟蹤設備,對於它的價值,這是個人想法。 服務器

  • 生成UUID並存儲在用戶默認設置中? 沒有好處,由於在用戶刪除應用程序時,這種狀況不會持續。 若是他們稍後再安裝,則聯機服務不該建立新的設備記錄,不然將浪費服務器上的資源,並給出兩次或屢次包含相同設備的設備列表。 若是用戶從新安裝該應用程序,將會看到列出的多個「 Bob的iPhone」。 app

  • 生成一個UUID並存儲在鑰匙串中? 這是個人計劃,由於即便卸載該應用程序,它仍然存在。 可是,當將iTunes備份還原到新的iOS設備時,若是備份已加密,則將傳輸鑰匙串。 若是舊設備和新設備都在使用中,則可能致使兩個設備包含相同的設備ID。 即便設備名稱相同,它們也應在聯機服務中列爲兩個設備。 ide

  • 生成哈希的MAC地址和捆綁包ID? 這彷佛是我須要的最佳解決方案。 經過使用包ID散列,生成的設備ID不會使設備可以跨應用程序進行跟蹤,而我得到了應用程序+設備組合的惟一ID。 函數

有趣的是,Apple本身的文檔指經過計算系統MAC地址的哈希值,捆綁包ID和版原本驗證Mac App Store收據。 所以,根據政策,不管是否經過應用程序審覈(我尚不知道),這彷佛都是容許的。


#2樓

建立您本身的UUID,而後將其存儲在鑰匙串中。 所以,即便您的應用程序被卸載,它仍然存在。 在許多狀況下,即便用戶在設備之間遷移(例如,徹底備份和還原到另外一臺設備),它也將持續存在。

就您而言,它實際上成爲惟一的用戶標識符 。 (甚至比設備標識符更好)。

例:

我正在定義一個用於建立UUID的自定義方法:

- (NSString *)createNewUUID 
{
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return [(NSString *)string autorelease];
}

而後,您能夠在應用程序首次啓動時將其存儲在KEYCHAIN 。 這樣,在首次啓動後,咱們能夠簡單地從鑰匙串中使用它,而無需從新生成它。 使用鑰匙串進行存儲的主要緣由是:當您將UUID設置爲鑰匙串時,即便用戶徹底卸載了該應用程序而後再次安裝它,該UUID也會保留。 。 所以,這是存儲它的永久方法,這意味着密鑰將一直都是惟一的。

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

在應用程序啓動時,包含如下代碼:

// getting the unique key (if present ) from keychain , assuming "your app identifier" as a key
       NSString *retrieveuuid = [SSKeychain passwordForService:@"your app identifier" account:@"user"];
      if (retrieveuuid == nil) { // if this is the first time app lunching , create key for device
        NSString *uuid  = [self createNewUUID];
// save newly created key to Keychain
        [SSKeychain setPassword:uuid forService:@"your app identifier" account:@"user"];
// this is the one time process
}

sskeychain下載SSKeychain.m和.h文件,並將SSKeychain.m和.h文件拖到您的項目中,而後將「 Security.framework」添加到您的項目中。 以後使用UUID只需使用:

NSString *retrieveuuid = [SSKeychain passwordForService:@"your app identifier" account:@"user"];

#3樓

對於iOS 6,Apple建議您使用NSUUID類

如今從UIDevice文檔中的消息中得到uniqueIdentifier屬性:

在iOS 5.0中已棄用。 相應地,請使用此類的identifierForVendor屬性或ASIdentifierManager類的advertisingIdentifier屬性,或使用NSUUID類的UUID方法建立UUID並將其寫入用戶默認數據庫。


#4樓

從iOS 6開始,咱們有了符合RFC4122的 NSUUID

Apple連接: NSUUID的apple_ref


#5樓

您能夠從如下代碼中實現: iOS-5的UIDevice-with-UniqueIdentifier-

相關文章
相關標籤/搜索