在 Apple 的 Foundation 框架中,ProcessInfo
(Objective-C 中为 NSProcessInfo
)是一个用于获取当前进程(应用)运行时环境信息的关键类。它提供了访问进程参数、环境变量、系统信息等能力,是开发中处理系统级操作的常用工具。
一、ProcessInfo 的核心概念 #
- 单例模式:通过
ProcessInfo.shared
(Swift)或[NSProcessInfo processInfo]
(Objective-C)访问。 - 不可变数据:提供的信息均为只读(如环境变量、启动参数等)。
- 跨平台支持:适用于 iOS、macOS、watchOS 和 tvOS。
二、ProcessInfo 的体系结构 #
1. 核心功能模块 #
功能模块 | 描述 |
---|---|
进程参数 | 获取启动时的命令行参数(arguments ) |
环境变量 | 读取系统或用户设置的环境变量(environment ) |
系统信息 | 操作系统版本、主机名、进程唯一标识符等 |
系统事件 | 监测低电量模式、热状态变化等(通过通知机制) |
调试与性能 | 获取进程运行时间、内存警告次数等 |
三、核心 API 及使用场景 #
1. 获取进程启动参数 #
场景:解析命令行参数(macOS 常见,iOS 较少用)。
let args = ProcessInfo.processInfo.arguments
// 例如:启动时传入 `-debug` 参数
if args.contains("-debug") {
enableDebugMode()
}
2. 读取环境变量 #
场景:区分开发/生产环境、传递敏感配置(如 API 密钥)。
let env = ProcessInfo.processInfo.environment
if let apiKey = env["API_KEY"] {
configureService(with: apiKey)
}
3. 获取系统信息 #
场景:适配系统版本、记录日志、调试设备信息。
// 系统版本
let osVersion = ProcessInfo.processInfo.operatingSystemVersion
print("OS: \(osVersion.majorVersion).\(osVersion.minorVersion)")
// 主机名
let hostName = ProcessInfo.processInfo.hostName
// 进程唯一标识符
let processID = ProcessInfo.processInfo.processIdentifier
4. 监测系统事件 #
场景:响应低电量模式、设备热状态变化。
// 低电量模式(iOS)
NotificationCenter.default.addObserver(
self,
selector: #selector(handlePowerStateChange),
name: NSNotification.Name.NSProcessInfoPowerStateDidChange,
object: nil
)
// 检查当前是否处于低电量模式
let isLowPowerMode = ProcessInfo.processInfo.isLowPowerModeEnabled
5. 调试与性能监控 #
场景:统计进程运行时间、内存警告次数。
// 进程运行时间(秒)
let uptime = ProcessInfo.processInfo.systemUptime
// 内存警告次数(iOS 9+)
let memoryWarningCount = ProcessInfo.processInfo.memoryWarningCount
四、高级用法与技巧 #
1. 判断是否运行在模拟器 #
let isSimulator = ProcessInfo.processInfo.environment["SIMULATOR_DEVICE_NAME"] != nil
2. 动态启用/禁用功能 #
根据环境变量动态调整功能(如日志级别):
if ProcessInfo.processInfo.environment["ENABLE_DEBUG_LOGS"] == "YES" {
Logger.enableDebugMode()
}
3. 适配不同操作系统版本 #
if #available(iOS 15, *) {
// 使用 iOS 15+ 的 API
} else {
// 回退方案
}
// 等价于:
let osVersion = ProcessInfo.processInfo.operatingSystemVersion
if osVersion.majorVersion >= 15 {
// iOS 15+
}
4. 生成唯一临时文件名 #
let tempDir = ProcessInfo.processInfo.globallyUniqueString
// 输出类似 "3B48D9F1-1234-5678-9012-ABCDEF123456"
五、注意事项 #
环境变量的安全性:
- 避免将敏感信息(如密码)直接存储在环境变量中,优先使用 Keychain。
- 在 Xcode 中配置环境变量:Edit Scheme > Run > Arguments > Environment Variables。
平台差异:
isLowPowerModeEnabled
仅适用于 iOS 9+。thermalState
(设备热状态)在 iOS 11+ 和 macOS 10.10.3+ 可用。
性能影响:
- 频繁访问
ProcessInfo
的属性(如environment
)可能轻微影响性能,建议缓存结果。
- 频繁访问
六、典型应用场景 #
- 调试工具:通过启动参数控制调试行为(如
-verbose
)。 - 多环境配置:根据环境变量切换 API 服务器地址(开发、测试、生产)。
- 设备适配:根据系统版本或设备状态调整功能(如低电量模式下禁用动画)。
- 日志与监控:记录进程运行时间、系统资源状态。
通过 ProcessInfo
,开发者可以轻松获取进程的运行时上下文信息,结合环境变量和系统事件通知,能够实现灵活的配置管理和系统适配逻辑。