【iOS】使用UUID+KeyChain記錄設(shè)備唯一標(biāo)識(shí)

福利:

思路:

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

實(shí)現(xiàn):

  1. 生成一串唯一的字符作為設(shè)備唯一標(biāo)識(shí). 要在一個(gè)大程度上唯一的只有 UUID 了. iOS中提供了相關(guān)方法可以獲取 UUID :

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

    • [[[UIDevice currentDevice] identifierForVendor] UUIDString]: identifierForVendor 可以獲取這個(gè)應(yīng)用在這臺(tái)手機(jī)上的唯一標(biāo)識(shí), 但是卸載重裝應(yīng)用之后會(huì)變化.

  2. UUID 保存到 Keychain 中: 直接操作 Keychain 的代碼是非常繁瑣容易出錯(cuò)的, 所以使用一個(gè)已經(jīng)封裝好的操作類 SFHFKeychainUtils 來(lái)操作 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

/**
 *  同步唯一設(shè)備標(biāo)識(shí) (生成并保存唯一設(shè)備標(biāo)識(shí),如已存在則不進(jìn)行任何處理)
 *
 *  @return 是否成功
 */
+(BOOL)syncDeviceIdentifier{
    
    /**
     *  獲取應(yīng)用的UUID標(biāo)識(shí)
     *  (
     *  identifierForVendor返回本應(yīng)用的UUID, 卸載重裝后會(huì)變.所以要存入鑰匙串
     *  此處可用 [[NSUUID UUID]UUIDString] 代替, [NSUUID UUID]方法每次調(diào)用都會(huì)生成一個(gè)不同的UUID
     *  但是identifierForVendor可以用來(lái)驗(yàn)證是不是第一次安裝
     *  )
     */
    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;
}

/**
 *  返回唯一設(shè)備標(biāo)識(shí)
 *
 *  @return 設(shè)備標(biāo)識(shí)
 */
+(NSString*)deviceIdentifier{
    //先同步一下, 防止設(shè)備標(biāo)識(shí)還未存在的情況
    [self syncDeviceIdentifier];
    
    //從鑰匙串中獲取唯一設(shè)備標(biāo)識(shí)
    NSString * deviceIdentifier = [SFHFKeychainUtils getPasswordForUsername:@"deviceIdentifier" andServiceName:bundleIdentifier error:nil];
    
    return deviceIdentifier;
}

/**
 *  本應(yīng)用是第一次安裝
 *
 *  @return 是否是第一次安裝
 */
+(BOOL)isFirstInstall{
    
    NSString * deviceIdentifier = [HDeviceIdentifier deviceIdentifier];
    NSString * identifierForVendor = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    
    /**
     *  如果鑰匙串中存的deviceIdentifier(設(shè)備標(biāo)識(shí))不存在 或者 等于deviceIdentifier(本應(yīng)用的UUID) , 則為第一次安裝
     */
    if ( !deviceIdentifier || [deviceIdentifier isEqualToString:identifierForVendor]) {
        return YES;
    }else{
        return NO;
    }
}

@end


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

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

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