我正在开发一个 iOS 应用程序,我们将把它的核心作为独立的 Swift 包开源给其他开发人员。
Swift 包依赖于 Sodium (https://github.com/jedisct1/swift-sodium)。使用 SPM 时,此库存在一个问题,即在存档期间(有时在 Xcode 中本地编译期间),它将无法找到嵌入式 CLibrary,从而导致如果使用此包或拥有它,则无法发布到应用程序商店嵌入你自己的。 (这在 SPM / Xcode 中被记录为错误,但需要一些时间才能修复)
有人制作了一个叉子来解决一些问题这里。他们通过将 Clibrary 拆分为托管在其他地方的单独 .xcframework 解决了这个问题。然后创建一个新的 Package.swift 将其作为外部依赖项导入。此更新的钠包已设置为动态类型。
将其包含在我的 Swift 包中,然后将我的包包含在我的 iOS 应用程序中...它构建良好,在 Xcode 中运行良好,在模拟器上运行良好,导出或上传到 TestFlight 时不会引发任何错误。
但是从 TestFlight 下载后,我收到此错误,提示无法找到 Sodium 框架:
Termination Description: DYLD, dyld: Using shared cache: <hash> | dependent dylib `@rpath/Sodium.framework/Sodium` not found for <path-to-ipa>/<appname> tried but didn't find <path-to-sodium>
使用其他依赖管理工具,解决方案通常是向 iOS 应用程序的 xcode 项目添加“复制文件构建阶段”并添加框架。如果我尝试在我的 Xcode 项目中执行此操作,我找不到 Sodium 框架,并且找不到告诉 SPM 将框架复制到
Package.swift
内的方法。
如何更新我的 Package.swift,以便它为任何使用它的应用程序复制此框架?
如果不可能,如何将其复制到 Xcode 项目中?它在下拉列表中不可见。
目前我的 Package.swift 看起来像这样:
import PackageDescription
let package = Package(
name: "<package-name>",
platforms: [.iOS(.v14)],
products: [
.library(name: "<package-name>", targets: ["<package-name>"]),
],
dependencies: [
.package(url: "https://github.com/attaswift/BigInt.git", from: "5.2.1"),
.package(name: "Sodium", url: "https://github.com/junelife/swift-sodium.git", .branch("spm"))
],
targets: [
.target(
name: "<package-name>",
dependencies: [
"Sodium",
"BigInt",
]
),
.testTarget(
name: "<package-name>Tests",
dependencies: ["<package-name>"]
),
]
)
目前的解决方法:
如果我也将动态包导入到 iOS 应用程序中,我会在目标的常规选项卡下的
Frameworks, Libraries, and Embedded Content
下的 Sodium 框架旁边获得“嵌入并签名”选项。这迫使它进入捆绑包。
注:
我尝试使我的包动态化,看看包含它是否会自动嵌入所有内容,并避免必须向用户发出单独嵌入它的指示。但这没有用。它只嵌入了我的包,而不嵌入动态依赖项。
如果有人有办法修改 Package.swift 以强制其嵌入动态依赖项......或者知道如何完全清理这个混乱。请评论