iOS應用開發中的裝置標識
對於iOS應用開發者來說,蘋果所提供的官方後臺系統實際上就是iTunes Connect了。通過iTunes Connect我們建立應用記錄,提交應用給蘋果稽核,釋出應用,通過iTunes Connect我們可以配置銀行卡收錢( 這個很重要:) ),我們可以看到應用的下載量和收據資料報表。
但總體來說iTunes Connect提供的功能還比較有限,而且基本不能定製(除非你能說服蘋果)。
對於應用釋出後的跟蹤和資料收集,很多時候是iTunes Connect之外的事情,甚至有些開發者對於閃退日誌收集等也拋棄了iTunes Connect的crash report。那麼一個識別具體裝置的標誌,或者說能夠區分不同裝置的方法就顯得很重要。這篇文章我簡要整理一下。
大家可以明確一點,為了保護使用者隱私,蘋果並沒開放太多API給開發者,使得裝置的資料追蹤變得越來越難。
IMEI、IMSI、ICCID這類在iTunes Mac客戶端可以直接看到的東西,現在都不要想著能通過API在程式中獲取到。
0. UDID
在iOS6.1及之前,我們可以再UIKit.framework的UIDevice類中看到一個屬性,那就是uniqueIdentifier,也就是我們通常所提到的UDID。
但這個屬性的聲明後面,有NS_DEPRECATED_IOS(2_0, 5_0),意思就是5.0開始就是deprecated的了,是過時的,不建議再繼續使用。
到了iOS SDK的7.0版本,在UIDevice類中,就再也找不到這個uniqueIdentifier屬性了。而且蘋果方面明確表示在2013年5月份之後不再對此支援。即使使用老版本的SDK,也不一定能通過蘋果稽核,聽說有人還嚐到過Rejected的苦頭。
1. identifierForVendor (IDFV)
貌似也有人簡略為IDFV,這是蘋果安撫大家的一個UDID的替代品,也是UIDevice類的屬性。
按照蘋果的文件說明,這個IDFV在同一裝置上的所有同Vendor應用得到的ID是相同的,而不同的裝置就有不同的IDFV。當這個裝置上,同Vendor的所有應用都被解除安裝掉之後,不能保證同一裝置再次安裝這個Vendor的應用時,得到同樣的ID。
簡單來說,如果一個裝置上只裝了你一個應用,解除安裝掉再裝ID也許就不同了。這樣,對於唯一裝置的定義就和原來UDID的很不同。這點並不令廣大開發者感到滿意。
2. MAC地址
如上所述,identifierForVendor不是很令大家滿意,於是各種民間方法就出現了。一個方案就是用MAC地址。
學過計算機網路課程的同學們應該瞭解,要先完成底層網路通訊實現MAC地址是必須有的,而這個在網絡卡製造時要保證全球唯一的,一個裝置通常一個網絡卡就夠用了,所以這個在一定程度上可以作為裝置標識。
於是乎,拿出了各種底層庫,做各種計算,拿到一個MAC地址字串。
下面這段是網路上比較流行的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
-
( NSString
*) macAddress
{
int
mib[6];
size_t
len;
char
*buf;
unsigned
char
*ptr;
struct
if_msghdr *ifm;
struct
sockaddr_dl *sdl;
mib[0]
= CTL_NET;
mib[1]
= AF_ROUTE;
mib[2]
= 0;
mib[3]
= AF_LINK;
mib[4]
= NET_RT_IFLIST;
if
((mib[5] = if_nametoindex( "en0" ))
== 0) {
printf( "Error:
if_nametoindex error\n" );
|