我正在为 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'
尽管框架本身包含在生成的应用程序包中,但有什么方法可以将该框架排除在链接之外吗?
您需要阻止 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"