2013-10-26 92 views
31

我們的iOS應用程序適用於特定用戶。所以,我們使用設備唯一標識符作爲用戶標識。這種方法在iOS 6之前工作正常,因爲我們每次都得到相同的值始終在iOS 7中獲取唯一的設備ID

NSString *strUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier]; 

在iOS系統7中,上述方法被返回不同的值和我們在用戶識別獲得的問題。 iOS 7提供以下備用

NSUUID *oNSUUID = [[UIDevice currentDevice] identifierForVendor]; 
[strApplicationUUID setString:[oNSUUID UUIDString]]; 

我們更換uniqueIdentifieridentifierForVendor,並建立一個Ad-hoc構建。然後,我們在iOS 7和iOS 6設備上安裝了該版本。到目前爲止,在iOS 7中,我們每次都獲得相同的值,但是iOS 6在每次刪除並重新安裝應用程序時給出不同的值

+0

你在iOS上測試<6.1.3? – Maggie

+0

我的應用程序支持從ios 5.0到ios 7.0,現在我正在測試ios 7.0 – jaydev

回答

1

如果設備上未安裝您簽名的其他應用程序,供應商的標識符可以更改。此外,如果您通過不同的分發方法安裝應用程序,供應商的標識符可能會發生變化。當通過XCode安裝並通過TestFlight或HockeyApp分發時,應用程序可能沒有相同的供應商標識符。

+0

好的謝謝,但我想永遠得到唯一的ID。否則有沒有其他方法可以使唯一ID始終與設備標識符方法一樣。如果它是可行的,那麼請建議我。 – jaydev

+0

跟蹤是邪惡的 –

2

UIDevice Class referenceidentifierForVendor

當用戶刪除所有該供應商的應用程序的從設備,並隨後重新安裝其中一個或多個的值的變化。該值還可以在使用Xcode安裝測試版本時或在使用ad-hoc分發的設備上安裝應用程序時使用。因此,如果您的應用程序在任何位置存儲此屬性的值,則應優雅地處理標識符更改的情況。

+1

好的謝謝,但我想永遠得到唯一的ID。否則有沒有其他方法可以使唯一ID始終與設備標識符方法一樣。如果它是可行的,那麼請建議我。或者可以通過identifierforvander方法。 – jaydev

+0

不,不可能得到始終相同的標識符。這些都在文檔中。 – neilco

+0

如果您從該供應商刪除所有應用程序並重新安裝,該值將會更改。 –

2

iOS7設備上是否安裝了同一供應商的其他應用程序?根據docs

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

您是否通過AppStore提供應用程序?如果不是:

如果該應用不是從應用商店安裝的(例如,當應用程序 仍然在發展),該供應商來確定基於所述應用程序的 包ID。假設包ID是反向DNS格式,並且前兩個組件用於生成供應商ID。例如,對於 示例,com.example.app1和com.example.app2似乎具有 相同的供應商ID。

0

嘗試清除應用程序緩存的機器上,然後檢查。這可能是你的緩存問題

30

使用這個小的輔助方法,以保持標識符鑰匙扣之間安裝/刪除應用程序會話

-(NSString *)getUniqueDeviceIdentifierAsString 
{ 
    NSString *appName=[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey]; 

    NSString *strApplicationUUID = [SSKeychain passwordForService:appName account:@"incoding"]; 
    if (strApplicationUUID == nil) 
    { 
     strApplicationUUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 
     [SSKeychain setPassword:strApplicationUUID forService:appName account:@"incoding"]; 
    } 

    return strApplicationUUID; 
} 

SSKeychain庫添加到您的項目,例如通過使用的CocoaPods pod 'SSKeychain'

+2

重置設備上的內容和設置時,返回的字符串不同。 – Hadu

+1

當然,這不是一個問題的普遍答案 – nerowolfe

8

什麼是UDID替換?

現在它看起來像蘋果公司的計劃有兩個不同的標識來代替UDID的:供應商ID和廣告標識。

廠商ID

ID,它是從同一顯影劑應用程序之間是相同的。 刪除該團隊ID的最後一個應用。

廣告標識

獨有的設備。 適用於所有應用程序;用於廣告 - iAd已從iOS 6及更高版本的UDID轉換而來。 使用「清除所有內容&設置」重置。


大多數情況下,供應商ID將允許具有多個應用的​​開發人員在所有應用中將您識別爲同一用戶。這可以幫助開發人員更好地瞭解他們的受衆並提供更好的服務。

廣告ID將仍然創造了設備的唯一標識符,但不同的是UDID,這可以被關閉或重置,就像餅乾可以在你的臺式機或筆記本電腦上的瀏覽器進行控制。

隨着本週早些時候iOS7的公佈,蘋果公司又採取了另一個步驟,即關閉另一個唯一標識符 - 應用開發商和廣告公司可以使用的「MAC地址」,而不是新的廣告ID。通過消除這個漏洞,蘋果正在採取措施強制這些公司只使用用戶可以控制的跨應用標識符。

什麼還有待觀察的是針對企業是否會繼續尋求圍繞蘋果的授權方式。其他技術,如「設備指紋識別」,已經開發出來,可以在Apple框架之外唯一識別您的設備。蘋果是否會打擊這些方法仍有待觀察。

0

添加一些nerowolfe's answer,有一個名爲MCSMKeychainItem很大的鑰匙扣包裝,即,對其他幾件事情上面,讓你產生並用一行代碼檢索唯一的設備ID:

[MCSMApplicationUUIDKeychainItem applicationUUID]; 

這樣的基本用法會像

+ (NSString *)deviceId { 
    // load unique device ID or generate new one 
    return [MCSMApplicationUUIDKeychainItem applicationUUID]; 
} 

它的工作原理鑰匙扣,基礎數據庫,其中存儲一次生成的唯一標識符上(如nerowolf建議)。它是開源的,你可以下載它here on github

注:我不是擴展的作者,也不以任何方式瞭解他/她。

+0

對於那些需要一個真正的設備特有的唯一ID不會改變的人來說,有一點需要注意的是,如果用戶恢復他們的設備,UUID將被刪除,以及其他所有鑰匙扣項目「。 – Burak