【问题标题】:Use XCFramework with objective C将 XCFramework 与目标 C 一起使用
【发布时间】:2021-04-13 21:53:31
【问题描述】:

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

我尝试在目标 c 项目中使用 ,但它显示 Module not found 错误。

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

【问题讨论】:

  • 你用静态库还是动态库来制作xcframework?

标签: ios objective-c swift xcframework


【解决方案1】:

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

静态库 (.a)

你的类和它的方法应该是公开的,并用@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 文件夹:

构建您需要的拱门(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 在拱形文件夹中有“Headers”文件夹:

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

最后一步将“构建设置 > 标头搜索路径”设置为“/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

【讨论】:

  • 我试过用这种方式导入,但没有成功。我可以在派生数据下的 DerivedSources 中看到“FrameworkName-Swift.h”,但是当我创建框架时,“ios-arm64”和“ios-x86_64-simulator”是可见的,其中包含“library.a”和 swiftModue 文件。我试过手动放置“”FrameworkName-Swift.h“”,但它也不起作用。我使用以下命令创建框架: xcodebuild -create-xcframework -library build/simulators/libTrackingManager -library build/devices/libTrackingManager -output build/TrackingManager.xcframework
  • 如果您使用 .a 文件,您应该验证 xcframework 中是否存在 .h 标头,并尝试在项目设置中设置标头搜索路径。
  • @Tina 请看看我更新的答案。
猜你喜欢
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 2020-06-28
  • 2015-10-19
相关资源
最近更新 更多