我们有一个功能齐全的Flutter应用程序,并且它已经发布到 PlayStore 和 AppStore。
我们正在尝试向应用程序添加Rust 二进制文件,以便我们可以使用一些用该语言编写的 SDK。
为了实现这一目标,我们使用Flutter 的 FFI 系统,通过该系统我们可以对已编译的二进制文件执行本机调用并使用这些执行的结果。
在 Android 中,我们没有遇到任何问题,它在开发模式和生产模式下都可以工作,编译时二进制文件会添加到捆绑包中,并与应用程序一起发布到 PlayStore。
我们遇到的问题是iOS。当我们在开发模式下本地运行应用程序时,应用程序运行得很好,它可以无缝编译,我们可以从 iOS 模拟器和物理设备执行对 Rust 的本机调用。现在,当我们尝试编译应用程序以部署到 AppStore 时,就会出现问题。
编译过程分为2步,首先我们构建Runner.app包:
flutter build ios
Run Code Online (Sandbox Code Playgroud)
这会生成 Runner.app,然后将其用作Xcode的输入以生成将上传到 AppStore 的存档:
我们面临的问题是,当我们归档Runner.app 时,二进制文件会被编译器剥离,并且 Rust 函数不会被打包。这意味着当应用程序到达 AppStore(TestFlight 和 Production)时,二进制文件不存在。
我们的应用程序是使用以下内容构建的:
我们尝试捆绑的二进制文件是编译的静态库:library.a。该二进制文件是使用Cargo-lipo作为通用库构建的。(我们知道cargo-lipo处于维护状态,但我们也尝试过捆绑直接使用cargo build构建的二进制文件,结果是相同的)。
这是我们的Podfile:
# Uncomment this line …Run Code Online (Sandbox Code Playgroud)