福利:
- 封裝了一個操作裝置唯一標識的類在GitHub, 可直接使用:github.com/Hext123/HDe…
思路:
- 儲存到
Keychain
(鑰匙串) 中的資料不會隨應用解除安裝而刪除, 除非恢復出廠設定. 所以可以生成一串字元儲存到鑰匙串中, 作為裝置唯一標識.
實現:
-
生成一串唯一的字元作為裝置唯一標識. 要在一個大程度上唯一的只有 UUID 了. iOS中提供了相關方法可以獲取
UUID
:-
[[NSUUID UUID] UUIDString]
:[NSUUID UUID]
方法每次呼叫都會生成一個不同的UUID
. -
[[[UIDevice currentDevice] identifierForVendor] UUIDString]
:identifierForVendor
可以獲取這個應用在這臺手機上的唯一標識, 但是解除安裝重灌應用之後會變化.
-
-
把
UUID
儲存到Keychain
中: 直接操作Keychain
的程式碼是非常繁瑣容易出錯的, 所以使用一個已經封裝好的操作類 SFHFKeychainUtils 來操作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
/**
* 同步唯一裝置標識 (生成並儲存唯一裝置標識,如已存在則不進行任何處理)
*
* @return 是否成功
*/
+(BOOL)syncDeviceIdentifier{
/**
* 獲取應用的UUID標識
* (
* identifierForVendor返回本應用的UUID, 解除安裝重灌後會變.所以要存入鑰匙串
* 此處可用 [[NSUUID UUID]UUIDString] 代替, [NSUUID UUID]方法每次呼叫都會生成一個不同的UUID
* 但是identifierForVendor可以用來驗證是不是第一次安裝
* )
*/
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;
}
/**
* 返回唯一裝置標識
*
* @return 裝置標識
*/
+(NSString*)deviceIdentifier{
//先同步一下, 防止裝置標識還未存在的情況
[self syncDeviceIdentifier];
//從鑰匙串中獲取唯一裝置標識
NSString * deviceIdentifier = [SFHFKeychainUtils getPasswordForUsername:@"deviceIdentifier" andServiceName:bundleIdentifier error:nil];
return deviceIdentifier;
}
/**
* 本應用是第一次安裝
*
* @return 是否是第一次安裝
*/
+(BOOL)isFirstInstall{
NSString * deviceIdentifier = [HDeviceIdentifier deviceIdentifier];
NSString * identifierForVendor = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
/**
* 如果鑰匙串中存的deviceIdentifier(裝置標識)不存在 或者 等於deviceIdentifier(本應用的UUID) , 則為第一次安裝
*/
if ( !deviceIdentifier || [deviceIdentifier isEqualToString:identifierForVendor]) {
return YES;
}else{
return NO;
}
}
@end
複製程式碼