WWDC 2020 主题演讲
Keynote
2020年6月22日
一句话判断
这是 Apple 宣布 Mac 全面转向 Apple Silicon 的大会,同时 iOS 14 带来了 App Clips、WidgetKit、Translate 等重磅功能,是 Apple 平台生态近五年来最重要的一次转折点。
这场 Session 讲了什么
WWDC 2020 是 Apple 历史上第一次线上举办的开发者大会。Craig Federighi 开场就抛出了最大的炸弹:Mac 将在两年内从 Intel 处理器全面过渡到 Apple 自研的 ARM 芯片(Apple Silicon)。这意味着 iOS、iPadOS 和 macOS 将共享同一套芯片架构,为跨平台 App 带来了前所未有的可能性。
iOS 14 方面,Apple 重点推出了 App Clips——一种轻量级的 App 体验,用户无需安装完整 App 就能使用核心功能,通过 NFC 标签、二维码或 Safari 即可触发。WidgetKit 带来了全新的桌面小组件系统,支持在主屏上放置动态更新的信息卡片。新的 Translate App 展示了 on-device 机器翻译能力。Messages 增加了置顶消息、群组回复等功能。Safari 加入了内置翻译和隐私报告。Maps 做了重大改版,提供了更详细的地图数据。
值得深挖的点
Apple Silicon 过渡计划
Apple 宣布了两年的过渡期。在此期间,Apple 会同时支持 Intel Mac 和 Apple Silicon Mac。开发者可以通过 Universal Binary 让一个 App 同时支持两种架构。Rosetta 2 会自动将 Intel App 翻译成 Apple Silicon 可以运行的代码,虽然性能会有损耗。关键的技术工具包括:Xcode 12 的原生 Apple Silicon 支持、Virtualization Framework(用于在 Apple Silicon Mac 上运行 Linux 虚拟机)、以及新的 Mac Catalyst 优化。
App Clips 的产品形态
App Clips 是这次 Keynote 中最令人兴奋的新功能之一。它的设计理念是”即时体验”——用户扫描一个二维码或碰一下 NFC 标签,就能在几秒内使用 App 的核心功能。比如在餐厅扫码点餐、在共享单车前 NFC 解锁、在停车场扫码缴费。App Clips 体积限制在 10MB 以内,这迫使开发者只保留最核心的功能。Apple 还提供了 Apple ID 免登录和 Apple Pay 快速支付,让用户无需填写任何表单就能完成操作。
代码片段
App Clip 的基本配置
场景:为餐厅点餐 App 创建一个 App Clip。
// App Clip 需要和主 App 共享同一个 App Group
// 在 Xcode 中添加 App Clip target
// App Clip 的入口处理
class ClipSceneDelegate: UIResponder, UIWindowSceneDelegate {
func scene(_ scene: UIScene,
openURLContexts URLContexts: Set<UIOpenURLContext>) {
// 处理 App Clip 的 URL
guard let url = URLContexts.first?.url else { return }
// 解析 URL 中的餐厅信息
if let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
let restaurantId = components.queryItems?.first(where: { $0.name == "id" })?.value {
// 直接展示点餐页面,不需要导航
showOrderingView(restaurantId: restaurantId)
}
}
}
WidgetKit 基础配置
场景:创建一个简单的新闻桌面小组件。
import WidgetKit
import SwiftUI
struct NewsEntry: TimelineEntry {
let date: Date
let title: String
let summary: String
}
struct NewsProvider: TimelineProvider {
func placeholder(in context: Context) -> NewsEntry {
NewsEntry(date: Date(), title: "加载中", summary: "正在获取最新新闻")
}
func getSnapshot(in context: Context, completion: @escaping (NewsEntry) -> Void) {
let entry = NewsEntry(date: Date(), title: "头条新闻", summary: "这是一条最新的新闻摘要")
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<NewsEntry>) -> Void) {
// 获取新闻数据
let entry = NewsEntry(
date: Date(),
title: "iOS 14 正式发布",
summary: "Apple 在 WWDC 2020 上发布了 iOS 14"
)
// 设置更新策略
let nextUpdate = Calendar.current.date(byAdding: .hour, value: 1, to: Date())!
let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
completion(timeline)
}
}
Universal Binary 配置
场景:确保 App 同时支持 Intel 和 Apple Silicon。
// 在 Xcode 12 中,创建 Universal Binary 只需要:
// 1. 使用 Standard Architectures (Apple Silicon, Intel)
// 2. Xcode 会自动生成包含两种架构的二进制文件
// 检测当前运行的架构
#if arch(arm64)
print("运行在 Apple Silicon 上")
#else
print("运行在 Intel 上")
#endif
// 运行时检测
func isAppleSilicon() -> Bool {
// 检查是否运行在 ARM 架构上
var sysinfo = utsname()
uname(&sysinfo)
let machine = withUnsafePointer(to: &sysinfo.machine) {
$0.withMemoryRebound(to: CChar.self, capacity: 1) {
String(cString: $0)
}
}
return machine == "arm64"
}
最佳实践
已有项目:立即在 Apple Silicon Mac(或 DTK)上测试你的 App。如果你的 App 纯 Swift/UIKit 实现,大概率能直接运行。如果有 C/C++ 依赖或汇编代码,需要单独为 ARM 编译。使用 Xcode 12 的 Universal Binary 构建设置来确保兼容性。
新项目:从架构层面就考虑 App Clips。把核心功能设计成可以独立运行的模块,这样你可以轻松地从主 App 中提取出 App Clip。使用 Swift 和 SwiftUI 来最大化跨平台兼容性——同一套代码在 iPhone、iPad 和 Apple Silicon Mac 上都能运行。
还有什么值得关注
- iPadOS 14 为 Apple Pencil 带来了 Scribble 功能,可以在任何文本框中直接手写输入。
- watchOS 7 支持多个并发症(Complications)共享同一个 App,并且支持表盘分享。
- macOS Big Sur 的 UI 进行了全面重新设计,圆角、半透明和图标风格与 iOS 更加统一。