添加 iOS 应用扩展

iOS 应用扩展允许您在应用外部扩展功能。您的应用可以显示为主屏幕小组件,或者您可以让应用的部分内容在其他应用中可用。

要详细了解应用扩展,请查看 Apple 文档

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

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

  1. 通过在 Flutter 项目目录的终端窗口中运行 open ios/Runner.xcworkspace,打开项目中的默认 Xcode 工作空间。
  2. 在 Xcode 中,从菜单栏中选择文件 -> 新建 -> 目标

  3. 选择您打算添加的应用扩展。此选择会在您项目的某个新文件夹中生成特定于扩展的代码。要详细了解生成的代码和每个扩展点的 SDK,请查看 Apple 文档 中的资源。

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

Flutter 应用如何与应用扩展交互?

Flutter 应用使用与 UIKit 或 SwiftUI 应用相同的方法与应用扩展交互。包含应用和应用扩展不会直接通信。当设备用户与扩展交互时,包含应用可能不会运行。应用和您的扩展可以读写共享资源或使用更高级别的 API 相互通信。

使用更高级别的 API

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

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

共享资源

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

向应用组添加目标

  1. 在 Xcode 中打开目标设置。
  2. 导航到签名和功能选项卡。
  3. 选择+ 功能,然后选择应用组
  4. 从两个选项中选择您要添加目标的应用组

    1. 从列表中选择一个应用组。
    2. 单击+添加一个新的应用组。

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

后台更新

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

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

深度链接

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

使用 Flutter 创建应用扩展程序 UI

某些应用扩展程序会显示用户界面。

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

从 3.16 版本开始,您可以为应用扩展程序构建 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 文件拖放到共享扩展程序的框架和库列表中。确保嵌入列显示“嵌入和签名”。

  3. 在 Xcode 中打开 Flutter 应用项目设置以共享构建配置。

    1. 导航到信息选项卡。
    2. 展开配置组。
    3. 展开调试概要文件发布条目。
    4. 对于这些配置中的每一个,请确保扩展程序的基于配置文件下拉菜单中的值与为普通应用目标选择的那个值匹配。
  4. (可选)根据需要用扩展程序类替换任何情节提要文件。

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

     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. 选择一张照片,点击共享按钮,然后点击您应用的共享扩展图标。

教程

有关在 Flutter iOS 应用中使用应用扩展的分步说明,请查看 向您的 Flutter 应用添加主屏幕小组件 代码实验室。