Platforms State of the Union
Developer Tools 入门 40m

各大平台年度综述

Platforms State of the Union

2020年6月22日

在 Apple 官方观看视频

一句话判断

这是 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 协议简化应用的入口代码,减少 AppDelegateSceneDelegate 的样板代码

还有什么值得关注

  • Xcode 12 本身也编译为 Universal Binary,在 Apple Silicon 上原生运行,启动和编译速度显著提升
  • 新的 StoreKit Testing Framework 让你可以在 Xcode 中本地测试应用内购买,不需要连接 App Store
  • iPadOS 14 的 Scribble 功能支持在任何文本框中直接用 Apple Pencil 手写输入,自动转换为文本
  • macOS Big Sur 的视觉设计全面更新,圆角窗口、新图标风格、控制中心和通知中心的重新设计
WWDC 2020