【iOS】使用UUID+KeyChain記錄裝置唯一標識

Hext123發表於2018-06-14

福利:

思路:

  • 儲存到 Keychain(鑰匙串) 中的資料不會隨應用解除安裝而刪除, 除非恢復出廠設定. 所以可以生成一串字元儲存到鑰匙串中, 作為裝置唯一標識.

實現:

  1. 生成一串唯一的字元作為裝置唯一標識. 要在一個大程度上唯一的只有 UUID 了. iOS中提供了相關方法可以獲取 UUID :

    • [[NSUUID UUID] UUIDString]: [NSUUID UUID] 方法每次呼叫都會生成一個不同的 UUID .

    • [[[UIDevice currentDevice] identifierForVendor] UUIDString]: identifierForVendor 可以獲取這個應用在這臺手機上的唯一標識, 但是解除安裝重灌應用之後會變化.

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


複製程式碼

相關文章