ios获取uuid
创始人
2024-12-11 00:38:47

iOS设备UUID获取详解

在iOS开发过程中,获取设备的唯一标识符(UUID)对于实现设备识别、数据追踪、用户分析等功能至关重要。本文将详细讲解如何在iOS中获取UUID,并探讨不同版本iOS系统中获取UUID的方法。

什么是UUID?

UUID(Universally Unique Identifier)即通用唯一识别码,是一个128位的数字标识符。在iOS系统中,UUID通常用于标识设备,便于开发者追踪和分析用户行为。

ios获取uuid

获取UUID的方法

iOS 5.0之前

在iOS 5.0之前,可以通过UIDevice类的uniqueIdentifier属性获取设备的序列号,即UUID。苹果公司为了保护用户隐私,在iOS 5.0之后废弃了该属性。

iOS 5.0 - iOS 6.0

在iOS 5.0到iOS 6.0期间,开发者可以通过以下两种方法获取设备的UUID:

  1. identifierForVendor:该方法返回一个与应用程序相关的唯一标识符,该标识符在相同设备上的相同应用版本中保持不变。

  2. advertisingIdentifier:该方法返回一个与广告相关的唯一标识符,该标识符在用户重置系统后可能会改变。

iOS 7.0及以后

由于苹果公司禁止使用identifierForVendoradvertisingIdentifier,开发者需要采用以下方法获取UUID:

  1. 钥匙串保存:将UUID保存到钥匙串中,并在应用启动时读取该UUID。这样,即使用户重置系统,也能获取到相同的UUID。

Swift实现

以下是一个使用Swift语言获取并保存UUID的示例:

import UIKit
import Security

class UUIDManager {
    static let shared = UUIDManager()

    private var uuid: String?

    init() {
        self.uuid = fetchUUID()
    }

    func fetchUUID() -> String? {
        var error: Unmanaged?
        guard let uuidRef = SecGenerateUUID(&error) else {
            return nil
        }

        return uuidRef as String
    }

    func saveUUID() {
        guard let uuid = self.uuid else {
            return
        }

        KeychainHelper.save(key: "UUID", value: uuid)
    }
}

class KeychainHelper {
    static func save(key: String, value: String) {
        var status: OSStatus
        let data = value.data(using: .utf8)!

        status = SecItemAdd([kSecClass: kSecClassGenericPassword,
                             kSecAttrAccount: key,
                             kSecValueData: data] as CFDictionary, nil)

        if status == noErr {
            print("UUID saved successfully")
        } else {
            print("Error saving UUID to Keychain: \(status)")
        }
    }
}

Objective-C实现

以下是一个使用Objective-C语言获取并保存UUID的示例:

#import 
#import 

@interface UUIDManager : NSObject

+ (NSString *)sharedManager;

@end

@implementation UUIDManager

+ (NSString *)sharedManager {
    static UUIDManager *sharedManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedManager = [[UUIDManager alloc] init];
    });
    return sharedManager;
}

- (NSString *)fetchUUID {
    CFUUIDRef uuidRef;
    uuidRef = CFUUIDCreate(kCFAllocatorDefault);
    if (uuidRef) {
        const char *uuidString = CFUUIDCreateString(kCFAllocatorDefault, uuidRef);
        NSString *result = [NSString stringWithCString:uuidString encoding:NSUTF8StringEncoding];
        CFRelease(uuidRef);
        return result;
    }
    return nil;
}

- (void)saveUUID {
    NSString *uuidString = [self fetchUUID];
    if (uuidString) {
        [KeychainHelper save:key:uuidString];
    }
}

@end

@interface KeychainHelper : NSObject

+ (void)save:key:uuid;

@end

@implementation KeychainHelper

+ (void)save:key:uuid {
    CFTypeRef value = (CFTypeRef)[uuid UTF8String];
    OSStatus status = SecItemAdd(@{
        kSecClass : kSecClassGenericPassword,
        kSecAttrAccount : key,
        kSecValueData : value
    } as CFDictionary, nil);

    if (status == errSecSuccess) {
        NSLog(@"UUID saved successfully");
    } else {
        NSLog(@"Error saving UUID to Keychain: %d", status);
    }
}

@end

总结

通过本文,我们了解了在iOS中获取UUID的方法,以及如何使用Swift和Objective-C实现UUID的获取和保存。在实际开发中,根据项目需求选择合适的方法,确保获取到稳定的UUID。

相关内容

热门资讯

免税店板块短线拉升 新京报贝壳财经讯 12月25日,免税店板块短线拉升,海南发展涨停,王府井、中国中免、珠免集团、东百集...
泰国防部:本轮泰柬冲突已致泰国... 当地时间12月26日下午,泰国国防部发言人苏拉讪在新闻发布会上介绍,26日泰柬边界总委员会秘书处会议...
对话欧莱雅:“变”与“不变”之... 当“合成生物”重塑了造物的逻辑,当“数智技术”带来了体验的革新……美妆价值链上科技应用的重要性在日益...
日本内阁批准2026年军费,金... 12月26日,外交部发言人林剑主持例行记者会。有记者问,据报道,12月26日,日本内阁批准了2026...
从拥核言论到巨额军费 日本右翼...   近日,日本首相官邸高官公然发表拥核言论,不仅引发日本国内各界强烈声讨与国际社会广泛警惕,更暴露了...