跳至主要内容

添加 iOS App Extensions

iOS App Extensions 允许您扩展应用之外的功能。您的应用可以作为主屏幕小部件出现,或者您可以在其他应用中提供应用的某些部分。

要了解有关 App Extensions 的更多信息,请查看 Apple 的文档

iOS 18 添加了对自定义设备控制中心的支持,包括创建多个页面。您还可以使用 ControlCenter API 为控制中心创建新的切换按钮,以突出显示您的应用。

如何将应用扩展添加到您的 Flutter 应用?

#

要向您的 Flutter 应用添加 App Extension,请将扩展点目标添加到您的 Xcode 项目中。

  1. 通过在终端窗口中从 Flutter 项目目录运行 open ios/Runner.xcworkspace 来打开项目中的默认 Xcode 工作区。

  2. 在 Xcode 中,从菜单栏中选择文件 -> 新建 -> 目标

    Opening the File -> New menu, then selecting Target in Xcode.
  3. 选择您打算添加的 App Extension。此选择将在项目中的新文件夹中生成特定于扩展的代码。要了解有关生成的代码和每个扩展点的 SDK 的更多信息,请查看 Apple 的文档 中的资源。

要了解如何向您的 iOS 设备添加主屏幕小部件,请查看 将主屏幕小部件添加到您的 Flutter 应用 代码实验室。

Flutter 应用如何与 App Extensions 交互?

#

Flutter 应用使用与 UIKit 或 SwiftUI 应用相同的技术与 App Extensions 交互。包含的应用和 App Extension 不会直接通信。在设备用户与扩展交互时,包含的应用可能未运行。应用和您的扩展可以读取和写入共享资源,或使用更高级别的 API 相互通信。

使用更高级别的 API

#

某些扩展具有 API。例如,Core Spotlight 框架会索引您的应用,允许用户从 Spotlight 和 Safari 进行搜索。WidgetKit 框架可以触发主屏幕小部件的更新。

为了简化应用与扩展的通信方式,Flutter 插件封装了这些 API。要查找封装扩展 API 的插件,请查看 利用 Apple 的系统 API 和框架 或搜索 pub.dev

共享资源

#

要在您的 Flutter 应用和您的 App Extension 之间共享资源,请将 Runner 应用目标和扩展目标放在同一个 App Group 中。

要向 App Group 添加目标

  1. 在 Xcode 中打开目标设置。

  2. 导航到签名和功能选项卡。

  3. 选择+ 功能,然后选择App Groups

  4. 从两个选项之一中选择要向其中添加目标的 App Group

    1. 从列表中选择一个 App Group。
    2. 点击+ 添加新的 App Group。
Selecting an App Group within an Xcode Runner target configuration.

当两个目标属于同一个 App Group 时,它们可以从同一来源读取和写入。为您的数据选择以下来源之一。

后台更新

#

后台任务提供了一种通过代码更新扩展的方法,无论应用的状态如何。

要从您的 Flutter 应用安排后台工作,请使用 workmanager 插件。

深度链接

#

您可能希望将用户从 App Extension 重定向到 Flutter 应用中的特定页面。要打开应用中的特定路由,您可以使用 深度链接

使用 Flutter 创建 App Extension UI

#

某些 App Extensions 会显示用户界面。

例如,共享扩展允许用户方便地与其他应用共享内容,例如共享图片以在社交媒体应用上创建新帖子。

An example of an entry added to the share menu by a Flutter app

从 3.16 版本开始,您可以为 App Extension 构建 Flutter UI,尽管您必须使用扩展安全的 Flutter.xcframework 并嵌入 FlutterViewController,如下一节所述。

  1. 找到扩展安全的 Flutter.xcframework 文件,位于 <path_to_flutter_sdk>/bin/cache/artifacts/engine/ios/extension_safe/Flutter.xcframework

    • 要构建发布或概要文件模式,请分别在 ios-releaseios-profile 文件夹下查找框架文件。
  2. Flutter.xcframework 文件拖放到共享扩展的框架和库列表中。确保嵌入列显示“嵌入并签名”。

    The Flutter.xcframework file being marked as Embed & Sign in Xcode.
  3. 打开 Xcode 中的 Flutter 应用项目设置以共享构建配置。

    1. 导航到信息选项卡。
    2. 展开配置组。
    3. 展开调试概要文件发布条目。
    4. 对于这些配置中的每一个,请确保扩展的基于配置文件下拉菜单中的值与为普通应用目标选择的值匹配。
    An example Xcode Runner configuration with each property set to: Based on configuration file.
  4. (可选)如果需要,用扩展类替换任何故事板文件。

    1. Info.plist 文件中,删除NSExtensionMainStoryboard 属性。
    2. 添加NSExtensionPrincipalClass 属性。
    3. 将此属性的值设置为扩展的入口点。例如,对于共享扩展,它通常为 <YourShareExtensionTargetName>.ShareViewController。如果您使用 Objective-C 实现扩展,则应省略 <YourShareExtensionTargetName>. 部分。
    Setting the NSExtensionPrincipalClass property in the Info.plist file within Xcode.
  5. 添加 Flutter 屏幕 中所述,嵌入 FlutterViewController。例如,您可以在共享扩展中显示 Flutter 应用中的特定路由。

    swift
    import UIKit
    import Flutter
    
    class ShareViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
            showFlutter()
        }
    
        func showFlutter() {
            let flutterViewController = FlutterViewController(project: nil, nibName: nil, bundle: nil)
            addChild(flutterViewController)
            view.addSubview(flutterViewController.view)
            flutterViewController.view.frame = view.bounds
        }
    }

测试扩展

#

在模拟器和物理设备上测试扩展的过程略有不同。

在模拟器上测试

#
  1. 构建并运行主应用程序目标。
  2. 应用在模拟器上启动后,按 Cmd + Shift + H 最小化应用,这将切换到主屏幕。
  3. 启动支持共享扩展的应用,例如照片应用。
  4. 选择一张照片,点击共享按钮,然后点击应用的共享扩展图标。

在物理设备上测试

#

您可以使用以下过程或 在模拟器上测试 说明在物理设备上进行测试。

  1. 启动共享扩展目标。
  2. 在显示“选择要运行的应用”的弹出窗口中,选择一个可用于测试共享扩展的应用,例如照片应用。
  3. 选择一张照片,点击共享按钮,然后点击应用的共享扩展图标。

教程

#

有关将 App Extensions 与您的 Flutter iOS 应用一起使用的分步说明,请查看 将主屏幕小部件添加到您的 Flutter 应用 代码实验室。