首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS -获取应用程序安装的唯一ID

在iOS中,由于隐私保护,没有直接获取应用程序安装的唯一ID(即设备ID)的原生API。但是,你可以使用以下方法之一作为替代方案:

1. Identifier for Vendor (IDFV)

Identifier for Vendor 是一个与设备上安装的同一开发商的所有应用程序关联的唯一ID。如果用户删除了该开发商的所有应用程序,并重新安装其中的一个或多个,IDFV 会发生变化。

你可以使用如下方法获取 IDFV

代码语言:javascript
复制
import UIKit

if let vendorID = UIDevice.current.identifierForVendor?.uuidString {
    print(vendorID)
}

2. Keychain Services

另一种方法是使用 Keychain Services 存储一个自定义的唯一ID,并确保每次应用程序重新安装时都会检查并更新此ID。这种方法可以帮助你跨设备保持用户唯一性。

以下是如何使用 Keychain Services 创建和检索唯一ID的示例:

代码语言:javascript
复制
import UIKit
import Security

class KeychainManager {
    private let keychainKey = "your.keychain.key"

    func getOrCreateUniqueID() -> String {
        var uniqueID: String?

        if let id = getKeychainItem(keychainKey) {
            uniqueID = id
        } else {
            uniqueID = UUID().uuidString
            saveKeychainItem(uniqueID!, key: keychainKey)
        }

        return uniqueID!
    }

    private func getKeychainItem(_ key: String) -> String? {
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrAccount as String: key,
            kSecReturnData as String: kCFBooleanTrue!,
            kSecMatchLimit as String: kSecMatchLimitOne
        ]

        var dataTypeRef: AnyObject?
        let status = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)

        if status == errSecSuccess {
            return String(data: dataTypeRef! as Data, encoding: .utf8)
        } else {
            return nil
        }
    }

    private func saveKeychainItem(_ value: String, key: String) {
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrAccount as String: key,
            kSecValueData as String: value.data(using: .utf8)!
        ]

        SecItemDelete(query as CFDictionary)

        SecItemAdd(query as CFDictionary, nil)
    }
}

使用 KeychainManager 类:

代码语言:javascript
复制
let keychainManager = KeychainManager()
let uniqueID = keychainManager.getOrCreateUniqueID()
print(uniqueID)

这些方法可以帮助你在iOS设备上实现唯一ID的生成和持久化存储,而不直接依赖于设备的硬件标识符。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

微信小程序中用户唯一ID的获取

折腾到半夜,搞得挺兴奋,总结一下,免得忘了: 1、微信小程序直接获得的是一些简单信息,基本无用 2、用户唯一标识是openid,还有一个unionid是关联多个公众号之类情况下用,我不大关心 3、在getUserInfo...,这些东西的关系比较复杂,我理解是这样的: 1)userInfo包括简单的用户信息 2)重要信息在encryptedData中,解开后包括: ?...4)rawData,signature是来做校验的,不太关心 4、session-key的获取方式: 1)登录成功后,传给回调的参数包括一个code,但这个code会很快失效 2)通过调用 https...在浏览器中测试没有问题,但是,在小程序中也不能运行,因为小程序只能访问认证过的服务器。...换言之,必须要把这个东西放到服务器上,从微信中去调用服务器的页面,服务器的页面再去访问这个接口,然后再把数据反馈回来。

16.4K61
  • 全局唯一 ID 服务的分布式ID生成系统

    如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求;特别一点的如订单、骑手、优惠券也都需要有唯一...此时一个能够生成全局唯一ID的系统是非常必要的。概括下来,那业务系统对ID号的要求有哪些呢? 全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。...ID没有了单调递增的特性,只能趋势递增,这个缺点对于一般业务需求不是很重要,可以容忍。 数据库压力还是很大,每次获取ID都得读写一次数据库,只能靠堆机器来提高性能。...改为利用proxy server批量获取,每次获取一个segment(step决定大小)号段的值。用完之后再去数据库获取新的号段,可以大大的减轻数据库的压力。...- 各个业务不同的发号需求用biz_tag字段来区分,每个biz-tag的ID获取相互隔离,互不影响。

    3.6K41

    唯一可行的 iOS 架构

    继续阅读,您将了解 MVC 的每个变体看起来如何奇怪,我们在 iOS 社区中有多少误解,以及我们在设计应用程序体系结构时应该真正做些什么。...Controller 是它们之间的中介。它从 Model 获取数据并在 View 上显示给用户,同时在 View 上处理用户操作并将其传输到 Model。 看起来很好。...最初,将 Presentation 分为负责向用户显示信息的层和负责从用户获取信息的层是一个很好的主意。稍后您将看到,该原理不适用于 iOS。...这种分离已成为 GUI 应用程序设计中的主要分离之一,它们对 iOS 也很有用。但是表示层分离通常是特定于平台的。...iOS SDK 已经完成了大量工作,因此我们可以轻松地通过我们的应用程序处理用户的所有交流。因此,MVC 不是我们的选择,我们无法更改与用户交互的工作方式。

    1.3K20

    移动设备(手机)的唯一ID详解

    uuid: 设备的唯一标识,调用此属性获取设备的唯一标识号。 平台支持:Android - 2.2+ (支持): 与设备的imei号一致。...iOS - 4.5+ (支持): 根据包名随机生成的设备标识号。注意:在设备重置后会重新生成。 ? 移动设备(手机)的唯一ID有哪些 在移动广告领域,设备的ID 是用来追踪一个人的最重要的标识。...1、IOS体系下:无法获取 在IOS5.0以后,苹果官方就屏蔽了获取IMEI号的接口,因此后续版本的苹果设备都无法获取到IMEI号。...原苹果设备的唯一识别ID,它是40个字符组成。 1、IOS体系下:无法获取 在IOS旧版本可以使用,但在IOS7.0以后版本苹果停用了此ID,新版都无法获取。...四、MAC MAC是指无线网卡地址 1、IOS体系下:无法获取 在IOS7.0以后版本IOS设备无法获取到MAC(准确说是会返回一个固定值的MAC,不具有唯一性)。

    5.1K20

    如何保证 ID 的全局唯一性?

    如何保证 ID 的全局唯一性? 分库分表之后如何生成全局唯一的数据库主键呢? 数据库中的主键如何选择?...使用唯一 ID 作为主键 如果使用唯一 ID 作为主键,就需要保证 ID 的全局唯一性,如何保证唯生成全局唯一性的ID ?...,性能会比较好,但是这样有个问题, 随着业务服务器的数量变多,很难保证机器 ID 的唯一性。...有的方案是采用 数据库自增id ,或者 zookeeper获取唯一的机器ID。...另外一个部署方式是将信号发生器作为独立的服务部署,业务使用信号发生的时候需要多一次网络调用,存在对内网调用性能的损耗,发号器部署实例是有限的,一般可以将机器 ID卸载配置文件里,这样可以保证机器 ID的唯一性

    1.1K40

    获取iOS设备唯一标识的演进UDID, MAC Address,UUID,IDFA,IDFV,OpenUDID

    每台iOS设备的UDID是唯一且永远不会改变。但是Unique Device Identifier 最早就被苹果封杀了,使用后上线会被拒绝。 那么有没有另外的办法来获取用户设备的唯一标识符呢?...,但是如果删除所有OpenUDID的游戏后,重新安装App1,这时生成的UDID就已经重置了,和之前的已然不同,玩家的账号信息已丢失,要被投诉了…… 当将设备上所有使用了OpenUDID方案的应用程序删除...UUID是基于iOS设备上面某个单个的应用程序,只要用户没有完全删除应用程序,则这个UUID在用户使用该应用程序的时候一直保持不变。...如果用户删除了这个应用程序,然后再重新安装,那么这个UUID已经发生了改变。...总结 很不幸,上面所有这些表示设备唯一号的标识,在IOS7中要么被禁止使用,要么重新安装程序后两次获取的标识符不一样。

    5.9K50

    移动设备(手机)的唯一ID有哪些

    对于与外部数据打通而言,移动设备ID 是能与公司外的数据进行打通、交换、补充的唯一性ID,也是市场上大家都认可的ID。...1、IOS体系下:无法获取 在IOS5.0以后,苹果官方就屏蔽了获取IMEI号的接口,因此后续版本的苹果设备都无法获取到IMEI号。...二、IDFA 苹果和Google针对移动设备推出的 广告标识符 1、IOS体系下:可以获取 在IOS6.0以后版本均可以正常获取IDFA,但手机用户可以手动还原 以及 手动禁止获取(手动关闭广告追踪,...三、UDID 原苹果设备的唯一识别ID,它是40个字符组成。 1、IOS体系下:无法获取 在IOS旧版本可以使用,但在IOS7.0以后版本苹果停用了此ID,新版都无法获取。...四、MAC MAC是指无线网卡地址 1、IOS体系下:无法获取 在IOS7.0以后版本IOS设备无法获取到MAC(准确说是会返回一个固定值的MAC,不具有唯一性)。

    1.9K20

    分布式系统中唯一 ID 的生成

    几乎我见过的所有大型系统中,都需要一个唯一 ID 的生成逻辑。...有多台 application 的 host,但是只有一个数据库。本质上这是耍了个小赖皮,把某分布式系统唯一 ID 的生成逻辑寄托到一个特定的数据库上,于是分布式系统存在中心节点了。...节点编号的生成:这个其实是从 Zookeeper 去获取的,也是被诟病说它不够去中心化的原因之一(一个改进方案是 Boundary Flake,不需要依赖于这个获取逻辑)。...比如我见过这样的逻辑,用 host 的唯一编号来作前缀(保证环境中节点编号的唯一性即可),毫秒数来生成 ID 的主体部分。看似简单,一样可以解决唯一 ID 的问题。...在分布式系统中,它比前面说的方案有更多优势,比如长度一致,比如没有一个毫秒内最多只能生成一个的要求。但是,尽管可以认为它是唯一的,基于随机数产生的 UUID 冲突却是理论上可能存在的。

    67010

    分布式唯一ID的生成方案

    分布式ID的特性 全局唯一 不能出现重复的ID,这是最基本的要求。 递增 有利于关系数据库索引性能。 高可用 既然是服务于分布式系统,为多个服务提供ID服务,访问压力一定很大,所以需要保证高可用。...信息安全 如果ID是有规律的,就容易被恶意操作,在一些场景下需要ID无规则。 生成方案 UUID 核心思想是结合机器的网卡、当地时间、一个随机数来生成。 优点: 性能非常高,本地生成,没有网络消耗。...Redis Redis 提供了自增的原子命令,可以保证唯一、有序。 优点: 简单,自有能力。 高并发环境下性能好,优于数据库。 维护成本低于数据库。 缺点: 主从切换时也可能会重复发号。...雪花算法 给每台机器分配一个唯一标识,然后通过下面的结构实现全局唯一ID: 时间戳 + 机器标识 + 自增序列号 毫秒在高位,自增序列在低位,一定是递增的。 优点: 生成性能高。...例如在美团早期,ID方案就是多种形式的: 有的业务通过 DB 自增的方式生成 有的业务通过 Redis 缓存来生成 有的业务直接用 UUID 生成 后来推出了一个类雪花算法的分布式ID服务:Leaf,QPS

    71810

    全局唯一ID发号器的几个思路

    一、需求缘起 几乎所有的业务系统,都有生成一个唯一记录标识的需求,例如: 消息标识:message-id 订单标识:order-id 帖子标识:tiezi-id 这个记录标识往往就是数据库中的主键...这就引出了记录标识生成(也就是上文提到的三个XXX-id)的两大核心需求: 全局唯一 趋势有序 这也是本文要讨论的核心问题:如何高效生成趋势有序的全局唯一ID。...1000,会生成重复的ID 这个缺点要了命了,不能保证ID的唯一性。...人工生成的确是一种方式,比如电子邮箱,微信ID,各种论坛的账号。在人想出标识的那一刻,是无法判断是否是唯一的,对这种生成方式的结果,显然在录入时都需要进行唯一性校验。...它还支持: 简单预共享Token的客户端身份证认证(只是加强了那么一点点的安全性,可以忽略) 支持批量获取ID,最多256个(因为使用一个byte表示申请个数) 同时,作者还建议使用 Doozerd 一个用

    92020
    领券