MAC addresses in iOS 7
August 22, 2013
If your apps use the MAC address to identify an iOS device, the system will return the same static value for all devices running iOS 7. Please update your apps to use the identifierForVendorproperty of UIDevice. If you need an identifier for advertising purposes, use the advertisingIdentifier property of ASIdentifierManager.
如果你的應用程序使用MAC地址來識別一個iOS設備,對所有運行iOS 7設備,系統將返回相同的靜態值。請更新您的應用程序,使用identifierForVendor(UIDevice方法)。如果你需要一個標識符用作廣告用途,使用advertisingIdentifier(ASIdentifierManager方法)。
網上有這樣的說法:
1、原來identifierForVendor很不靠譜,開發商的所有應用卸載再次安裝就變了
2、advertisingIdentifier相對靠譜一點,但設置裡有個開關,用戶可以關掉
========================================================================
廣告標示符(IDFA-identifierForIdentifier)
這是iOS 6中另外一個新的方法,advertisingIdentifier是新框架AdSupport.framework的一部分。ASIdentifierManager單例提供了一個方法advertisingIdentifier,通過調用該方法會返回一個上面提到的NSUUID實例。
NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
跟CFUUID和NSUUID不一樣,廣告標示符是由系統存儲著的。不過即使這是由系統存儲的,但是有幾種情況下,會重新生成廣告標示符。如果用戶完全重置系統((設置程序 -> 通用 -> 還原 -> 還原位置與隱私) ,這個廣告標示符會重新生成。另外如果用戶明確的還原廣告(設置程序-> 通用 -> 關於本機 -> 廣告 -> 還原廣告標示符) ,那麼廣告標示符也會重新生成。關於廣告標示符的還原,有一點需要注意:如果程序在後台運行,此時用戶“還原廣告標示符”,然後再回到程序中,此時獲取廣告標示符並不會立即獲得還原後的標示符。必須要終止程序,然後再重新啟動程序,才能獲得還原後的廣告標示符。之所以會這樣,我猜測是由於ASIdentifierManager是一個單例。
針對廣告標示符用戶有一個可控的開關“限制廣告跟蹤”。Nick Arnott的文章中已經指出了。將這個開關打開,實際上什麼也沒有做,不過這是希望限制你訪問廣告標示符。這個開關是一個簡單的boolean標志,當將廣告標示符發到任意的服務器端時,你最好判斷一下這個值,然後再做決定。
示例: 1E2DFA89-496A-47FD-9941-DF1FC4E6484A
Vindor標示符 (IDFV-identifierForVendor)
這種叫法也是在iOS 6中新增的,不過獲取這個IDFV的新方法被添加在已有的UIDevice類中。跟advertisingIdentifier一樣,該方法返回的是一個NSUUID對象。
NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
蘋果官方的文檔中對identifierForVendor有如下這樣的一段描述 :
The value of this property is the same for apps that come from the same vendor running on the same device. A different value is returned for apps on the same device that come from different vendors, and for apps on different devices regardless of vendor.
如果滿足這樣的條件,那麼獲取到的這個屬性值就不會變:相同的一個程序裡面-相同的vindor-相同的設備。如果是這樣的情況,那麼這個值是不會相同的:相同的程序-相同的設備-不同的vindor,或者是相同的程序-不同的設備-無論是否相同的vindor。
看完上面的內容,我有這樣的一個疑問“vendor是什麼”。我首先想到的是蘋果開發者賬號。但事實證明這是錯誤的。接著我想可能是有一個AppIdentifierPrefix東西,跟鑰匙串訪問一樣,可以在多個程序間共享。同樣,這個想法也是的。最後證明,vendor非常簡單:一個Vendor是CFBundleIdentifier(反轉DNS格式)的前兩部分。例如,com.doubleencore.app1 和 com.doubleencore.app2 得到的identifierForVendor是相同的,因為它們的CFBundleIdentifier 前兩部分是相同的。不過這樣獲得的identifierForVendor則完全不同:com.massivelyoverrated 或 net.doubleencore。
在這裡,還需要注意的一點就是:如果用戶卸載了同一個vendor對應的所有程序,然後在重新安裝同一個vendor提供的程序,此時identifierForVendor會被重置。
示例: 599F9C00-92DC-4B5C-9464-7971F01F8370