福利:
- 封裝了一個(gè)操作設(shè)備唯一標(biāo)識(shí)的類在GitHub, 可直接使用:https://github.com/Hext123/HDeviceIdentifier
思路:
- 保存到
Keychain(鑰匙串) 中的數(shù)據(jù)不會(huì)隨應(yīng)用卸載而刪除, 除非恢復(fù)出廠設(shè)置. 所以可以生成一串字符保存到鑰匙串中, 作為設(shè)備唯一標(biāo)識(shí).
實(shí)現(xiàn):
-
生成一串唯一的字符作為設(shè)備唯一標(biāo)識(shí). 要在一個(gè)大程度上唯一的只有 UUID 了. iOS中提供了相關(guān)方法可以獲取
UUID:[[NSUUID UUID] UUIDString]:[NSUUID UUID]方法每次調(diào)用都會(huì)生成一個(gè)不同的UUID.[[[UIDevice currentDevice] identifierForVendor] UUIDString]:identifierForVendor可以獲取這個(gè)應(yīng)用在這臺(tái)手機(jī)上的唯一標(biāo)識(shí), 但是卸載重裝應(yīng)用之后會(huì)變化.
把
UUID保存到Keychain中: 直接操作Keychain的代碼是非常繁瑣容易出錯(cuò)的, 所以使用一個(gè)已經(jīng)封裝好的操作類 SFHFKeychainUtils 來(lái)操作Keychain.
代碼:
//
// HDeviceIdentifier.m
// HDeviceIdentifier
//
// Created by hext on 16/4/5.
// Copyright ? 2016年 hext. All rights reserved.
//
#import "HDeviceIdentifier.h"
#import "SFHFKeychainUtils.h"
//獲取包名 如:com.hext.uuidDemo
#define bundleIdentifier [[NSBundle mainBundle]bundleIdentifier]
@implementation HDeviceIdentifier
/**
* 同步唯一設(shè)備標(biāo)識(shí) (生成并保存唯一設(shè)備標(biāo)識(shí),如已存在則不進(jìn)行任何處理)
*
* @return 是否成功
*/
+(BOOL)syncDeviceIdentifier{
/**
* 獲取應(yīng)用的UUID標(biāo)識(shí)
* (
* identifierForVendor返回本應(yīng)用的UUID, 卸載重裝后會(huì)變.所以要存入鑰匙串
* 此處可用 [[NSUUID UUID]UUIDString] 代替, [NSUUID UUID]方法每次調(diào)用都會(huì)生成一個(gè)不同的UUID
* 但是identifierForVendor可以用來(lái)驗(yàn)證是不是第一次安裝
* )
*/
NSString *myUUIDStr = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
/**
* 保存UUID到鑰匙串Keychain, 如果已存在則不保存
* storeUsername:鍵
* Password:值
* ServiceName:組名
* updateExisting:更新已存在的
*/
BOOL f = [SFHFKeychainUtils storeUsername:@"deviceIdentifier" andPassword:myUUIDStr forServiceName:bundleIdentifier updateExisting:NO error:nil];
return f;
}
/**
* 返回唯一設(shè)備標(biāo)識(shí)
*
* @return 設(shè)備標(biāo)識(shí)
*/
+(NSString*)deviceIdentifier{
//先同步一下, 防止設(shè)備標(biāo)識(shí)還未存在的情況
[self syncDeviceIdentifier];
//從鑰匙串中獲取唯一設(shè)備標(biāo)識(shí)
NSString * deviceIdentifier = [SFHFKeychainUtils getPasswordForUsername:@"deviceIdentifier" andServiceName:bundleIdentifier error:nil];
return deviceIdentifier;
}
/**
* 本應(yīng)用是第一次安裝
*
* @return 是否是第一次安裝
*/
+(BOOL)isFirstInstall{
NSString * deviceIdentifier = [HDeviceIdentifier deviceIdentifier];
NSString * identifierForVendor = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
/**
* 如果鑰匙串中存的deviceIdentifier(設(shè)備標(biāo)識(shí))不存在 或者 等于deviceIdentifier(本應(yīng)用的UUID) , 則為第一次安裝
*/
if ( !deviceIdentifier || [deviceIdentifier isEqualToString:identifierForVendor]) {
return YES;
}else{
return NO;
}
}
@end