【问题标题】:XCFramework with Pods Dependencies具有 Pod 依赖项的 XCFramework
【发布时间】:2021-02-15 02:46:22
【问题描述】:

我们的目标是创建一个框架来隐藏我们的内部代码并向我们的客户提供 SDK。 我们已经考虑创建满足我们要求的 XCFramework。互联网上也建议使用伞形框架,但大多建议避免这种方法。我们的框架依赖于我们通过 Pods 使用的一些第三方库。

问题: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

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

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

我们成功获得了 ABC XCFramework,但依赖项不包含在 XCFramework 中。有什么解决办法吗?或者有什么方法可以将框架搜索路径设置为客户端?或任何替代方法?

【问题讨论】:

  • 下面的解决方案真的有效吗?我正在尝试类似的东西,但在使用框架时出现错误。
  • 是的,创建一个 pod 对我有用@DustinPfannenstiel
  • @BhavinVaghela - 如果您在框架项目中不包含外部依赖项,编译器在尝试构建框架时不会给您一个错误吗?
  • @ShawnFrank 我已经尝试过薮猫的方式,每次我遇到一个错误,比如找不到模块(第三方)。对我有用的解决方案是创建一个 pod 并在 pod 规范中添加第三方依赖项。此外,我在构建或创建框架时没有收到错误我在添加到另一个项目时遇到了错误。

标签: ios frameworks xcodebuild xcframework


【解决方案1】:

您可以创建一个 pod 并发布它。

查看https://guides.cocoapods.org/making/making-a-cocoapod.html

带有 XCFramework + 第三方依赖的示例 Podspec 文件

Pod::Spec.new do |s|  
    s.name              = 'XCFrameworkTest' # Name for your pod
    s.version           = '0.0.1'
    s.summary           = 'Sample Spec'
    s.homepage          = 'https://www.google.com'

    s.author            = { 'Sample' => 'sample@sample.com' }
    s.license = { :type => "MIT", :text => "MIT License" }

    s.platform          = :ios
    # change the source location
    s.source            = { :http => 'http://localhost:8080/XCFrameworkTest.zip' } 
    s.ios.deployment_target = '10.0'
    s.ios.vendored_frameworks = 'XCFrameworkTest.xcframework' # Your XCFramework
    s.dependency 'PromisesSwift', '1.2.8' # Third Party Dependency
end 

发布 pod 后,客户可以使用 cocopods 获取我们的框架。

在客户的 Podfile 中

pod 'XCFrameworkTest' #Your pod name

【讨论】:

  • 这很优雅。
  • 这里有一些重要的信息:github.com/CocoaPods/CocoaPods/issues/…
  • 我尝试了这种方法,但由于构建错误,我仍然无法运行应用程序: > 缺少必需的模块“Stripe3DS2”。 > 从模块接口构建模块失败;它可能已损坏或在生成时触发了 Swift 编译器中的错误。我的猜测是 xcframework 无法处理来自 Stripe 的静态依赖。
  • 这个解决方案是有道理的,但是我不明白的是,如果我们在框架项目中不包含外部依赖项,框架是如何编译和构建的?
  • @KonradSiemczyk - 我也面临同样的问题。你有什么解决办法???
【解决方案2】:

我为此创建了一个模板。你可以通过运行命令来测试它

pod lib create YourLibName --template-url="https://github.com/zalazara/pod-template-xcframework.git"

模板基本上会生成一个示例项目及其 podfile 文件,然后将要开发的框架嵌入其中,然后生成文件使用工作空间编译框架。

BUILD_DIR="Build"
TMP_DIR="${BUILD_DIR}/Tmp"
IOS_ARCHIVE_PATH="${TMP_DIR}/iOS.xcarchive"
IOS_SIM_ARCHIVE_PATH="${TMP_DIR}/iOSSimulator.xcarchive"

rm -rf ${BUILD_DIR}
rm -rf "${FRAMEWORK_NAME}.xcframework"

xcodebuild archive \
 -workspace "Example/${WORKSPACE}" \
 -scheme ${SCHEME} \
 -archivePath ${IOS_SIM_ARCHIVE_PATH} \
 -sdk iphonesimulator \
 SKIP_INSTALL=NO \
 | xcpretty


 xcodebuild archive \
 -workspace "Example/${WORKSPACE}" \
 -scheme ${SCHEME} \
 -archivePath ${IOS_ARCHIVE_PATH} \
 -sdk iphoneos \
 SKIP_INSTALL=NO \
 | xcpretty

 xcodebuild -create-xcframework \
 -framework ${IOS_SIM_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework \
 -framework ${IOS_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework \
 -output ${FRAMEWORK_NAME}.xcframework \
 | xcpretty

欲了解更多信息:https://github.com/zalazara/pod-template-xcframework.git

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
【解决方案3】:

Ayyanar 的解决方案为我解决了问题,但在构建时出现错误:“无法从其模块接口构建模块;它可能已损坏或在生成时触发了 Swift 编译器中的错误”。

我解决了将目标链接到 Pod 中的 .xcframwork 的问题。

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2014-08-27
    • 2020-02-18
    相关资源
    最近更新 更多