我们的目标是创建一个隐藏我们内部代码的框架,并为我们的客户提供 SDK。我们已经考虑创建满足我们要求的 XCFramework。互联网上也建议使用 Umbrella 框架,但主要建议避免这种方法。我们的框架依赖于我们通过 Pod 使用的一些第三方库。
问题:XCFramework 不编译 pods 框架。我们收到类似“未找到 Xyz(Pod) 模块”的错误消息。即使我们从客户端添加 pod,它也不起作用。
创建 XCFramework 的代码如下
1)为iOS平台创建一个存档
xcodebuild archive -workspace ABC.xcworkspace \
-scheme ABC \
-sdk iphoneos \
-archivePath "./archives/ios_devices.xcarchive" \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
SKIP_INSTALL=NO
Run Code Online (Sandbox Code Playgroud)
2) 为 iOS-Simulator 平台创建存档
xcodebuild archive -workspace ABC.xcworkspace \
-scheme ABC \
-sdk iphonesimulator \
-archivePath "./archives/ios_simulators.xcarchive" \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
SKIP_INSTALL=NO
Run Code Online (Sandbox Code Playgroud)
3) 从档案创建一个 XCFramework
xcodebuild -create-xcframework \
-framework ./archives/ios_devices.xcarchive/Products/Library/Frameworks/ABC.framework \
-framework ./archives/ios_simulators.xcarchive/Products/Library/Frameworks/ABC.framework \
-output build/ABC.xcframework
Run Code Online (Sandbox Code Playgroud)
我们成功获得了 ABC XCFramework,但 XCFramework 中不包含依赖项。有什么解决办法吗?或者有什么方法可以将框架搜索路径设置为客户端?或任何替代方法?
我已经创建了 .xcframework 并尝试通过在 xcode 项目中嵌入 .xcframework 来在另一个应用程序中使用,但我收到一个错误“错误:遗留构建系统不支持使用 xcframeworks”。我正在 xcode 11.3 中测试这个
我正在尝试从 Xcode 框架项目(项目名称 XCFramework)生成一个 iOS XCFramework。项目由一些 cocoa-pods 库组成,如 Socket IO、SwiftKeyChainWrapper 等。 如果我生成没有 cocoa-pods 的 XCFramework,xcodebuild 命令会为 iOS 和 iOS 模拟器目标成功生成 XCFramework,但是当我在框架项目中安装 pod 时我收到很多错误。如果有人遇到这种情况并成功地帮助使用可可豆荚生成 XCFramework 示例项目,那将非常有帮助。
注意:a) 我使用了一个名为xcframework 的小包,它在命令 (1) 中生成 xcfremwork b) 如果我直接从 Xcode 存档项目,存档会成功。
1) 构建命令:- xcframework build --project XCFramework.xcodeproj --name XCFramework --iOS EcallXCFramework
...... ...... ** 存档失败**
以下构建命令失败:Ld /Users/*******/Library/Developer/Xcode/DerivedData/XCFramework-gccrcnyzlsezmugkrqqlnpusjfci/Build/Intermediates.noindex/ArchiveIntermediates/XCFramework/InstallationBuildProductsLocation/Library/Frameworks/XCFramework.framework/ XCFramework 正常 arm64(1 失败)
2)构建命令:- xcodebuild archive -scheme XCFramework -destination="generic/platform=iOS" -destination="generic/platform=iOS Simulator" SKIP_INSTALL=NO
...... ...... 来自命令行的用户默认值:destination = generic/platform=iOS Simulator
从命令行构建设置:SKIP_INSTALL = NO
xcodebuild:错误:无法使用 XCFramework 方案构建项目 EcallXCFramework。原因:运行目标 My …
我正在开发一个 XCFramework,它的公共接口有很多很好的文档(如 docstrings/Markup Apple Markup Formatting Reference )。但是,当框架包含在客户端应用程序中时,当您在方法或属性上按住 Option 键单击(“快速帮助”)时,Xcode 不会显示任何文档。
在 SDK.xcframework 文件夹中,有一个文件Headers/SDK-Swift.h实际上包含所有这些文档字符串。
有没有办法告诉 Xcode 使用附带的文档?
我的 XCFramework 是通过创建的xcodebuild -create-xcframework -framework x.framework -framework y.framework -output z.xcframework
创建这样的 xcframework 时
xcodebuild archive -project endiosOne-iOS.xcodeproj -scheme EOFoundation -destination="iOS" -archivePath /tmp/xcf/ios.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphoneos SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
xcodebuild archive -project endiosOne-iOS.xcodeproj -scheme EOFoundation -destination="iOS Simulator" -archivePath /tmp/xcf/iossimulator.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphonesimulator SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
xcodebuild -create-xcframework -framework /tmp/xcf/ios.xcarchive/Products/Library/Frameworks/EOFoundation.framework -framework /tmp/xcf/iossimulator.xcarchive/Products/Library/Frameworks/EOFoundation.framework -output /tmp/ xcf/EOFoundation.xcframework
然后将框架添加到现有项目或新项目中,我们在导入框架时遇到此错误。
无法从其模块界面构建模块“EOFoundation”;它可能已损坏,或者可能在生成时触发了 Swift 编译器中的错误
使用 xcode 12.1,也尝试使用 Xcode 11。尝试使用新的 UIKit 应用程序和新的 SwiftUI 应用程序
我们得到以下 UIKit 错误UIKit 错误
我无法修复 UIKit 中的错误,因为它在 UIKit 中:不幸的是,苹果没有给我们很多关于如何解决这个问题的信息。
我该如何解决这个问题,以便我使用在另一个项目中生成的 xcframework?
在 Xcode 12.4 之前,我们使用此解决方法来获取项目的框架,并且这些框架采用捆绑包的形式(黄色公文包图标)。另外,我需要Carthage Copy File为每个目标手动雕刻一个脚本(在构建阶段下),这很烦人且容易出错。
几天前,我读了 Carthage 官方文档,它建议使用xcframework. 从这些步骤来看,似乎copy file不再需要这个烦人的步骤,我决定尝试一下。
我完全按照迁移步骤进行。我还更改了框架搜索路径,使其指向从$(PROJECT_DIR)/YOUR_PROJECT/Carthage/Build/iOS到$(PROJECT_DIR)/YOUR_PROJECT/Carthage/Build。该应用程序刚刚在模拟器中运行,但现在还为时过早,每当我尝试在 iPhone 中运行它时,它就会崩溃。在调试器控制台中它抱怨
dyld: Library not loaded: @rpath/Auth0.framework/Auth0
Referenced from: /private/var/containers/Bundle/Application/9575D8AA-BD35-447B-ACC3-F8545CDB62EE/FIT dev.app/FIT dev
Reason: image not found
dyld: launch, loading dependent libraries
DYLD_LIBRARY_PATH=/usr/lib/system/introspection
DYLD_INSERT_LIBRARIES=/Developer/usr/lib/libBacktraceRecording.dylib:/Developer/usr/lib/libMainThreadChecker.dylib:/Developer/Library/PrivateFrameworks/DTDDISupport.framework/libViewDebuggerSupport.dylib
Run Code Online (Sandbox Code Playgroud)
最后,我看到了两年前的这篇Medium 帖子embed & sign,其中建议了拖放到项目中的框架。我对我的项目做了同样的事情,将Embed一些框架的状态从更改为Do not …
考虑 OpenSSL,该项目本身有两个产品:libssl.a和libcrypto.a。为了简单起见,我们使用存储在该存储库中的预编译库并仅考虑iphonesimulator平台。
当查看存储库时,每个平台例如iphonesimulator或iphoneos将具有一组用于所有所需架构的静态库。
我的目标是创建一个捆绑这两个静态库的 XCFramework,以便可以方便地将 Swift Package Manager 作为单个包使用。
我绝对可以使用以下命令从静态库创建一个支持多个平台的 XCFramework:iOS Simulator ( i386, x86_64, arm64), iOS ( arm64, ...) :arm7
xcodebuild -create-xcframework \
-library iphonesimulator/lib/libcrypto.a \
-headers iphonesimulator/include/ \
-library iphoneos/lib/libcrypto.a \
-headers iphoneos/include/ \
-output OpenSSL.xcframework
Run Code Online (Sandbox Code Playgroud)
输出如下:
xcframework 成功写入:/Users/name/OSSL_test/OpenSSL.xcframework
框架的结构是正确的,它包含标头和libcrypto.a. 当导入到另一个 Xcode 项目时,该 XCFramework 会被识别并用于构建应用程序。
但是,当我也尝试添加时libssl.a,出现以下错误:
xcodebuild -create-xcframework \
-library iphonesimulator/lib/libcrypto.a \
-headers iphonesimulator/include/ \
-library iphonesimulator/lib/libssl.a …Run Code Online (Sandbox Code Playgroud) 目前我正在一个框架项目中工作,以分发给我们拥有的客户。该框架具有 SPM 依赖项,我想从中创建一个 XCFramework。我找到了使用该xcodebuild工具存档和生成 XCFramework 的脚本。问题是生成不工作,我收到以下错误Failed to build module 'XXX' from its module interface; it may have been damaged or it may have triggered a bug in the Swift compiler when it was produced。我不知道是否可以构建一个具有 SPM 依赖项的框架作为 XCFramework 我试图将它作为二进制框架分发以保护我们的源代码。我以前寻找过这个,但找不到任何有关此事的信息。有人可以帮助我吗?
我的项目使用第三方xcframeworks,但其中一个xcframework不支持模拟器,导致构建失败。有没有办法从模拟器构建中排除特定的 xcframework 但在设备构建中?
我按照此处的指南尝试在新的 KMM 项目中使用不带 CocoaPods 的 iOS 框架:
https://kotlinlang.org/docs/kmm-add-dependency.html#without-cocoapods
我有一个现有的、工作的 .xcframework,我将其添加到 .xcframework 下的项目中shared/src。我添加了一个MyKit.def文件并在同一共享目录中src/nativeInterop/cinterop/更新了该文件:build.gradle.kts
MyKit.def 看起来像
language = Objective-C
modules = MyKit
package = MyKit
Run Code Online (Sandbox Code Playgroud)
构建.gradle.kts
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
kotlin("multiplatform")
id("com.android.library")
}
kotlin {
android()
val iosTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
::iosArm64
else
::iosX64
iosTarget("ios") {
binaries {
framework {
baseName = "shared"
}
}
}
sourceSets {
val commonMain by getting
val commonTest by getting { …Run Code Online (Sandbox Code Playgroud) android ios kotlin-multiplatform xcframework kotlin-multiplatform-mobile
xcframework ×10
ios ×8
xcode ×5
swift ×4
android ×1
arm64 ×1
carthage ×1
cocoapods ×1
frameworks ×1
kotlin-multiplatform-mobile ×1
libcrypto ×1
openssl ×1
xcode11 ×1
xcode12.5 ×1
xcodebuild ×1