首页
学习
活动
专区
工具
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.3K61
  • 全局唯一 ID 服务分布式ID生成系统

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

    3.5K41

    移动设备(手机)唯一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,不具有唯一性)。

    5K20

    唯一可行 iOS 架构

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

    1.3K20

    如何保证 ID 全局唯一性?

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

    1.1K40

    移动设备(手机)唯一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.8K20

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

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

    5.5K50

    分布式系统中唯一 ID 生成

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

    65610

    分布式唯一ID生成方案

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

    71610

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

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

    89320

    用户ID生成唯一邀请码几种方法

    ) 8.小结 参考文献 1.需求描述 有一个业务需求,需要根据用户 ID(数值型 >=10000000)生成一个唯一长 6 个字符邀请码,用于邀请新用户注册。...2.需求分析 从业务需求和一般产品邀请码使用体验上来看,邀请码有以下几个特点: 不可重复:不用用户 ID 生成邀请码是不同唯一确定:一个用户 ID 只能生成一个邀请码; 是否可逆:是否需要通过邀请码反推对应用户...5.方法二:Hash+唯一性判断(不可逆) 对用户 ID 做 Hash(如 MD5)运算,获取散列值后取散列值多个字节映射到字符集,然后组成邀请码。...降低冲突率办法是增加邀请码空间,有两个办法: 增加生成邀请码字符空间; 增加邀请码长度。 6.方法三:进制法(可逆) 用户 ID唯一,生成一个唯一邀请码也是理所当然。...ID 生成唯一邀请码几种方法,大家可以根据业务场景选择使用。

    8.4K51
    领券