2012-09-26 87 views
25

我實現了這個方法來獲取advertisingIdentifieridentifierForVendor的advertisingIdentifier和identifierForVendor回報「00000000-0000-0000-0000-000000000000」

- (NSString *) advertisingIdentifier 
{ 
    if (!NSClassFromString(@"ASIdentifierManager")) { 
     return [OpenUDID value]; 
    } 
    return [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; 
} 

- (NSString *) identifierForVendor 
{ 
    if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) { 
     return [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 
    } 
    return @""; 
} 

- (BOOL)isAdvertisingTrackingEnabled 
{ 
    if (NSClassFromString(@"ASIdentifierManager") && ![[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) { 
     return NO; 
    } 
    return YES; 
} 

在模擬器一切工作應該是,我可以得到2個字符串ID表示。

但是當我使用iOS 6.0(10A403)從iPhone 3GS運行時,這兩種方法返回「00000000-0000-0000-0000-000000000000」作爲標識符。 已經完成:

  • 重新啓動設備
  • 刪除應用程序,並重新安裝
  • 創建和特設的構建,安裝,刪除,並從另一個應用程序重新安裝
  • 運行這段代碼
  • 測試在iOS 6.0(10A403)的iPad 2上,一切都變成了好了(我有正確的標識符)

回答

24

它似乎是iOS中的一個錯誤。在通過無線升級的設備上看到相同的問題,但使用Xcode或iTunes升級的設備按預期工作而不帶零。

嘗試了類似的步驟,唯一的共同主題是空中(壞)與連線升級(好)。

更新:直接從iOS 5.1移動到6.1的用戶會體驗到不同的行爲。每當應用程序完全關閉並重新啓動時,identifierForVendor將返回一個新值。如果應用程序正在被卸載並重新安裝,這將是預期的,但事實並非如此。

+0

這似乎是正確的,因爲我已經在蘋果Apple搜索後發現了(https://devforums.apple.com/search.jspa?resultTypes=MESSAGE&peopleEnabled=true&q=00000000-0000-0000-0000-000000000000)論壇(你需要用你的開發者帳號登錄) –

+9

蘋果如何移除某些東西(UID)並將其替換爲*不起作用*。 –

+5

我們剛剛更新了一些設備到iOS 6.0.1的無線和'identifierForVendor'似乎是固定的。 – MattP

8

蘋果在他們的系統中確認了這個錯誤,以迴應技術支持事件請求。他們說,identifierForVendoradvertisingIdentifier有時候會返回所有的零,可以在開發版本和應用程序商店下載的應用程序中看到。他們沒有解決問題的辦法,也不能說問題何時會得到解決。

+0

你可以請發佈一個鏈接,我可以看到他們的反應,我已經把advertisingIdentifier作爲主鍵,現在它在我的應用程序中導致巨大的問題 – Geet

0

在某些情況下,API會像設備恢復​​之後那樣返回ID空的響應。

的建議是推遲ID retreival,這樣你就可以調用sometginh這樣的:

-(void)retrieveID 
{ 
    if (<check fails>) 
     [self performSelector:@"retrieveID" withObject:nil afterDelay:1.0]; 
} 

後來取ID。