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

福利:

思路:

  • 保存到 Keychain(鑰匙串) 中的數(shù)據(jù)不會隨應用卸載而刪除, 除非恢復出廠設置. 所以可以生成一串字符保存到鑰匙串中, 作為設備唯一標識.

實現(xiàn):

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

    • [[NSUUID UUID] UUIDString]: [NSUUID UUID] 方法每次調(diào)用都會生成一個不同的 UUID .

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

  2. UUID 保存到 Keychain 中: 直接操作 Keychain 的代碼是非常繁瑣容易出錯的, 所以使用一個已經(jīng)封裝好的操作類 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]方法每次調(diào)用都會生成一個不同的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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容