Using dummy headers

flutter_rust_bridge_codegen 会创建一个 C 头文件,里面列出了 Rust 库导出的所有符号,我们需要使用它确保 Xcode 不会将符号去除。

在项目中添加 ios/Runner/bridge_generated.h (或者 macos/Runner/bridge_generated.h),你可以把文件直接拖到项目文件夹中或者点击菜单上的 Add Files to "Runner"... .

如果它还没有出现,请切换到 Build Phases 标签页,把 bridge_generated.h 文件拖到 Copy Bundle Resources

iOS

接下来,在 ios/Runner/Runner-Bridging-Header.h 中添加:

+#import "bridge_generated.h"

ios/Runner/AppDelegate.swift 中添加:

 override func application(
     _ application: UIApplication,
     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
 ) -> Bool {
+    let dummy = dummy_method_to_enforce_bundling()
+    print(dummy)
     ..
 }

这里调用 dummy_method_to_enforce_bundling() 并打印返回值的步骤非常重要(类似于上面的例子),否则最终的符号还是可能被去除。

MacOS

Flutter 在 MacOS 上默认不使用符号,我们需要添加我们自己的。在 Build Settings 标签页中,把 Objective-C Bridging Header 设置为 Runner/bridge_generated.h

最后,在 macos/Runner/AppDelegate.swift 文件的某个地方使用一下 dummy_method_to_enforce_bundling , 只要 Xcode 不把它当作 dead code 就行。