2011-04-08 38 views
10

我所在的項目正在從iPhone或iPad請求兩個(甚至三個)唯一標識符。我知道,我知道...... UDID應該足夠了,但我們正試圖查看是否還有其他可以使用的唯一標識符。iPhone/iPad的唯一標識符BESIDES UUID/UDID?

我可以使用IOKit.framework從手機上獲取IMEI,序列號,MAC地址等,但顯然這是蘋果不贊成的,任何使用此框架的應用程序都將被拒絕。

有沒有人有任何其他的想法,或我缺少可以使用的標識符?

謝謝!

+4

你總是可以用一種神祕的方式散列UUID以獲得更多的ID :) – 2011-04-08 18:48:37

+0

@Nick:我不認爲OP會以任何方式使用UDID,因爲這很容易僞造,例如在越獄設備上從Cydia下載UDIDFaker。 – 2011-04-08 18:50:34

+0

蘋果在IMEI上皺眉?這並不好,因爲它限制了這個價值的好處。 – KevinDTimm 2011-04-08 19:00:58

回答

3

您可以獲得ICCID和IMSI(如果存在)。

NSString *commcenter = @"/private/var/wireless/Library/Preferences/com.apple.commcenter.plist"; 
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:commcenter]; 
NSString *ICCID = [dict valueForKey:@"ICCID"]; 
NSString *IMSI = [dict valueForKey:@"IMSI"]; 

我認爲這就像你會得到。我不知道獲得通用ID的其他選項。

UPDATE 2013-03-13: 自從我幾乎兩年前寫這個答案以來,這可能已經發生了變化。我甚至不記得目前iOS版本是什麼。同樣,@joshis在評論中正確指出:「你不能合法地做到這一點,因爲你的應用程序會從應用程序沙箱外讀取東西,因此它將被拒絕,正如AppStore Review Guidelines中所指定的...」。

+0

「合法」意味着什麼?捕獲這些應用程序會被拒絕嗎? – edcincy 2011-04-11 14:38:35

+0

不,你不能合法地做到這一點,因爲你的應用程序會從應用程序沙箱外讀取東西,因此,它將被拒絕,如AppStore Review Guidelines 2.6中指定的那樣:在其指定容器區域之外讀取或寫入數據的應用程序將被拒絕 – joshis 2011-05-26 15:36:24

+0

我無法在/private/var/wireless/Library/Preferences/com.apple.commcenter.plist中打開這樣的目錄:「wireless」。我試圖在非越獄設備上執行此操作 – Sergio 2013-03-13 12:05:16

1

用於獲取UDID被棄用的方法,您現在應該使用CFUUIDCreate我認爲可以多次使用,如果需要的話

1

也許你應該澄清你的問題,以獲得更多的標識符。

請求從iPhone或iPad

兩個(或甚至三個)唯一標識符......是一種自相矛盾的說法。如果您的目的是跟蹤特定的物理設備,那麼根據定義,一個唯一的標識符就足夠了。這就是獨有的的意思。

也許,你真正想要的是跟蹤每個用戶使用你的應用程序的多個事情,而不是設備。說你的網絡遊戲應用程序允許用戶1,2,或3個不同的個性。當用戶創建獨特個性時,您必須跟蹤其他用戶個性中的每個用戶個性。

對於這種目的,生成和存儲UUID*是一個適當和常見的解決方案。 iOS包含用於生成UUID值的庫。唯一的問題是如果用戶刪除並重新安裝應用程序,該UUID的存儲可能會丟失。針對此挑戰的解決方法有很多,您可以通過Google搜索關於使用生成的UUID值替換UDID跟蹤的討論來了解該問題。


這個問題有點老。所以我應該提一下:在iOS 5中,Apple deprecated使用了UDID。截至2013年5月1日蘋果是rejecting訪問UDID的任何應用程序。


(*)不要混淆UUID和UDID。UUID是一個standard 128位(32位十六進制數字)編號,在許多技術場景中通常用作一個虛擬唯一標識符。 UDID是Apple的40位十六進制數字字符串,可以燒錄到每個iOS設備以唯一標識每個設備。

7

這個問題是舊但是一個新的唯一的,基於供應商標識符現已加入以置換被棄用UUID在IOS 6.

[UIDevice identifierForVendor]的現在應該用來代替[UIDevice uniqueIdentifier]其現在棄用的iOS 5.0

實例:

NSUUID *uuid = [[UIDevice currentDevice] identifierForVendor]; 
NSString *uuidString = [uuid UUIDString]; 
1

從蘋果:

在iOS設備上安裝應用程序(或來自同一供應商的另一個 應用程序)時,此屬性中的值保持不變。值 更改當用戶從 設備中刪除所有供應商的應用程序,然後重新安裝其中一個或多個。

所以如果你使用[UIDevice identifierForVendor]和用戶刪除應用程序,並重新安裝,該ID將是不同的(所以沒有實際的物理設備跟蹤)

你爲什麼不使用SecureUDID

NSString *domain = @"com.example.app"; 
NSString *key = @"mykey"; 
NSString *udid = [SecureUDID UDIDForDomain:domain usingKey:key]; 

這樣,即使用戶刪除應用程序並重新安裝它,UDID也是一樣的。這將爲您提供一致的跟蹤(或任何您想要對UDID執行的操作)。 順便說一句,上述仍然允許從蘋果。 玩得開心。

0

iOS 11中的DeviceCheck API是獲得唯一標識符的一個有趣的解決方案,它具有的優點是即使在卸載應用程序之後,該值仍將保留。所以開發人員可以有效地控制試用安裝和獎勵等用例。