2013-04-13 37 views
10

我想創建的iPhone/iPad設備的UDID將保持不變,所以請告訴我,如果有任何人有這樣的想法?替代方法來創建生命週期唯一ID

我有搜索谷歌和堆棧溢出,但沒有得到解決方案。

還有人建議使用OpenUDID和CFUUID,但當用戶刪除並重新安裝應用程序時,CFUUID會有所不同。但是我想爲每個應用程序使用相同的UDID,它將在第一時間生成,並且每個應用程序的每個設備的生命週期應保持不變。

+0

認爲你可以爲應用程序添加ID到設備ID,並採取散列 - 代碼。但我不知道如何在iThings上獲得固定的設備ID。 –

回答

8

EDIT 2

由於iOS的升級,併爲每個新文件identifierForVendor並不保留應用程序重新安裝值。我在this link看過答案。這可能有一個或其他方面的幫助。只需注意UDID即使系統重置也會保留,所以這個答案可能會成爲開發者尋求終身UDID的限制,即使在系統重置時也是如此。除此之外,提到的答案似乎很有用。

也看看summary here


identifierForVendor可從UIDevice Class Reference.

該屬性的值是該來自相同的設備上運行的 同一供應商的應用程序是相同的。

[[UIDevice currentDevice] identifierForVendor].UUIDString 

注:可用在IOS 6.0及更高版本。

EDIT 1作爲每UIDevice Class Reference

在該屬性的值的新版本保持而應用程序(或從相同的供應商另一個 應用)安裝在iOS設備上是相同的。當用戶從 設備中刪除所有供應商的應用程序並隨後重新安裝其中的一個或多個應用程序時,值 會更改。因此,如果您的應用程序 在任何地方存儲此屬性的值,您應該優雅地處理標識符更改的情況。


編輯

我希望你能看到this popular link

1)MAC的MD5 + CFBundleIdentifier

[[UIDevice currentDevice] uniqueDeviceIdentifier] 

這將保持每個應用程序相同但每個都不相同應用程序。如果你刪除並重新安裝你的應用程序,它將每個應用程序相同。的MAC

[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier] 

2)MD5這將保持相同從同一設備中的所有應用程序。如果你刪除並重新安裝你的應用程序,它將每個設備相同。

EDIT 3

注意:此方法在IOS 7不再有用作爲唯一標識符不再可用從iOS7。

+0

: - identifierForVendor的值不會更改爲該設備的應用程序,對不對? –

+1

對於特定的Vender + App +設備,identifierForVendor的值永遠不會更改。 –

+0

蘋果公司的文檔字樣:「對於來自同一設備上運行的同一供應商的應用程序,此屬性的價值是相同的。對於來自不同供應商的同一設備上的應用程序返回不同的值,對於不同供應商設備而不管供應商。「 –

0

首次生成UUID(可能使用CFUUIDRef API),並將其存儲在鑰匙串中。

+0

如果用戶更新ios和/或安裝新的ios,那麼鑰匙串數據將被刪除或不刪除? –

+0

我想存儲一生中創建的唯一ID,可以嗎? –

+0

@sunilz我知道,我讀了你的問題。我的答案在這裏。我不知道你的問題是什麼。 – 2013-04-13 06:11:58

2

重要的是要注意UDID和UUID之間的區別。

UDID「唯一設備ID」是硬件特定的。它永遠不會改變一個特定的設備。出於這個原因,它已成爲一個隱私問題,蘋果正在阻止試圖使用它的應用程序。因此,Apple已經生成了一個選擇退出的「設備ID」哈希,特別是對於廣告使用。這個新的ID散列稱爲IFA,可在iOS 6.0或更高版本中使用。

UUID「通用唯一ID」不是硬件特定的。它是用來識別設備的散列。但不是絕對的價值。例如,PhoneGap根據設備屬性生成一個UUID;這是您在執行device.uuid時所得到的結果。如果你刪除了應用程序並重新安裝,你會得到一個新的ID散列。 UUID沒有被Apple阻止。

我認爲最好的解決方案是使用IFA,以OpenUDID作爲iOS的備份< 6.0。

這是我們使用的代碼。如果IFA不可用,請獲取OpenUDID。 [您必須安裝OpenUDID,閱讀更多有關在這裏,https://github.com/ylechelle/OpenUDID。]]

NSString* uuid = nil; 
if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) { 
    // IOS 6 new Unique Identifier implementation, IFA 
    uuid = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 
} else { 
    // Before iOS6 (or if IFA disabled) you shoud use a custom implementation for uuid 
    // Here I use OpenUDID (you have to import it into your project) 
    // https://github.com/ylechelle/OpenUDID 
    NSString* openUDID = [OpenUDID value]; 
    uuid = [OpenUDID value]; 
} 
+0

感謝您的回覆。但我有問題,如果您刪除應用程序並重新安裝,關閉設備,更新或安裝新的ios,那麼OpenUDID將保持與以前相同? –

+0

您可以在項目網站上閱讀有關OpenUDID的更多信息。但它幾乎是設備上多個應用程序共享的通用唯一字符串。例如,Gmail,Chrome和Dropbox使用OpenUDID(我不知道,但只是爲應用程序使用名稱)。您下載的第一個應用程序表示Gmail將OpenUDID設置爲強大。第二個和第三個應用程序將讀取相同的OpenUDID字符串。但是,假設您隨後刪除了Gmail,而不是OpenUDID字符串丟失,它將由使用它的其他應用維護。 (爲了擺脫它,所有的應用程序必須已被刪除)。 – Federico