本文涉及到的 API 变动在 iOS 16 系统上已经生效,在梳理项目代码时发现还有在使用的地方需要修正,这里稍作记录。可以预见,Apple 对用户隐私信息的获取上将会越来越严格,任何 API 只要获取能够定位或区分用户特征的信息都将会受到限制。

iOS 16 UIDevice name 属性的变化

let name = UIDevice.current.name

原本这个 name 表示的是用户设备名称。iOS 系统默认的名称是 Apple ID 的账户名称加上设备型号,比如 "Chuan 的 iPhone 15 Pro",用户也可以自己在 设置->通用->关于手机->名称中修改为任意内容。根据之前对线上数据的分析,设备名称中含有用户姓名或带有鲜明个人特征信息的占比并不低。普通用户可能并没有意识到自己的姓名信息在打开 App 的一瞬间就被暴露了,不需要任何授权。这大概也是 Apple 将其作为隐私信息而限制其调用的一个原因。

在 iOS 16 及以上系统中,UIDevice.current.name 的默认行为和 UIDevice.current.model 类似,比如在 iPhone 设备上统一返回“iPhone”,不再返回实际设备名称字符串。需要获取实际的设备名称字符串时,必须满足以下所有标准:

  • The user-assigned device name is visible to the user in your app’s UI.
  • The user-assigned device name is powering a multi-device feature.
  • The feature using the user-assigned device name is available to all, or the vast majority of, users.
  • Your app doesn’t use the user-assigned device name for tracking or fingerprinting.
  • Your app doesn’t share the user-assigned device name with any service providers or third parties other than cloud-hosting service providers.

总结下,就是 App 必须具备多设备特性,且设备名称必须对用户可见。此外,Apple 还对设备名称的使用和共享设置了严格限制。如果 App 符合以上要求,则可以请求权限:

User-Assigned Device Name Entitlement.

实际上,按照上述限制要求,绝大多数 App 都将没有资格获取。没有足够的理由,还是删除掉对 UIDevice name 的调用吧。

CTCarrier 已经被废弃且无替代

CTCarrier 原来提供了非常实用的获取蜂窝网络运营商相关的信息,包括:

  • 运营商名称(如中国联通,中国电信);
  • 运营商国家代码(MCC);
  • 运营商网络代码(MNC);

在 iOS 16 及以上系统中,获取 CTCarrier 的属性时,将返回“--” 或 65535。CTCarrier 整个类都被标记废弃且没有替代可用:

Deprecated with no replacement

如此彻底地删除一个类还没有继任者的,在我的印象中还是第一次出现。