Keychain
(鑰匙串) 中的數據不會隨應用卸載而刪除, 除非恢復出廠設置. 因此能夠生成一串字符保存到鑰匙串中, 做爲設備惟一標識.生成一串惟一的字符做爲設備惟一標識. 要在一個大程度上惟一的只有 UUID 了. iOS中提供了相關方法能夠獲取 UUID
:git
[[NSUUID UUID] UUIDString]
: [NSUUID UUID]
方法每次調用都會生成一個不一樣的 UUID
.github
[[[UIDevice currentDevice] identifierForVendor] UUIDString]
: identifierForVendor
能夠獲取這個應用在這臺手機上的惟一標識, 可是卸載重裝應用以後會變化.iphone
把 UUID
保存到 Keychain
中: 直接操做 Keychain
的代碼是很是繁瑣容易出錯的, 因此使用一個已經封裝好的操做類 SFHFKeychainUtils 來操做 Keychain
.ide
//
// 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
複製代碼