獲取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];