1. 程式人生 > >獲取iOS裝置唯一標示

獲取iOS裝置唯一標示

        在產品的需求中,很多情況下我們需要獲取裝置的唯一標示,那麼獲取裝置的唯一標示的方式有哪幾種呢,在這裡做一下總結;我們通常都說UDID、UUID、IDFA、CFUUID、NSUUID等。

獲取裝置唯一標示總結:

一、UDID    (Unique Device Identifier);

簡單介紹:iTunes點選查詢序列號

iOS5 sdk中的獲取方法:[UIDevice currentDevice] uniqueIdentifier];在iOS5.0之後刪除。

二、UUID     (Universally Unique Identifier);

簡單介紹:不同應用有不用的UUID,如果使用者刪除了應用,則UUID會發生改變。

iOS6.0提供的介面,使用方法[[UIDevicecurrentDevice]identifierForVendor];

三、IDFA    廣告標示符(IDFA-identifierForIdentifier)

簡單介紹:

1、新增框架AdSupport.framework

2、新增標頭檔案 #import<AdSupport/ASIdentifierManager.h>

3、使用語句

 iOS6.0提供的介面 NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier]UUIDString];

四、CFUUID    (目前本公司應用使用的是CFUUID,然後儲存到Keychain中)

簡單介紹:

    從iOS2.0開始,CFUUID就已經出現了,C語言風格。它是CoreFoundatio包的一部分,因此API屬於C語言風格。CFUUIDCreate方法用來建立CFUUIDRef,並且可以獲得一個相應的NSString,獲得的這個CFUUID值系統並沒有儲存。每次呼叫CFUUIDCreate,系統都會返回一個新的唯一標示符。如果你希望儲存這個標示符,那麼需要自己將其儲存到NSUserDefaults, Keychain, Pasteboard或其它地方。

注意:如果刪除APP重新安裝,或者覆蓋APP,CFUUID不會改變,但是如果進行刷機、還原、恢復出廠幾乎一定會發生改變,後面幾種情況沒有進行測試。

已經在真機中測試過了程式碼如下:
    

    //1、從鑰匙串中獲取
    NSString *cfuuidStr=[KeyChainManager selectUUID];
    NSLog(@"從鑰匙串中獲取的CFUUID=%@",cfuuidStr);
    
    //2、建立CFUUID
    if (cfuuidStr==nil||[cfuuidStr isEqualToString:@""]) {
        CFUUIDRef uuidRef=CFUUIDCreate(kCFAllocatorDefault);
        cfuuidStr=(NSString *)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuidRef));
        [KeyChainManager addUUID:cfuuidStr];
        NSLog(@"建立CFUUID=%@",cfuuidStr);

    }

//  KeyChainManager.h

#import <Foundation/Foundation.h>
#import <Security/Security.h>

@interface KeyChainManager : NSObject

+(NSString *)selectUUID;

+(BOOL)addUUID:(NSString *)uuidStr;

@end

//  KeyChainManager.m

#import "KeyChainManager.h"

@implementation KeyChainManager

+(NSString *)selectUUID
{
    NSMutableDictionary *dictQuery=[[NSMutableDictionary alloc] init];
    [dictQuery setValue:(id)kSecClassGenericPassword forKey:(id)kSecClass];
    [dictQuery setValue:@"com.aa.driver" forKey:(id)kSecAttrAccount];
    [dictQuery setObject:@YES forKey:(__bridge id)kSecReturnData];     //返回Data
    OSStatus queryErr=-1;
    CFTypeRef result = NULL;
    queryErr = SecItemCopyMatching((__bridge CFDictionaryRef)dictQuery, &result);
    if (queryErr!=errSecSuccess) {
        return nil;
    }
    NSString *uuidStr=[[NSString alloc] initWithData:(__bridge_transfer NSData *)result encoding:NSUTF8StringEncoding];
    return uuidStr;
    
}

+(BOOL)addUUID:(NSString *)uuidStr
{
    NSMutableDictionary *dictQuery=[[NSMutableDictionary alloc] init];
    [dictQuery setValue:(id)kSecClassGenericPassword forKey:(id)kSecClass];
    [dictQuery setValue:@"com.aa.driver" forKey:(id)kSecAttrAccount];
    OSStatus queryErr=-1;
    CFTypeRef result = NULL;
    queryErr=SecItemCopyMatching((__bridge CFDictionaryRef)dictQuery,&result);
    if (queryErr==errSecItemNotFound) {
        NSData *uuidData=[uuidStr dataUsingEncoding:NSUTF8StringEncoding];
        [dictQuery setObject:uuidData forKey:(__bridge id)kSecValueData];
        queryErr=SecItemAdd((__bridge CFDictionaryRef)dictQuery, NULL);
    }
    return queryErr==errSecSuccess;
    
}
@end

 

五、NSUUID

簡單介紹

NSUUID在iOS 6中才出現,這跟CFUUID幾乎完全一樣,只不過它是Objective-C介面。+ (id)UUID 是一個類方法,呼叫該方法可以獲得一個UUID。通過下面的程式碼可以獲得一個UUID字串:

NSString *uuid = [[NSUUID UUID]UUIDString];

跟CFUUID一樣,這個值系統也不會儲存,每次呼叫的時候都會獲得一個新的唯一標示符。如果要儲存的話,你需要自己儲存。在我讀取NSUUID時,注意到獲取到的這個值跟CFUUID完全一樣(不過也可能不一樣):



下面的一些介紹是從網上摘抄的知識點,可以瞭解一些:

一、UDID(Unique Device Identifier)     

        UDID 是由子母和數字組成的40個字串的序,用來區別每一個唯一的iOS裝置,包括iPhones, iPads,以及iPod touches, 這些編碼看起來是隨機的,實際上是跟硬體裝置特點相聯絡的,另外你可以到iTunes點選查詢序列號

        UDID可以關聯其它各種資料到相關裝置上。例如,連線到開發者賬號,可以允許在釋出前讓裝置安裝或測試應用; 也可以讓開發者獲得iOS測試版進行體驗。蘋果用UDID連線到蘋果的ID,這些裝置可以自動下載和安裝從App Store購買的應用、 儲存從iTunes購買的音樂、幫助蘋果傳送推送通知、即時訊息。

        在iOS應用早期,UDID被第三方應用開發者和網路廣告商用來收集使用者資料,可以用來關聯地址、記錄應用使用習慣……以便推送精準廣告。不少使用者也對此表示蘋果侵犯消費者隱私,因此在後期蘋過反對開發人員使用UDID。

        UDID在很多需要限制一臺裝置一個賬號的應用中經常會用到,在Symbian時代,我們是使用IMEI作為裝置的唯一標識的,可惜的是Apple官方不允許開發者獲得裝置的IMEI.uniqueIdentifier在UIDevice.h中的定義如下:@property(nonatomic,readonly,retain) NSString   *uniqueIdentifier  __OSX_AVAILABLE_BUT_DEPRECATED(__MAC意思是iOS2.0以上及iOS5.0以下的系統可用,但不建議使用.Apple有可能在iOS5.0之後刪除該函式;

        iOS5 sdk中的獲取方法:[UIDevice currentDevice] uniqueIdentifier];

但是我們需要注意的一點是,對於已越獄了的裝置,UDID並不是唯一的.使用Cydia外掛UDIDFaker,可以為每一個應用分配不同的UDID,所以UDID作為標識唯一裝置的用途已經不大了。

二、UUID(Universally Unique Identifier)

        UUID是Universally Unique Identifier的縮寫,中文意思是通用唯一識別碼,由網上資料顯示,UUID是一個軟體建構的標準,也是被開源軟體基金會(Open Software Foundation,OSF)的組織在分散式計算環境(Distributed Computing Environment,DCE)領域的一部份.UUID的目的,是讓分散式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定.

根據以上定義可知,同一裝置上的不同應用的UUID是互斥的,即能在改裝置上標識應用.但是並沒有明確指出能標識出裝有同一應用的不同裝置,但是根據我推測,這個UUID應該是根據裝置標識和應用標識生成唯一標識,再經過加密而來的(純推測).

        UUID(Universally UniqueIDentifier)是基於iOS裝置上面某個單個的應用程式,只要使用者沒有完全刪除應用程式,則這個UUID在使用者使用該應用程式的時候一直保持不變。如果使用者刪除了這個應用程式,然後再重新安裝,那麼這個UUID已經發生了改變。

       通過呼叫[[UIDevice currentDevice]identifierForVendor],方法可以獲取UUID。UUID不好的地方就是使用者刪除了你開發的程式以後,基本上你就不可能獲取之前的資料了。

      [[UIDevicecurrentDevice]identifierForVendor];