Swift Academy · 课时

应用扩展概览

了解共享、操作及其他扩展。

第 3 / 4 课13 个步骤

应用扩展概览 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

什么是应用扩展

应用扩展让您的应用能够在其他应用或系统界面中提供功能,例如共享内容、自定义键盘、Spotlight 索引等。每个扩展都是一个独立目标,拥有自己的生命周期、沙盒和由系统定义的入口点。

// Extensions run in their own process, launched
// by the host (Photos, Safari, Messages, the system),
// not by your main app.

宿主、容器与沙盒

这里有三个参与者:宿主应用调用扩展,您的容器应用随扩展一起发布,而扩展本身在沙盒中运行。扩展不能自由地与您的应用通信——二者通过应用组通信,绝不会直接访问彼此的内存。

import Foundation
// Container app + Extension target share data via
// an App Group, e.g. group.com.example.app
let group = "group.com.example.app"
_ = group

共享扩展

共享扩展会出现在系统共享面板中,让用户可以将任意应用中的内容(文本、URL、图像)发送到您的应用。它会继承或承载一个视图控制器,并从扩展上下文中读取共享项目。

import Foundation
// Share extension reads incoming items:
// extensionContext?.inputItems
//   each NSExtensionItem has attachments (NSItemProvider)
let share = "appears in the share sheet"
_ = share

读取共享项目

共享内容会以 NSItemProvider附件的形式到达。您需要检查类型标识符,并异步加载值。这就是共享扩展获取用户正在分享的 URL 或图像的方式。

import UniformTypeIdentifiers
func handle(_ provider: NSItemProvider) {
    if provider.hasItemConformingToTypeIdentifier(
        UTType.url.identifier) {
        provider.loadItem(
            forTypeIdentifier: UTType.url.identifier) {
            value, _ in
            print("shared url:", value ?? "none")
        }
    }
}

操作扩展

操作扩展会就地转换或查看内容——翻译选中的文本、为 PDF 添加注释——并可以向宿主返回结果。与共享扩展不同,它的用途是处理内容,而不是将内容发送到其他位置。

import Foundation
// Action extension may return modified items:
// extensionContext?.completeRequest(
//     returningItems: outputItems)
let action = "acts on content, can return a result"
_ = action

通知服务扩展

通知服务扩展会拦截带有 mutable-content: 1的传入推送通知,并在显示前对其进行修改——解密正文、下载媒体附件或重写标题——整个过程必须在很短的时间 budget 内完成。

import UserNotifications
// Override in UNNotificationServiceExtension:
// didReceive(_ request:, withContentHandler:)
//   mutate bestAttemptContent, then call the handler
let service = "modifies push before it shows"
_ = service

通知内容扩展

通知内容扩展为展开的通知提供自定义界面,例如地图、媒体播放器或交互控件。当用户长按横幅时,系统会显示该界面。它会绑定到通知类别。

import UserNotifications
// UNNotificationContentExtension renders a custom view
// for a given UNNotificationCategory when expanded.
let content = "custom expanded notification UI"
_ = content

completeRequest 生命周期

扩展的生命周期很短。完成后,请调用 extensionContext?.completeRequest(returningItems:completionHandler:)来表示操作完成,并让宿主关闭扩展。要退出操作,请使用 cancelRequest(withError:)。让进程持续运行会浪费资源,而且进程可能会被终止。

import Foundation
func finish(context: NSExtensionContext?) {
    context?.completeRequest(
        returningItems: [], completionHandler: nil)
}

其他扩展点

iOS 提供许多扩展点:自定义键盘、文稿提供程序、Spotlight 索引、Safari 内容拦截器、Siri 意图、照片编辑和文件提供程序扩展。每个扩展都遵循系统定义的协议,该协议由其 Info.plist 中的 NSExtensionPointIdentifier声明。

// Info.plist of an extension declares its point:
// NSExtension > NSExtensionPointIdentifier
//   e.g. com.apple.share-services
//        com.apple.usernotifications.service
let point = "each extension declares its point"
_ = point

内存与时间限制

与主应用相比,扩展受到更严格的限制——可用内存更少,墙上时钟时间 budget 更短。请只执行必要的工作,避免大量分配,并尽可能通过共享存储将繁重的处理转交给主应用。

import Foundation
// Tight memory + short runtime.
// Pattern: extension stages data in the App Group,
// the main app processes it fully on next launch.
let limits = "keep extensions lean and fast"
_ = limits

在目标之间共享代码

为了避免重复逻辑,请将共享模型和辅助工具放入应用与扩展都依赖的框架或 Swift 包中。只标记每个目标所需的内容;扩展可以链接相同的代码,而无需复制代码。

import Foundation
// Shared Swift package 'AppCore' linked by:
//   - main app target
//   - share extension target
//   - widget extension target
let shared = "one source of truth for models"
_ = shared

快速检查

回想一下扩展如何与其容器应用通信。

回顾

您了解了应用扩展:

  • 扩展是由宿主启动的独立沙盒目标,类型包括 share、action、通知服务和通知内容。
  • 通过 NSItemProvider读取传入内容,并使用 completeRequest完成操作。
  • 每个扩展都会声明其 NSExtensionPointIdentifier,并在严格的内存和时间限制下运行。
  • 通过应用组共享数据,并通过共享包复用代码。
免费开始

用 AI 导师学习 Swift — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
122
课程
409

常见问题解答

「应用扩展概览」课时是免费的吗?

是的 — 「应用扩展概览」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「应用扩展概览」这节课中我会学到什么?

了解共享、操作及其他扩展。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「应用扩展概览」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 构建 WidgetKit Widget
  2. 时间线提供程序与快照
  3. 应用扩展概览
  4. 应用意图与快捷指令
← 返回 Swift Academy