为 Flutter iOS 插件添加“bundle”框架

问题描述 投票:0回答:1

我正在为 Flutter 开发 iOS 插件,需要包含

x.framework
Mach-O 64-bit bundle arm64
二进制类型(因此,它可以由应用程序在运行时加载)而不是
Mach-O 64-bit dynamically linked shared library arm64

框架通过

.podspec
添加到
s.ios.vendored_frameworks

Flutter 将框架与

-framework x
arg 链接,这会给出错误:

Error (Xcode): Unsupported mach-o filetype (only MH_OBJECT and MH_DYLIB can be linked) in '/project_path/build/ios/Release-iphoneos/XCFrameworkIntermediates/plugin/x.framework/x'

尽管框架本身包含在生成的应用程序包中,但有什么方法可以将该框架排除在链接之外吗?

ios flutter
1个回答
0
投票

您需要阻止 Xcode 尝试链接框架,同时仍将其包含在应用程序包中以进行运行时加载。

要防止 Xcode 链接框架但仍将其包含在应用程序包中,您可以在 .podspec 文件中使用 EXCLUDED_SOURCE_FILE_NAMES 构建设置。

在 .podspec 文件中的 s.ios.vendored_frameworks 部分下,添加以下内容以排除实际框架二进制文件的链接:

s.exclude_files = "path/to/x.framework/x"

为了确保框架仍然包含在应用程序包中以供运行时加载,您可以在 .podspec 中指定 s.preserve_paths:

s.preserve_paths = "path/to/x.framework"

由于该框架是一个 Mach-O 捆绑包 (MH_BUNDLE),因此您需要在运行时在 iOS 代码中动态加载它。您可以在应用程序运行时使用 NSBundle 手动加载框架:

NSString *frameworkPath = [[NSBundle mainBundle] pathForResource:@"x" ofType:@"framework"];
NSBundle *frameworkBundle = [NSBundle bundleWithPath:frameworkPath];

if ([frameworkBundle load]) {
    NSLog(@"Successfully loaded the x framework.");
} else {
    NSLog(@"Failed to load the x framework.");
}

确保您的 .podspec 文件包含用于供应框架的其他相关设置:

s.ios.vendored_frameworks = "path/to/x.framework"

© www.soinside.com 2019 - 2024. All rights reserved.