3

有没有人在 iOS 10 中找到了唯一标识设备的新方法?我没有看到任何文件提到该领域的变化,我想在向供应商标识符投降之前询问一下。

4

1 回答 1

1

如果您要提交到商店,那么您唯一剩下的真正标识符就是 AdSupport 框架的广告标识符。

如果您想进一步深入兔子洞并可能进入一些不安全的 API 领域,您可以连接到 IOKit 并尝试获取设备上的电池标识符。这取自 Anthony Agatiello的扩展要点UIDevice

- (NSString *)batteryID {
    void *IOKit = dlopen("/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit", RTLD_LAZY);
    NSParameterAssert(IOKit);

    mach_port_t *kIOMasterPortDefault = dlsym(IOKit, "kIOMasterPortDefault");
    NSParameterAssert(kIOMasterPortDefault);
    CFMutableDictionaryRef (*IOServiceNameMatching)(const char *name) = dlsym(IOKit, "IOServiceNameMatching");
    NSParameterAssert(IOServiceNameMatching);
    mach_port_t (*IOServiceGetMatchingService)(mach_port_t masterPort, CFDictionaryRef matching) = dlsym(IOKit, "IOServiceGetMatchingService");
    NSParameterAssert(IOServiceGetMatchingService);
    kern_return_t (*IORegistryEntryCreateCFProperties)(mach_port_t entry, CFMutableDictionaryRef *properties, CFAllocatorRef allocator, UInt32 options) = dlsym(IOKit, "IORegistryEntryCreateCFProperties");
    NSParameterAssert(IORegistryEntryCreateCFProperties);
    kern_return_t (*IOObjectRelease)(mach_port_t object) = dlsym(IOKit, "IOObjectRelease");
    NSParameterAssert(IOObjectRelease);

    CFMutableDictionaryRef properties = NULL;

    mach_port_t service = IOServiceGetMatchingService(*kIOMasterPortDefault, IOServiceNameMatching("charger"));
    IORegistryEntryCreateCFProperties(service, &properties, kCFAllocatorDefault, 0);

    IOObjectRelease(service);
    service = 0;

    NSDictionary *dictionary = (__bridge NSDictionary *)properties;
    NSData *batteryIDData = [dictionary objectForKey:@"battery-id"];

    CFRelease(properties);
    properties = NULL;

    dlclose(IOKit);

    return [NSString stringWithUTF8String:[batteryIDData bytes]];
}

这仍然适用于 iOS 10。

于 2016-06-29T14:07:36.350 回答