将XCFramework与目标C一起使用

我用 Swift 语言创建了一个 xcframework。我也用@objc 标记了 .swift 类。

我试图在目标 c 项目中使用 <frameworkname-Swift.h>,但它显示 Module not found 错误。

任何人都可以帮助如何将 xcframework 与 Objective-C 代码一起使用。

回答

在制作 xcframework 并开始将它们集成到您的项目之前制作您的库非常重要。

静态库 (.a)

你的类和它的方法应该是 public 并标记@objc为在 Objc 中可见:

@objc public class SwiftHelloStatic : NSObject {
    
    @objc static public func hello() {
        print("Hello Static Library!")
    }
}

首先将您的“Objective-c Generated Interface Header”(例如 SwiftHelloStatic-Swift.h)添加到“Build Phases > Copy Files”,例如从您的目的地或 DeviredData 文件夹:

构建您需要的 arch (arm64/x86_64),然后您可以在包含您的标题的库中找到“include”文件夹:

从库和头文件构建你的 xcframework:

xcodebuild -create-xcframework 
-library arm64/libSwiftHelloStatic.a -headers arm64/include 
-library x86_64/libSwiftHelloStatic.a -headers x86_64/include 
-output SwiftHelloStatic.xcframework

在验证之后,您的 SwiftHelloStatic.xcframework 在 arch 文件夹中有“Headers”文件夹:

现在只需将您的 xcframework 拖放到“General > Frameworks, Libraries and Embedded Content”,并选择“Do not Embed”,因为您有静态库要链接。

最后一步是将“Build Settings > Header Search Path”设置为“<your_ destination>/SwiftHelloStatic.xcframework/**”以查找您的标题。

最后,您可以将标头添加到 objc 文件中:

#import <SwiftHelloStatic/SwiftHelloStatic-Swift.h>

...

[SwiftHelloStatic hello];

动态框架 (.framework)

它类似于静态库,但更简单,因为框架已经有了头文件。首先设置Build Library for Distrubution为 YES,然后为所需的拱门(arm64,x86_64,...)构建您的框架并从它们构建您的 xcframework 例如:

xcodebuild -create-xcframework 
-framework arm64/SwiftHello.framework 
-framework x86_64/SwiftHello.framework 
-output SwiftHello.xcframework

现在只需使用“嵌入和签名”将 xcframework 拖放到“常规 > 框架、库和嵌入内容”。

在您的 objc 项目中,您应该下一步导入您的 xcframework:

#import <SwiftHello/SwiftHello.h>

那是因为一个有效的 xcframework 包含针对其所有目标平台的单独动态框架,并且在编译时链接它们所需的一个,以便将头文件导入到您的代码中与常规框架相同。

还要验证您的类是否可以在“SwiftHello-Swift.h”中访问,例如:

SWIFT_CLASS("_TtC10SwiftHello5Hello")
@interface Hello : NSObject
+ (void)hello;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end


以上是将XCFramework与目标C一起使用的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>