问题标签 [xcframework]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
263 浏览

ios - 在框架内使用 xcframework

我可以在 .framework 中使用 .xcframework 吗?

当我尝试这个时,框架目标构建得很好,但是当我在 iOS 应用程序目标中使用这个框架时,它给出了构建错误

例如:

MyApp 是 iOS 应用程序目标
MyFramework 是一个框架(嵌入在 MyApp 中)
MyXcFramework 是一个 xcframework(嵌入在 MyFramework 中)

MyFramework 中的示例 swift 文件包含

import Foundation
import MyXcFramework

并成功构建

但是当 MyFramework 添加到 MyAapp 时,我收到以下错误

import Foundation
import MyXcFramework <- 没有这样的模块 MyXcFramework

谁能帮助我做错了什么?

0 投票
1 回答
128 浏览

ios - Xcode development workflow with binary framework

I'm using an xcframework to hide code.

So I've got an App.xcodeproj and the xcframework in one repo visible to contractors.

Then I have another private project which has everything in App.xcodeproj except has the framework project as a sub-project for easier development (instead of the compiled xcframework).

This works reasonably well except I have to keep the internal (private) and external projects in sync. Changes the contractors make to App.xcodeproj have to be manually brought over to the internal project, updating paths accordingly.

Is there a better way to do this?

0 投票
1 回答
707 浏览

xcode - Xcode 间歇性地找不到 xcframework

Xcode 有时找不到我的用于增量构建的 xcframework。

  • 错误是我的 xcframework 的名称在哪里ld: framework not found [framework][framework]
  • 一旦失败,重复的增量构建也会失败。
  • 干净的构建总是可以修复它。
  • 当我从普通框架切换到 xcframeworks 时,问题就开始了。
  • 我按照这个 WWDC 视频中的说明创建了 xcframework:https ://developer.apple.com/videos/play/wwdc2019/416/

我区分了增量构建和干净构建之间的链接命令,没有区别。这似乎是一个 Xcode 错误。我正在使用 Xcode 11.4.1。

0 投票
0 回答
232 浏览

swift - 如何在 iOS 中添加 xcframework 作为 pod(A) 的依赖框架?

我尝试在我的开发 pod 的 podspec 中将其添加为 s.dependancy,'ab.xcframework'。Pod 已在示例应用程序中正确安装,但此框架未添加为 dev pod 的依赖项。

0 投票
0 回答
223 浏览

ios - 开发和分发多个 XCFrameworks 的最佳方式

我们正在开发 8 个 SDK,它们将作为 XCFrameworks 共享。SDK 相互依赖,我们也依赖第三方 XCFrameworks,它们作为 Cocoapods 共享。

下面是依赖图外观的简单演示。

A -> B, C

B -> D、E、F

C -> G, H

D、E、F -> H

H -> I, J

我 -> K

这里 G 和 J 是第三方 XCFrameworks。K 是第三方 FAT 框架,完全用 Objective C 编写。其他字母表示我们完全用 Swift 编写并兼容 Objective-C 的 SDK。

您可以阅读第一行,因为 A 依赖于 B 和 C。

我们通过将所有这些作为开发 Pod 添加到示例 iOS 客户端来开始开发 SDK。我们面临的唯一问题是,即使对清理构建整个项目所需的任何 pod 进行微小更改。我们在工作区设置中解决了这个设置“旧版构建系统”。

当我们接近发布时,我们生成了 XCFrameworks 并尝试将它们添加到客户端。

我们几乎在所有框架中都面临以下问题。因为我们有与 SDK 名称匹配的类名,就像旧的 FAT 框架一样。 'FrameworkName' 不是 swiftinterface 中的 'FrameworkName' 错误的成员类型

然后我们重命名了所有框架并遇到了以下问题。 XCFramework 需要以 iOS 13 为目标,以实现具有 Objective-C 兼容性的框架间依赖关系

我们从 iOS 9 开始支持。所以迁移到 iOS 13 甚至不是一个选择。.swiftinterface即使在探索了引发这些问题的生成文件之后,我们也无法找到这个问题的确切原因。我们发现这个问题可能是因为通过以下方式使用继承。

X 是一个 Swift 类,通过继承 NSObject 使 Objective C 兼容。当我们有来自任何其他 SDK 的另一个类 Y 时,像下面这样继承 X,就会抛出这个问题。

例如,我们在框架 H.

然后在依赖于 H 的框架 D 中,我们有

我们在一个地方将其删除,问题得到解决。我们在八个 SDK 中都有这种模式,并且我们删除了所有这些。

然后当我们尝试构建时,我们遇到了以下问题。 '@objc' instance method in extension of subclass requires iOS 13.0.0.

我们将所有@objc扩展方法移至该类。这些主要是来自公共UIKit类的委托和数据源方法。

xcodeproj在客户端应用程序中使用 XCFrameworks 遇到这些问题后,我们决定删除开发 pod 设置并手动将所有 SDK的文件拖放到客户端应用程序中。我们还必须手动添加第三方框架。

这样,可以在开发期间而不是发布时识别上述一些问题。

现在的情况是,当我们对任何 SDK 进行更改时,除非我们进行干净的构建,否则它不会被反映,这需要大量时间并且不可取。

即便如此,在某些情况下,客户端应用程序只是抛出Unable to import D或任何其他框架,我们在其中进行了一些更改。然后我们在方案中选择该框架,构建一次,然后选择客户端应用程序并再次构建它以查看我们应用程序中的更改。

从长远来看,这个工作流程既麻烦又痛苦。请建议更好的替代设置来开发多个 XCFrameworks。

我们的下一个问题是在生成 XCFrameworks 时,我们需要每个 SDK 使用其他依赖 SDK 的 XCFramework。为此,我们必须从最底层的框架开始工作。生成它,添加到它上面的那个,然后继续下一个。

从长远来看,这也感觉像是一种负担。我们真诚地希望有更好的方法来做到这一点。请建议那些。

我们没有使用 Swift Package Manager (SPM),因为我们的大多数客户使用 Cocoapods 进行依赖管理,剩下的少数只是手动将框架拖到他们的项目中。

如果 SPM 可以起到灵丹妙药的作用,一次性解决所有这些问题,那么我们可以考虑使用它。

0 投票
1 回答
776 浏览

xcode - 在 Xcode 项目中使用包含外部静态 C 库的 xcframework 中的函数

我有一个 C 文件,其中包含一个函数my_library_function(),我使用该函数编译到一个静态库中并打包到一个名为usinggcc的 xcframework中。我已将此框架添加到 Mac 应用程序的 Xcode 项目中。但是在我的 Mac 应用程序中,我无法调用此函数,并且通常不确定如何调用。我曾尝试从 Swift 文件中直接调用该函数,但在这两种情况下都出现编译器错误 和. 我发现的唯一解决方法是创建一个桥接头和mylib.xcframeworkxcodebuild -create-frameworkimport mylibmy_library_function()No such module mylibUse of unresolved identifier 'my_library_function'#includexcframework 中其路径中的头文件。但是,由于最终我想使用更复杂的库并进行交叉编译并让 xcframework 包含多个目标的静态库,这似乎是一个 hacky 解决方法。有没有什么方法可以在没有桥接头的情况下做到这一点,我在这个过程中是否遗漏了什么?

以下是我所做的确切说明。首先,我将 C 代码编译成一个静态库。该库的源代码包含一个函数:

mylib.c

我也有上面的标题:

mylib.h

源代码树如下:

项目源树

然后我使用以下方法将 C 代码编译成静态库:

然后我创建了一个 xcframework:

这导致了一个 xcframework,如下所示:

mylib.xcframework 源代码树

然后我使用 Xcode 11 创建了一个新的 Xcode 项目。

在项目的根目录中,我创建了一个新组并将其命名为 Frameworks。然后,我将 xcframework 拖放到 XCode 框架组中,并选中复制项目(如果需要)复选框和创建组单选按钮。

在 Xcode 项目的常规选项卡中,在 Frameworks、Libraries 和 Embedded Content 下,我将框架设置为 Embed & Sign。

在 Build Settings 选项卡下的 Signing 下,我将 Other Code Signing Flags 设置为--deep以防止出现代码设计错误。在同一 Build Settings 选项卡中的 Linking 下,Runpath Search Paths 设置为@executable_path/../Frameworks/. 此外,在搜索路径下的构建设置选项卡中,我尝试将框架搜索路径、库搜索路径和标题搜索路径设置为相同的值@executable_path/../Frameworks/,并且我也尝试将这些路径设置为空。

不幸的是,我无法my_library_function()在应用程序的任何地方使用,也无法import mylib从 Swift 中使用。

我发现的唯一解决方法是创建一个目标 C 桥接头,并#include在框架文件夹中明确指出Headers/mylib.h能够调用我的函数。这似乎是一个 hacky 解决方案,尽管最终我想交叉编译我的代码,并且将为不同架构的每个单独库拥有单独的头文件,这样做可能会变得相当复杂。关于如何将我的函数包含在 XCFramework 和 MacOS Swift 项目中,我有什么遗漏吗?

下面是我的 Xcode 配置的一些图片:

Xcode 项目目录 添加框架 嵌入和签名 其他代码签名标志 构建阶段

0 投票
2 回答
1493 浏览

swift - 具有静态框架子依赖项的 XCFramework

我有一个依赖于几个静态框架的 XCFramework。

我的 XCFramework 是在启用 BUILD_FOR_LIBRARIES_FOR_DISTRIBUTION 的情况下构建的。

不需要从 XCFramework 外部访问子框架。

当我尝试在客户端(主机)应用程序中编译我的 XCFramework 时,我在 XCFramework 的 .swiftinterface 文件中收到错误消息No such module 'FBSDKLoginKit'(FBSDKLoginKit 是 XCFramework 子框架之一)

似乎缺少的是依赖模块的 swiftinterface 文件。例如,我正在使用 FBSDKLoginKit,但 XCFramework 中没有 swiftinterface。

作为参考,我正在编译框架如下:

0 投票
1 回答
2654 浏览

xcode - 将胖库添加到 XCFramework 在 Xcode 12 中不起作用

编辑(2020/09/14):这似乎是一个 Xcode 错误,现在已从 Xcode 12 beta 6 修复。

我正在使用 Xcode 12 来构建一个静态库,对于 tvOS,Xcode 12 包括arm64arm64e在单个 fat 库中。

同样,在为模拟器构建时,Xcode 12 将x86_64arm64(Mac Apple Silicon)都包含在单个胖库中。

在这两种情况下,我都无法使用以下命令创建包含这些库的 XCFramework:

xcodebuild -create-xcframework -output A.xcframework" -library A.a

尝试这样做会导致错误

error: unable to find any architecture information in the binary at 'A.a'

输出lipo -info A.a清楚地表明两种架构都存在(分别是arm64+arm64earm64+ x86_64),所以我不明白为什么xcodebuild不能识别和处理它。

我还尝试将各个架构分别提取到两个瘦文件中(例如A-arm64.aA-arm64e.a),然后使用这些文件创建 XCFramework,但这会导致不同的错误:

Both tvos-arm64e and tvos-arm64 represent two equivalent library definitions.

Both tvos-arm64-simulator and tvos-x86_64-simulator represent two equivalent library definitions.

我错过了什么吗?如何从胖库(或两个等效的瘦库)创建 XCFramework?

0 投票
2 回答
1048 浏览

swift - XCFramework 问题,标识符为“ios-armv7_arm64”的库已存在

在创建 XCFramework 时,我在终端上收到下面提到的消息,并且没有生成 xcframework A library with the identifier "ios-armv7_arm64" already exists.

这是我正在运行的命令

有什么我想念的吗?

0 投票
1 回答
319 浏览

ios - 我们是否需要为 CocoaPods 和 Carthage 创建 iOS 通用框架?

  1. Universal Frameworks/Libraries我的理解是否正确,只有当我们通过提供二进制文件分发我们的库时我们才需要手动创建(比如说直接下载.framework)?因此,如果我们使用 CocoaPods 或 Carthage 进行分发,这些工具将Universal Frameworks/Libraries自己从我们的源代码中创建,对吗?

  2. 据我了解,CocoaPods 和 Carthage 允许通过仅分发二进制文件来隐藏源代码。这是否意味着在这种情况下我们需要Universal Frameworks/Libraries在使用这些服务之前自己创建?

  3. Universal Frameworks/Libraries2020年 最好的创作方式是XCFramework什么?

谢谢。