unity iOS獲取UUID

1.unity 新建UUIDToolExtern.cs

[DllImport("__Internal")]
    private static extern string _getUUIDInKeychain();
    public static string getUUIDInKeychain()
    {
       return _getUUIDInKeychain();
    }

2.ios 新建 UUIDTool.h

//
//  UUIDTool.h
//  Unity-iPhone
//
//  Created by zhangyu on 2022/6/7.
//

#import <Foundation/Foundation.h>
 
@interface UUIDTool : NSObject
 
/**
 * 普通的獲取UUID的方法
 */
+ (NSString *)getUUID;
 
/**
 * 獲取到UUID后存入系統(tǒng)中的keychain中撑瞧,保證以后每次可以得到相同的唯一標(biāo)志
 * 不用添加plist文件评疗,當(dāng)程序刪除后重裝沾鳄,仍可以得到相同的唯一標(biāo)示
 * 但是當(dāng)系統(tǒng)升級(jí)或者刷機(jī)后勋篓,系統(tǒng)中的鑰匙串會(huì)被清空,再次獲取的UUID會(huì)與之前的不同
 * @return keychain中存儲(chǔ)的UUID
 */
+ (NSString *)getUUIDInKeychain;
 
/**
 * 刪除存儲(chǔ)在keychain中的UUID
 * 如果刪除后,重新獲取用戶的UUID會(huì)與之前的UUID不同
 */
+ (void)deleteKeyChain;
 
 
@end


3.ios 新建UUIDTool.m

//
//  UUIDTool.m
//  Unity-iPhone
//
//  Created by zhangyu on 2022/6/7.
//

#import "UUIDTool.h"
#import <UIKit/UIKit.h>
 
NSString * const kUUIDKey = @"com.QuercusRobur.followers";
 
@implementation UUIDTool
 
// 普通的獲取UUID的方法
+ (NSString *)getUUID {
    CFUUIDRef puuid = CFUUIDCreate( nil );
    CFStringRef uuidString = CFUUIDCreateString(nil, puuid);
    NSString *result = (NSString *)CFBridgingRelease(CFStringCreateCopy( NULL, uuidString));
    return result;
}
 
 
#pragma mark - 獲取到UUID后存入系統(tǒng)中的keychain中
 
+ (NSString *)getUUIDInKeychain {
    // 1.直接從keychain中獲取UUID
    NSString *getUDIDInKeychain = (NSString *)[UUIDTool load:kUUIDKey];
    NSLog(@"從keychain中獲取UUID%@", getUDIDInKeychain);
    
    // 2.如果獲取不到,需要生成UUID并存入系統(tǒng)中的keychain
    if (!getUDIDInKeychain || [getUDIDInKeychain isEqualToString:@""] || [getUDIDInKeychain isKindOfClass:[NSNull class]]) {
        // 2.1 生成UUID
        CFUUIDRef puuid = CFUUIDCreate(nil);
        CFStringRef uuidString = CFUUIDCreateString(nil, puuid);
        NSString *result = (NSString *)CFBridgingRelease(CFStringCreateCopy(NULL, uuidString));
        CFRelease(puuid);
        CFRelease(uuidString);
        NSLog(@"生成UUID:%@",result);
        // 2.2 將生成的UUID保存到keychain中
        [UUIDTool save:kUUIDKey data:result];
        // 2.3 從keychain中獲取UUID
        getUDIDInKeychain = (NSString *)[UUIDTool load:kUUIDKey];
    }
    
    return getUDIDInKeychain;
}
 
 
#pragma mark - 刪除存儲(chǔ)在keychain中的UUID
 
+ (void)deleteKeyChain {
    [self delete:kUUIDKey];
}
 
 
#pragma mark - 私有方法
 
+ (NSMutableDictionary *)getKeyChainQuery:(NSString *)service {
    return [NSMutableDictionary dictionaryWithObjectsAndKeys:(id)kSecClassGenericPassword,(id)kSecClass,service,(id)kSecAttrService,service,(id)kSecAttrAccount,(id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible, nil];
}
 
// 從keychain中獲取UUID
+ (id)load:(NSString *)service {
    id ret = nil;
    NSMutableDictionary *keychainQuery = [self getKeyChainQuery:service];
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
    [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
    CFDataRef keyData = NULL;
    if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
        @try {
            ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
        }
        @catch (NSException *exception) {
            NSLog(@"Unarchive of %@ failed: %@", service, exception);
        }
        @finally {
            NSLog(@"finally");
        }
    }
    
    if (keyData) {
        CFRelease(keyData);
    }
    NSLog(@"ret = %@", ret);
    return ret;
}
 
+ (void)delete:(NSString *)service {
    NSMutableDictionary *keychainQuery = [self getKeyChainQuery:service];
    SecItemDelete((CFDictionaryRef)keychainQuery);
}
 
// 將生成的UUID保存到keychain中
+ (void)save:(NSString *)service data:(id)data {
    // Get search dictionary
    NSMutableDictionary *keychainQuery = [self getKeyChainQuery:service];
    // Delete old item before add new item
    SecItemDelete((CFDictionaryRef)keychainQuery);
    // Add new object to search dictionary(Attention:the data format)
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];
    // Add item to keychain with the search dictionary
    SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
}
 
 
@end
#if defined (__cplusplus)
extern "C" {
#endif
//獲取UUID
const char * _getUUIDInKeychain()
{
    NSString *s = [UUIDTool getUUIDInKeychain];
    const char *cString = [s UTF8String];
    NSLog(@"我獲得的UUID%@",s);
    return strdup(cString);
}

# if defined (__cplusplus)
}
#endif

4.需要特別設(shè)置iOS


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市应结,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泉唁,老刑警劉巖鹅龄,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異亭畜,居然都是意外死亡扮休,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)拴鸵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)玷坠,“玉大人,你說(shuō)我怎么就攤上這事劲藐“吮ぃ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵聘芜,是天一觀的道長(zhǎng)兄渺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)汰现,這世上最難降的妖魔是什么挂谍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任叔壤,我火速辦了婚禮,結(jié)果婚禮上凳兵,老公的妹妹穿的比我還像新娘百新。我一直安慰自己企软,他們只是感情好庐扫,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著仗哨,像睡著了一般形庭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厌漂,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天萨醒,我揣著相機(jī)與錄音,去河邊找鬼苇倡。 笑死富纸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旨椒。 我是一名探鬼主播晓褪,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼综慎!你這毒婦竟也來(lái)了涣仿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤示惊,失蹤者是張志新(化名)和其女友劉穎好港,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體米罚,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钧汹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了录择。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拔莱。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖糊肠,靈堂內(nèi)的尸體忽然破棺而出辨宠,到底是詐尸還是另有隱情,我是刑警寧澤货裹,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布嗤形,位于F島的核電站,受9級(jí)特大地震影響弧圆,放射性物質(zhì)發(fā)生泄漏赋兵。R本人自食惡果不足惜笔咽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霹期。 院中可真熱鬧叶组,春花似錦、人聲如沸历造。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吭产。三九已至侣监,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臣淤,已是汗流浹背橄霉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邑蒋,地道東北人姓蜂。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像医吊,于是被迫代替她去往敵國(guó)和親钱慢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容