Get to know Developer Mode
System & Services 进阶 20m

了解开发者模式

Get to know Developer Mode

2022年6月6日

在 Apple 官方观看视频

一句话判断

iOS 16 新增的 Developer Mode 是一道安全开关——没有它你连 Xcode 调试都做不了,但好消息是可以通过命令行工具自动化开启。

这场 Session 讲了什么

苹果在 iOS 16 和 iPadOS 16 中引入了 Developer Mode(开发者模式)。这个功能直接改变了开发者日常的工作流:在一台运行 iOS 16 的设备上,如果 Developer Mode 没有开启,你无法安装和运行开发版的 App、无法使用 Xcode 调试器、也无法使用 Instruments 做性能分析。

开启路径在设置 > 隐私与安全性 > 开发者模式。开启后设备会重启,重启完成后你需要确认一次选择。这个设计的意图很明确:普通用户的设备上不应该存在开发者工具的能力,这些能力本身就是安全风险。

Session 还介绍了 devmodectl 命令行工具,用于在自动化测试和 CI 环境中开启 Developer Mode,不需要手动操作设备。

值得深挖的点

为什么需要 Developer Mode? 苹果的解释是:开发相关的功能(比如安装未签名的 App、调试器附加、读取系统日志)都是潜在的安全攻击面。恶意软件如果能利用这些功能,就可以绕过很多安全机制。所以苹果把这些能力隔离到一个需要显式开启的模式里。对于普通用户来说,他们的设备上这些功能门永远是关着的。

CI/CD 环境的影响。 如果你用物理设备做自动化测试,Developer Mode 是必须的。苹果提供了两种自动化方案:通过 devmodectl 命令行工具远程开启,或者通过 MDM 配置推送。这意味着你的测试设备管理流程需要更新——特别是那些用恢复镜像批量刷机的场景。

代码片段

# 通过命令行开启 Developer Mode(需要设备已连接并配对)
devmodectl enable

# 检查当前 Developer Mode 状态
devmodectl status

# 通过 MDM 配置(Configuration Profile 示例)
# 在你的 .mobileconfig 中添加:
<key>PayloadContent</key>
<array>
    <dict>
        <key>PayloadType</key>
        <string>com.apple.developer-mode</string>
        <key>DeveloperMode</key>
        <true/>
    </dict>
</array>
// 在 App 中检测 Developer Mode 是否开启
import UIKit

func checkDeveloperMode() {
    // 苹果没有提供直接的 API 来检测 Developer Mode
    // 但你可以通过检查是否能执行某些开发者操作来间接判断
    // 比如尝试附加调试器或检查特定文件是否存在
    
    // 更实际的做法是在 App 启动时引导用户去设置中开启
    if let url = URL(string: "App-prefs:root=PrivacySecurity") {
        // 引导用户到设置页面
        // 注意:这个 URL scheme 可能随系统版本变化
    }
}

最佳实践

  • 在团队的设备准备流程中加入 Developer Mode 开启步骤,避免开发者拿到新设备后卡在”无法调试”的问题上。
  • CI 环境中的测试设备建议通过 MDM 或 devmodectl 自动开启,不要依赖手动操作。
  • 更新团队的 Onboarding 文档,把 Developer Mode 的开启方法写进去。
  • 如果你的 App 有 TestFlight 之外的分发需求(比如企业分发),提前规划好 Developer Mode 对用户的影响。

还有什么值得关注

  • Developer Mode 开启后设备会多一个开发者模式的标志,在关于本机中可以看到。
  • 关闭 Developer Mode 同样需要重启设备,所以不要频繁切换。
  • 模拟器不受 Developer Mode 影响——它只影响物理设备。
  • 这个功能对越狱检测有一定的关联:Developer Mode 开启的设备其安全态势确实和普通设备不同,但苹果并没有把它当作越狱检测的信号。
WWDC 2022