在 Flutter Plugin 的 IOS 组件中何处以及如何包含文件资源?

Boo*_*unz 5 filepath ios swift flutter flutter-plugin

假设您正在用 Swift 编写 Flutter 插件的 IOS 组件。

您已在 XCode 中打开 MyFlutterPlugin.swift 文件。

为了让我们知道我们在谈论同一件事,文件如下所示:

public class MyFlutterPlugin: NSObject, FlutterPlugin {

    public static func register(with registrar: FlutterPluginRegistrar) {
        let channel = FlutterMethodChannel(name: "my_flutter_plugin", binaryMessenger: registrar.messenger())
        let instance = SwiftMetronomeFlutterPlugin()
        registrar.addMethodCallDelegate(instance, channel: channel)
    }

    public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {

    // ...

    }

}
Run Code Online (Sandbox Code Playgroud)

该文件存在于磁盘上:

[your_plugin_project_name]/ios/classes/MyFlutterPlugin.swift

如何添加资源,例如音频 (WAV) 文件,以便可以从 MyFlutterPlugin.swift 中引用它?

在普通(非 Flutter)IOS 应用程序中,我只需将 WAV 文件拖到 XCode 中(它与 ViewController.swift 位于同一文件夹中)即可完成此操作,并从 ViewController 中引用它,如下所示:

let clack_Path = Bundle.main.path(forResource: "clack", ofType: "wav")
let clack_URL = URL(fileURLWithPath: clack_Path!)
Run Code Online (Sandbox Code Playgroud)

但是,如果我在 MyFlutterPlugin.swift 中尝试相同的方法(将音频文件与 MyFlutterPlugin.swift 放在一起),我会收到一条错误,指出 clack_Path 为 null。

那么文件的正确放置位置在哪里,以及如何正确引用它呢?

我找不到关于这个特定问题的任何代码示例、教程或文档(至少没有我认为有用的)。希望它实际上可以在 IOS 上实现...我已经包含了资源并可以在插件的 Android 端工作。

Edu*_*tal 5

为了能够在 Flutter 插件中使用资源,首先,我们需要将资源添加到插件的文件夹中,在本例中,我将文件放在clap.wav文件夹中[your_plugin_project_name]/ios/Assets/

将文件添加到插件的文件夹中后,我们需要在插件的 PodSpec 中指定资产所在的位置

# File [your_plugin_project_name]/my_flutter_plugin.podspec
Pod::Spec.new do |s|
  # [...] supressed content above
  s.source_files = 'Classes/**/*'
  s.resources    = ['Assets/**.*']
  # [...] supressed content below
end
Run Code Online (Sandbox Code Playgroud)

上面代码片段中的重要部分是行s.resources = ['Assets/**.*'],其中Assets/**/*指定所有插件的资源都位于文件夹内Assets。是Assets/**/*一个通配符,用于指示文件夹*内每个文件夹/子文件夹(部分**)中的每个文件(字符串部分)Assets必须作为插件包的资源包含在内。您可以了解有关此类字符串搜索的更多信息regular expression

每次更改插件的配置时,您都需要通知使用该插件的 Flutter 项目有新的更改。在常规项目中,您需要更改插件的版本并在 Pub 中发布它的新版本但由于我们只是在本地更改它(而不将其发布到全世界),因此我们只需要通知 Flutter 该插件的版本文件已过时。flutter clean最简单的方法是在使用该插件的项目内运行。

之后,您将能够clap.wav使用以下代码访问插件的 swift 文件中的文件:

# File [your_plugin_project_name]/my_flutter_plugin.podspec
Pod::Spec.new do |s|
  # [...] supressed content above
  s.source_files = 'Classes/**/*'
  s.resources    = ['Assets/**.*']
  # [...] supressed content below
end
Run Code Online (Sandbox Code Playgroud)

请注意,您必须使用Bundle(for: type(of: self))而不是Bundle.mainBundle.main指向跑步者的捆绑包而不是插件的捆绑包)。

在下面的示例中,我展示了如何clap.wav使用 swift 代码进行播放:

guard let url = Bundle(for: type(of: self)).url(forResource: "clap", withExtension: "wav") else {
   return print("File not found") 
}
Run Code Online (Sandbox Code Playgroud)

上面的示例是如何播放文件的简单示例clap.wav,但您可以通过其他不同的方式进行播放。由于这与问题无关,我认为上面的例子足以回答你的问题。

为了便于您理解并轻松演示上述代码的工作原理,我在 GitHub 中创建了一个简单的项目,您可以执行该项目来查看其是否按预期工作,请在此处查看

请注意,您必须运行该文件夹内的代码example