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 端工作。
为了能够在 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.main(Bundle.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。
| 归档时间: |
|
| 查看次数: |
2062 次 |
| 最近记录: |