各大平台年度综述
Platforms State of the Union
2020年6月22日
一句话判断
这是 WWDC 2020 的技术版 Keynote——如果你只看一场 Session 就要了解今年所有平台的开发者新特性,选这场准没错。
这场 Session 讲了什么
Platforms State of the Union 是 WWDC 的传统保留节目,介于 Keynote 的产品发布和具体技术 Session 之间。它从开发者视角全面概览了 iOS、iPadOS、macOS、watchOS、tvOS 五大平台的技术更新。2020 年的核心主题是 Apple Silicon 转型、SwiftUI 的成熟和隐私保护的强化。
Apple Silicon 是最大的技术变革。Apple 宣布 Mac 将从 Intel 处理器过渡到自研的 Apple Silicon。对开发者来说,这意味着:大部分使用标准框架的应用只需要在 Xcode 中重新编译就能原生运行;使用 Rosetta 2 可以无缝运行现有的 Intel 应用;而需要最高性能的应用则需要编译 Universal Binary(同时包含 x86_64 和 arm64 代码)。Session 详细介绍了 Universal Binary 的创建流程和测试策略。
SwiftUI 在 iOS 14 中进入了”可用”阶段。新增了 App 协议(替代 @UIApplicationDelegate)、新的 Scene API、Widgets(WidgetKit)、App Clips 等重要特性。Apple 明确表示 SwiftUI 是未来 UI 开发的方向,UIKit 和 AppKit 仍然被支持但不再获得主要的 API 创新。
隐私方面,iOS 14 引入了多项用户控制增强:精确位置开关、本地网络访问权限、剪贴板读取通知、以及更严格的照片权限(用户可以选择只分享选中的照片而非整个图库)。
值得深挖的点
Apple Silicon 过渡的技术路线
Apple 提供了三条路径:第一条,绝大多数应用只需在 Xcode 12 中重新编译(重新编译耗时通常不到 5 分钟);第二条,依赖 Intel 特定指令的应用通过 Rosetta 2 转译运行;第三条,性能敏感的应用(如游戏、视频编辑)应编译为 Universal Binary 并做 arm64 专项优化。Session 强调这是一个为期两年的过渡期,在此期间 Apple 会同时销售 Intel 和 Apple Silicon 的 Mac。
WidgetKit 与设计系统的变化
iOS 14 的 Widget 体系完全重建。新的 WidgetKit 框架基于 SwiftUI,取代了旧的 Today Extension。Widget 不再是可交互的迷你应用,而是纯展示的信息卡片——用户点击 Widget 会跳转到主应用的对应页面。这个设计哲学的变化引发了一些争议,但 Apple 的理由很明确:Widget 应该”安静地展示信息”,而不是”变成桌面的第二个应用”。
代码片段
// SwiftUI 的新 App 协议入口
import SwiftUI
@main
struct MyApp: App {
@SceneBuilder var body: some Scene {
WindowGroup {
ContentView()
}
// 支持多窗口(iPadOS 和 macOS)
DocumentGroup(newDocument: MyDocument()) { file in
DocumentEditor(document: file.$document)
}
// Settings 场景(macOS)
#if os(macOS)
Settings {
SettingsView()
}
#endif
}
}
// Universal Binary 的条件编译
import Foundation
struct PlatformOptimizer {
static func optimizeForCurrentPlatform() {
#if arch(arm64)
// Apple Silicon 特定优化
print("运行在 Apple Silicon 上")
// 可以使用 ARM NEON 指令做 SIMD 加速
#elseif arch(x86_64)
// Intel 特定优化
print("运行在 Intel 上")
#endif
// 检测 Rosetta 转译环境
if isRunningUnderRosetta() {
print("通过 Rosetta 2 转译运行")
}
}
static func isRunningUnderRosetta() -> Bool {
// 通过 sysctl 检查是否在 Rosetta 下运行
var size = 0
sysctlbyname("sysctl.proc_translated", nil, &size, nil, 0)
return size > 0
}
}
// 隐私权限的适配示例
import Photos
import CoreLocation
class PrivacyManager {
// 新的照片权限:限定选择的照片
func requestPhotoLibraryAccess() {
PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in
switch status {
case .limited:
// 新增状态:用户只授权了选中的照片
print("用户只授权了部分照片")
self.loadLimitedPhotos()
case .authorized:
print("完整图库访问权限")
self.loadAllPhotos()
default:
print("权限被拒绝")
}
}
}
// 新的位置权限:精确 vs 模糊
func requestLocation() {
let manager = CLLocationManager()
manager.requestWhenInUseAuthorization()
if #available(iOS 14, *) {
// 检查用户是否授予了精确位置
if manager.accuracyAuthorization == .reducedAccuracy {
print("用户授予了模糊位置")
}
}
}
}
最佳实践
- 立即使用 Xcode 12 编译你的应用为 Universal Binary,提前为 Apple Silicon 做好准备
- 为 iOS 14 新增的隐私权限做好 UI 适配——特别是照片”选择照片”权限和模糊位置
- 开始将新的功能模块用 SwiftUI 编写,逐步替换旧的 UIKit 代码
- 如果你维护 macOS 应用,测试 Rosetta 2 转译的性能影响,特别是 CPU 密集型操作
- 利用新的
App协议简化应用的入口代码,减少AppDelegate和SceneDelegate的样板代码
还有什么值得关注
- Xcode 12 本身也编译为 Universal Binary,在 Apple Silicon 上原生运行,启动和编译速度显著提升
- 新的 StoreKit Testing Framework 让你可以在 Xcode 中本地测试应用内购买,不需要连接 App Store
- iPadOS 14 的 Scribble 功能支持在任何文本框中直接用 Apple Pencil 手写输入,自动转换为文本
- macOS Big Sur 的视觉设计全面更新,圆角窗口、新图标风格、控制中心和通知中心的重新设计