【iOS】使用UUID+KeyChain記錄設備惟一標識

福利:

思路:

  • 保存到 Keychain(鑰匙串) 中的數據不會隨應用卸載而刪除, 除非恢復出廠設置. 因此能夠生成一串字符保存到鑰匙串中, 做爲設備惟一標識.

實現:

  1. 生成一串惟一的字符做爲設備惟一標識. 要在一個大程度上惟一的只有 UUID 了. iOS中提供了相關方法能夠獲取 UUID :git

    • [[NSUUID UUID] UUIDString]: [NSUUID UUID] 方法每次調用都會生成一個不一樣的 UUID .github

    • [[[UIDevice currentDevice] identifierForVendor] UUIDString]: identifierForVendor 能夠獲取這個應用在這臺手機上的惟一標識, 可是卸載重裝應用以後會變化.iphone

  2. 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


複製代碼
相關文章
相關標籤/搜索