Discover AppleSeed for IT and Managed Software Updates
System & Services 入门 18m

了解 AppleSeed for IT 和托管软件更新

Discover AppleSeed for IT and Managed Software Updates

2020年6月24日

在 Apple 官方观看视频

一句话判断

如果你是企业的 IT 管理员,AppleSeed for IT 让你可以在正式发布前测试 macOS 和 iOS 更新,而新的 Managed Software Updates 能力让你精确控制企业设备的系统更新节奏。

这场 Session 讲了什么

Session 面向企业 IT 管理员和 MDM 解决方案提供商,介绍了两个相关的功能。第一,AppleSeed for IT 是 Apple 的企业预览计划,注册企业可以提前获取 macOS 和 iOS 的测试版,在正式发布前验证兼容性。第二,macOS Big Sur 引入了 Managed Software Updates,允许 IT 管理员通过 MDM 精确控制设备的系统更新策略。

具体来说,Managed Software Updates 支持三种更新策略:强制更新(在指定日期前必须安装)、推荐更新(用户可以选择延迟但最终必须安装)、以及可选更新(只通知不强制)。管理员可以设置本地化的通知消息,告诉用户为什么要更新。这些策略可以通过 MDM 配置文件下发到所有托管设备。

值得深挖的点

AppleSeed for IT 的测试价值

对于大型企业来说,一个系统更新可能导致内部 App 不兼容。AppleSeed for IT 让企业的 IT 团队可以提前 2-4 周获取即将发布的系统更新,在有限的测试设备上验证兼容性。如果发现问题,可以通过 Apple 的反馈通道报告,Apple 可能会在正式发布前修复。这比”正式发布后发现问题再回滚”要安全得多。

MDM 控制的更新策略粒度

Managed Software Updates 提供了非常细粒度的控制。你可以为不同的设备组设置不同的策略——比如高管设备设置强制更新(安全性最高),研发设备设置推荐更新(给 2 周缓冲期),测试设备设置可选更新。你还可以设置”允许延迟的最大天数”和”最低要求版本”。

代码片段

配置 MDM 的软件更新策略

场景:通过 MDM 配置文件设置设备更新策略。

<!-- MDM 配置文件示例:Managed Software Updates -->
<!-- 这通常通过 MDM 解决方案(如 Jamf、Microsoft Intune)的界面配置 -->

<plist version="1.0">
<dict>
    <!-- 强制更新的截止日期 -->
    <key>ForceDeadlineDate</key>
    <string>2020-09-01T00:00:00Z</string>
    
    <!-- 允许延迟的最大天数 -->
    <key>MaxDeferralDays</key>
    <integer>14</integer>
    
    <!-- 最低要求版本 -->
    <key>TargetOSVersion</key>
    <string>14.0</string>
    
    <!-- 本地化的通知消息 -->
    <key>NotificationMsg</key>
    <dict>
        <key>en</key>
        <string>A security update is available. Please install by Sep 1.</string>
        <key>zh_CN</key>
        <string>安全更新已发布,请在9月1日前安装。</string>
    </dict>
    
    <!-- 更新策略 -->
    <key>UpdatePolicy</key>
    <string>installASAP</string>  <!-- 或 installLater, notifyOnly -->
</dict>
</plist>

检查设备的系统更新状态

场景:在 App 中检查设备是否满足最低系统版本要求。

import UIKit

class SystemUpdateChecker {
    
    /// 检查当前系统版本是否满足要求
    static func isSystemVersionSupported(_ minVersion: String) -> Bool {
        let currentVersion = ProcessInfo.processInfo.operatingSystemVersion
        let required = parseVersion(minVersion)
        
        if currentVersion.majorVersion > required.major { return true }
        if currentVersion.majorVersion < required.major { return false }
        if currentVersion.minorVersion > required.minor { return true }
        if currentVersion.minorVersion < required.minor { return false }
        return currentVersion.patchVersion >= required.patch
    }
    
    private static func parseVersion(_ version: String) -> (major: Int, minor: Int, patch: Int) {
        let components = version.split(separator: ".").map { Int($0) ?? 0 }
        return (
            major: components.count > 0 ? components[0] : 0,
            minor: components.count > 1 ? components[1] : 0,
            patch: components.count > 2 ? components[2] : 0
        )
    }
    
    /// 提示用户更新系统
    static func promptUpdateIfNeeded(minVersion: String, from viewController: UIViewController) {
        if !isSystemVersionSupported(minVersion) {
            let alert = UIAlertController(
                title: "系统版本过低",
                message: "此功能需要 iOS \(minVersion) 或更高版本。请前往「设置 > 通用 > 软件更新」进行升级。",
                preferredStyle: .alert
            )
            alert.addAction(UIAlertAction(title: "去更新", style: .default) { _ in
                if let url = URL(string: "App-prefs:General&path=SOFTWARE_UPDATE_LINK") {
                    UIApplication.shared.open(url)
                }
            })
            alert.addAction(UIAlertAction(title: "稍后", style: .cancel))
            viewController.present(alert, animated: true)
        }
    }
}

使用 ProcessInfo 获取系统信息

场景:在 App 中获取详细的系统版本信息。

import Foundation

class DeviceInfoReporter {
    
    struct SystemInfo {
        let osVersion: String
        let buildNumber: String
        let deviceModel: String
        let isMac: Bool
    }
    
    static func getSystemInfo() -> SystemInfo {
        let processInfo = ProcessInfo.processInfo
        
        // 获取系统版本
        let osVersion = processInfo.operatingSystemVersion
        let versionString = "\(osVersion.majorVersion).\(osVersion.minorVersion).\(osVersion.patchVersion)"
        
        // 获取设备型号
        var systemInfo = utsname()
        uname(&systemInfo)
        let machine = withUnsafePointer(to: &systemInfo.machine) {
            $0.withMemoryRebound(to: CChar.self, capacity: 1) {
                String(cString: $0)
            }
        }
        
        // 检测是否在 Mac 上运行
        let isMac: Bool
        if #available(iOS 14.0, *) {
            isMac = processInfo.isiOSAppOnMac
        } else {
            isMac = false
        }
        
        return SystemInfo(
            osVersion: versionString,
            buildNumber: processInfo.operatingSystemVersionString,
            deviceModel: machine,
            isMac: isMac
        )
    }
}

最佳实践

IT 管理员:注册 AppleSeed for IT 计划,在每次系统大版本发布前进行兼容性测试。使用 MDM 的 Managed Software Updates 来控制企业设备的更新节奏——不要让用户随意更新,也不要完全阻止更新。为不同部门设置不同的更新策略。

开发者:如果你的 App 面向企业客户,了解 MDM 的软件更新控制能力。确保你的 App 在新系统版本发布后能快速适配。提供清晰的系统版本要求说明,帮助企业的 IT 管理员制定更新计划。

还有什么值得关注

  • macOS Big Sur 的系统更新机制改为像 iOS 一样的完整更新(不再分开更新),这意味着更新过程更简单但耗时可能更长。
  • AppleSeed for IT 需要企业 Apple ID 注册,个人开发者无法使用。
  • MDM 配置文件可以通过 profile 命令行工具在本地测试。
WWDC 2020