1. 程式人生 > >獲取裝置識別符號UUID/UDID/IMEI等

獲取裝置識別符號UUID/UDID/IMEI等

關於獲取裝置各種識別符號,最近整理了一下。基本上有IDFA、IDFV、IMEI、IMSI、UUID、UDID、MAC地址; 想要獲取系統唯一識別符號的話,比如說不管使用者解除安裝還是重新安裝都可以唯一標識的可以直接滑動到底部檢視

先將各種實現的方法列出來,可能你需要的只是獲取的方式:
Git 識別符號工具類Demo連結 —》 DYDeviceInfo 傳送門
如果有幫到你的話,點個Star就是最好的肯定!

  • IDFA:
    廣告標示符,它是由系統儲存著的,iOS6及以後使用。但是如果使用者還原位置與隱私的話這個廣告識別符號就會重新生成(設定程式 -》 通用 -》 還原 -》還原位置與隱私) 。或者使用者更明確的將設定中的廣告還原掉(設定程式 -》 通用-》 關於本機 -》廣告 -》 還原廣告標示符) ,IDFA也會重新生成。而且使用者可以在設定-》隱私 -》廣告裡面限制IDFA獲取,一般使用者都不知道有這個,哈哈,不過還是不能用來做唯一標識的id呦。
#import <AdSupport/ASIdentifierManager.h>
ASIdentifierManager *asIM = [[ASIdentifierManager alloc] init];
NSString *idfa = [asIM.advertisingIdentifier UUIDString];
  • IDFV:
    iOS6.0及以後使用,是給Vendor標識使用者用的,vendor:賣主,小販。經過測試發現com.test.app1和com.test.app2具有相同的idfv,而如果是com.app1和com.app2則是兩個不同的idfv。準確點說,就是通過BundleID的反轉的前兩部分進行匹配,如果相同就是同一個Vender,共享同一個idfv的值。
NSString *idfv = [[UIDevice currentDevice].identifierForVendor UUIDString];
  • IMEI,IMSI:
    IMEI(International Mobile Equipment Identity)是國際移動裝置身份碼的縮寫,國際移動裝備辨識碼,是由15位數字組成的”電子串號”,它與每臺手機一一對應,而且該碼是全世界唯一的。每一部手機在組裝完成後都將被賦予一個全球唯一的一組號碼,這個號碼從生產到交付使用都將被製造生產的廠商所記錄。手機使用者可以在手機中查到自己手機的IMEI碼。
    重點來了 !iOS5以後不能再獲取了,但通過私有Api能獲取,這是在網上能查到的。Git上的erica的UIDevice擴充套件檔案,以前可用但由於IOKit framework沒有公開,所以也無法使用。就算手動匯入,依舊無法使用,看來獲取IMEI要失敗了,同時失敗的還有IMSI。不過還存在另外一種可能,Stack Overflow上有人提供採用com.apple.coretelephony.Identity.get entitlement方法,but device must be jailbroken;在此附上鍊接,供大家參考:

    http://stackoverflow.com/questions/16667988/how-to-get-imei-on-iphone-5/16677043#16677043
    如果實現了,自己拿來玩就行,別上架,這是會被拒掉的。

  • Mac地址,這個是做IDFA的時候,從友盟收集到的方法:
    要匯入一堆標頭檔案:

#include <sys/sysctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/if_dl.h>
    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");
        return NULL;
    }

    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 1\n");
        return NULL;
    }

    if ((buf = malloc(len)) == NULL) {
        printf("Could not allocate memory. error!\n");
        return NULL;
    }

    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 2");
        free(buf);
        return NULL;
    }

    ifm = (struct if_msghdr *)buf;
    sdl = (struct sockaddr_dl *)(ifm + 1);
    ptr = (unsigned char *)LLADDR(sdl);
    NSString *macStr = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",*ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
    free(buf);

- UUID ,獲取唯一識別符號

每次執行都會發生變化,最理想的就是儲存在keychain裡面,以此作為標識使用者裝置的唯一識別符號

    CFUUIDRef uuid = CFUUIDCreate(NULL);
    assert(uuid != NULL);
    CFStringRef uuidStr = CFUUIDCreateString(NULL, uuid);

    DYLog(@"uuidStr------》%@",uuidStr);

之前使用了Git上的一個第三方庫,SSKeychain,將UUID儲存在keychain裡面,每次呼叫先檢查鑰匙串裡面有沒有,有則使用,沒有則寫進去,保證其唯一性,具體使用如下:

CFUUIDRef uuid = CFUUIDCreate(NULL);
assert(uuid != NULL);
CFStringRef uuidStr = CFUUIDCreateString(NULL, uuid);
NSString *identifierNumber = [SSKeychain passwordForService:@"com.test.app1"account:@"user"];

if (!identifierNumber){
   [SSKeychain setPassword: [NSString stringWithFormat:@"%@", uuidStr] forService:@"com.test.app1"account:@"user"];
   identifierNumber = [SSKeychain passwordForService:@"com.test.app1"account:@"user"];
}