首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

iOS开发基础149-由UUIDString引发的思考

编程知识
2024年08月09日 10:23

问题1:[[UIDevice currentDevice] identifierForVendor].UUIDString什么情况下值会变化?

[[UIDevice currentDevice] identifierForVendor].UUIDString 是一个用于标识设备的唯一标识符(UUID),针对同一应用程序供应商(即同一开发者的应用程序集合),在设备上不变。然而,有一些情况会导致这个标识符发生变化:

情况导致 identifierForVendor 变化:

  1. 应用卸载和重装:当设备上来自同一供应商的所有应用程序都被卸载,再重新安装任意一个应用程序时,会生成新的 identifierForVendor。这意味着,如果用户完全清除你的应用并重新安装,它会获得一个新值。

  2. 设备恢复出厂设置:如果设备被恢复出厂设置,也会生成新的 identifierForVendor

除此之外,identifierForVendor 不会因为设备上的通常操作(如重启设备、软件更新等)而改变。

存储到 Keychain 的优势

Keychain 是一个安全存储敏感信息的系统级服务,适用于存储比如密码、证书和加密密钥等重要数据。把 identifierForVendor 存储到 Keychain 有一些优势:

  1. 持久性:即使用户删除了应用,Keychain 中存储的数据不会被删除。当用户重新安装应用时,可以从 Keychain 中恢复数据。
  2. 安全性:Keychain 提供了高安全性的存储方式,对敏感数据的保护比普通的文件存储要好得多。
  3. 跨应用共享:在适当的配置下,同一供应商的应用程序可以共享 Keychain 中的数据。

下面是将 identifierForVendor 存储到 Keychain 的示例代码:

#import <Security/Security.h>

- (void)storeIdentifierForVendorInKeychain {
    NSString *uuid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    NSString *key = @"com.yourcompany.yourapp.identifierForVendor";

    // 删除之前存储的 UUID
    [self deleteUUIDFromKeychain:key];

    NSData *uuidData = [uuid dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *query = @{
        (id)kSecClass: (id)kSecClassGenericPassword,
        (id)kSecAttrAccount: key,
        (id)kSecValueData: uuidData,
    };

    OSStatus status = SecItemAdd((CFDictionaryRef)query, NULL);
    if (status == errSecSuccess) {
        NSLog(@"UUID stored successfully.");
    } else {
        NSLog(@"Error storing UUID: %d", (int)status);
    }
}

- (NSString *)retrieveUUIDFromKeychain {
    NSString *key = @"com.yourcompany.yourapp.identifierForVendor";

    NSDictionary *query = @{
        (id)kSecClass: (id)kSecClassGenericPassword,
        (id)kSecAttrAccount: key,
        (id)kSecReturnData: (id)kCFBooleanTrue,
    };

    CFDataRef dataRef = NULL;
    OSStatus status = SecItemCopyMatching((CFDictionaryRef)query, (CFTypeRef *)&dataRef);

    if (status == errSecSuccess) {
        NSData *resultData = (__bridge NSData *)dataRef;
        NSString *uuid = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
        CFRelease(dataRef);
        return uuid;
    } else {
        NSLog(@"Error retrieving UUID: %d", (int)status);
        return nil;
    }
}

- (void)deleteUUIDFromKeychain:(NSString *)key {
    NSDictionary *query = @{
        (id)kSecClass: (id)kSecClassGenericPassword,
        (id)kSecAttrAccount: key,
    };

    OSStatus status = SecItemDelete((CFDictionaryRef)query);
    if (status == errSecSuccess) {
        NSLog(@"UUID deleted successfully.");
    } else {
        NSLog(@"Error deleting UUID: %d", (int)status);
    }
}

步骤:

  1. 存储 UUID:使用 storeIdentifierForVendorInKeychain 方法将 identifierForVendor 存储到 Keychain 中。
  2. 检索 UUID:使用 retrieveUUIDFromKeychain 方法从 Keychain 中检索存储的 UUID。
  3. 删除 UUID:使用 deleteUUIDFromKeychain 方法删除存储的 UUID。

通过这些步骤和方法,你可以确保即使应用被删除和重新安装,也可以从 Keychain 中恢复先前的 identifierForVendor,保持UUID的一致性。

问题2:存储到 Keychain,什么情况下值会变化 ?

存储在 Keychain 中的数据通常在一些特定情况下会发生变化。以下是其中一些主要情形:

1. 恢复出厂设置

恢复出厂设置会清除设备上的所有数据,包括应用数据、用户文件、系统设置和 Keychain 数据。在这种情况下,Keychain 中存储的任何值(例如标识符、密码等)都会被删除并且无法恢复。

2. 刷机

刷机通常指的是重新安装设备的固件或操作系统。刷机过程也会清除设备上的所有数据,包括 Keychain 中的数据。因此,存储在 Keychain 中的值会被删除。

3. 应用被卸载

不同于普通的文件存储,Keychain 中的数据在应用被卸载时不会被删除。当应用重新安装时,可以继续访问先前存储的 Keychain 数据。然而,如果用户选择了“删除应用的数据”或使用特定第三方工具清理 Keychain 数据,相关的存储值可能会被删除。

4. 设备迁移

在某些情况下,通过 iCloud 备份或设备迁移将 Keychain 数据同步到新设备上。如果用户选择没有迁移 Keychain 数据(例如,设备迁移时选择了不备份 Keychain),那么新设备中的值会发生变化或丢失。

5. 越狱设备

越狱会增加 Keychain 数据被第三方工具访问、修改或删除的风险。尽管越狱本身不会直接改变 Keychain 中的值,但越狱后的应用和操作可能影响其数据完整性,可能导致 Keychain 数据被篡改或清除。

6. 应用自身操作

如果应用在某些条件下(如用户登出、换新账户、重装等)主动删除或更新 Keychain 中的数据,也会导致相关值发生变化。例如:

- (void)deleteIdentifierInKeychain {
    NSString *key = @"com.yourcompany.yourapp.identifierForVendor";
    NSDictionary *query = @{
        (id)kSecClass: (id)kSecClassGenericPassword,
        (id)kSecAttrAccount: key,
    };

    OSStatus status = SecItemDelete((CFDictionaryRef)query);
    if (status == errSecSuccess) {
        NSLog(@"UUID deleted successfully.");
    } else {
        NSLog(@"Error deleting UUID: %d", (int)status);
    }
}

7. 用户主动清除 Keychain

用户可以通过某些工具或设置,主动选择清除特定的 Keychain 数据,这样会导致存储值的删除或变化。

常见问题:

  • 卸载和重新安装应用

    • 不恢复出厂设置:重装应用通常不会影响 Keychain 数据。
    • 恢复出厂设置或重置所有设置:Keychain 数据会被删除。
  • 设备切换

    • 如果用户在设备切换过程中未备份或恢复 Keychain 数据,新的 Keychain 数据将重新生成。

简而言之,尽管 Keychain 存储提供了一种相对持久的存储机制,在以下情况下存储值可能会发生变化或被清除:

  1. 恢复出厂设置或刷机。
  2. 设备迁移而未同步 Keychain 数据。
  3. 越狱引起的数据篡改或清除。
  4. 应用自身操作或用户主动清除 Keychain 数据。
From:https://www.cnblogs.com/chglog/p/18350472
本文地址: http://www.shuzixingkong.net/article/935
0评论
提交 加载更多评论
其他文章 IntelliJ IDEA 2024.2 发布:Spring Data JPA即时查询、自动补全cron表达式
今早看到,IntelliJ IDEA 2024.2 发布的邮件提示,看了一眼这个版本更新的新特性真的太适合我了!也许这些能力对关注DD的小伙伴也有帮助,所以搞篇博客介绍和推荐一下。下面就来一起看看这个版本中推出的几个强大新特性。 Spring Data JPA 的即时查询 在2024.2 Ultim
IntelliJ IDEA 2024.2 发布:Spring Data JPA即时查询、自动补全cron表达式 IntelliJ IDEA 2024.2 发布:Spring Data JPA即时查询、自动补全cron表达式 IntelliJ IDEA 2024.2 发布:Spring Data JPA即时查询、自动补全cron表达式
.NET 8 + Blazor 多租户、模块化、DDD框架、开箱即用
前言 基于 .NET 8 的开源项目,主要使用 WebAPI + Blazor 支持多租户和模块化设计,DDD构建。可以帮助我们轻松地搭建起一个功能完善的Web应用程序。除了帮助你快速构建应用程序之外,项目也可以当做学习资料。我们可以从中了解到多租户、CQRS、DDD架构、云部署、Docker容器化
.NET 8 + Blazor 多租户、模块化、DDD框架、开箱即用 .NET 8 + Blazor 多租户、模块化、DDD框架、开箱即用 .NET 8 + Blazor 多租户、模块化、DDD框架、开箱即用
软件测试基础理论
软件测试基础理论 测试理论 ⭐️测试的八大原则 所有的测试都应该追溯到用户的需求 测试应当尽早介入,将“尽早和不断的测试”写入座右铭! 在实际当中,开发进行的同时测试可以去编写测试用例文档 开发是按模块开发:每个模块开发好了之后就可以进行测试了 测试的工作应该由专门的测试人员完成 避免自己测试自己写
软件测试基础理论 软件测试基础理论 软件测试基础理论
【VMware vCenter】一次性说清楚 vCenter Server 的 CLI 部署方式。
VMware vCenter Server 是 VMware vSphere 解决方案的核心组件,用于管理多个 ESXi 主机并实现更多高级功能特性(如 HA、DRS 以及 FT 等),相信大家已经非常熟悉了。对于 vCenter Server 的安装和部署,可能大部分人会选择使用 GUI 方式部署
【VMware vCenter】一次性说清楚 vCenter Server 的 CLI 部署方式。 【VMware vCenter】一次性说清楚 vCenter Server 的 CLI 部署方式。 【VMware vCenter】一次性说清楚 vCenter Server 的 CLI 部署方式。
代码随想录Day9
KMP算法 主要用来进行字符串匹配 KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。 所以如何记录已经匹配的文本内容,是KMP的重点,也是next数组肩负的重任。 next数组就是一个前缀表(prefix table)。 前缀表有什
代码随想录Day9
男人暗恋你时的身体语言:17个迹象,如何从肢体语言解读一个男人是否偷偷爱着你
约过几次会的对象,或是在公司跟你调情的万人迷同事是真的喜欢你吗?你需要化身侦探,从蛛丝马迹中挖掘出对方的感受,确认他是否也喜欢你。好在只要观察对方的肢体语言,以及他跟你的互动方式,就能做出有理有据的推测。一起来看看要留意哪些肢体语言,确认对方对你的感觉超出了朋友范围。
男人暗恋你时的身体语言:17个迹象,如何从肢体语言解读一个男人是否偷偷爱着你 男人暗恋你时的身体语言:17个迹象,如何从肢体语言解读一个男人是否偷偷爱着你 男人暗恋你时的身体语言:17个迹象,如何从肢体语言解读一个男人是否偷偷爱着你
ComfyUI插件:ComfyUI_Noise节点
前言: 学习ComfyUI是一场持久战,ComfyUI_Noise是对ComfyUI中的噪声进行控制的一个插件库,该库可以完成图像噪声的反推,并通过采样再以几乎无损的方式返回原图,通过该库的使用可以更好的帮助图像恢复原始的相貌,非常适合在生成视频领域用作人物转绘使用。祝大家学习顺利,早日成为Comf
ComfyUI插件:ComfyUI_Noise节点 ComfyUI插件:ComfyUI_Noise节点 ComfyUI插件:ComfyUI_Noise节点
Python 提取出SQL语句中Where的值的方法
本文简要介绍了Python中提取出SQL语句中Where的值的两种方法,分别是使用sqlparse库和使用正则表达式的方法,并给出了详细的代码示例,一目了然。