1

我正在开发dart_ping包,虽然它目前被标记为支持 iOS,但它实际上并不支持 iOS。这是由于 pub.dev 检测受支持平台的方式。我在 dart-sdk repo 上提交了一个问题

尽管如此,我想添加 iOS 支持,同时仍然保留对 dart native 的支持。现在,dart_ping 通过调用主机操作系统的 ping 二进制文件来工作。ping 二进制文件在 Windows、macOS、Linux 和 Android 上可用,但在 iOS 上不可用。

当前在 iOS 上执行 ping 的方法使用本机 Objective-C 代码并通过方法通道ffi调用它们。由于方法通道是一种颤振功能而不是 dart 功能,因此使用它们需要 dart_ping 依赖于颤振 sdk,这将阻止它在 dart 原生应用程序(可能是服务器端)中使用。

另一方面,Ffi 是一个 dart 原生功能,能够做我想做的事。但是,我似乎无法找到一种方法将用于 ping 的 iOS 框架/库/二进制文件包含在我的 dart_ping 包中,以指示颤振应用程序包含它并将其链接到 iOS 目标/运行器。

有什么方法可以在我的包中保留 dart 原生支持,同时还支持需要额外非 dart 框架的 iOS 边缘情况?即使是联合插件也依赖于颤振 sdk。在我看来,我们需要一个等同于联合插件系统的纯 dart。

TLDR:如何在不依赖于 Flutter sdk 的情况下将预编译的 iOS 框架或二进制文件添加到 dart 包中,并仅在包用于 iOS 时调用它?

4

1 回答 1

0

对于您只为您的包的 Flutter 用户添加 iOS 支持但保持包为纯 Dart 而不依赖于 Flutter SDK 的特定情况,应该可以通过拥有一个依赖于您的 Dart 包的 Flutter 插件包来实现。

在纯 Dart 包中,您可以对原生 iOS 库进行 FFI 调用,但实际上它是 Flutter 插件包,根据Flutter 文档提供原生 iOS 库以使用 FFI

您当然需要在纯 Dart 包的文档中非常清楚地说明,对于 iOS,它只能通过“包装器”插件包使用。

不幸的是,这是一种相当复杂的方法,但我不知道有更好的方法来实现这一点。

本期的评论中有关于这个话题的进一步讨论,截至今天仍然开放

于 2021-12-06T07:32:22.600 回答