使用Swift Package Manager (SPM)实现xcframework分发

Swift Package Manager (SPM) 是苹果官方提供的用于管理 Swift 项目的依赖关系和构建过程的工具。它是一个集成在 Swift 编程语言中的包管理器,用于解决在开发过程中管理和构建包依赖项的需求。

1、上传xcframework.zip到服务端

压缩xcframeworks成一个zip包,并且上传到服务器,得到一个压缩包的https链接,如:https://www.xxx.com/mysdk.xcframework.zip

在命令行中运行

bash 复制代码
shasum -a 256 mysdk.xcframework.zip

得到这个压缩包的SHA256哈希值

2、制作package

使用下面命令初始化package:

bash 复制代码
swift package init --type library

或者在Xcode菜单选择 File -> New -> Package 新建package

2.1、Package结构

一个 Package(包)由 Swift 源码文件和一个清单文件组成。这个清单文件被命名为 Package.swift,它使用 PackageDescription 模块来定义包的名称、内容以及依赖关系。

Package包含如下内容:

  • Package.swift: 包的清单文件,用于描述包的名称、内容、依赖关系、支持的 Swift 版本号;
  • Sources: 源码文件夹,通常包括 C/C++ 代码和 Swift 代码等;
  • Tests: 单元测试代码

目录结构如下:

Sources

--MyLibrary //同顶层目录名的target目录

-----MyLibrary.swift

Tests //单元测试

--MyLibraryTests

-----MyLibraryTests.swift

README.md //文档

Package.swift //配置文件,类似Cocoapods自定义pod库的podspec文件

2.2、修改package.swift文件

Swift 复制代码
// swift-tools-version:5.8 //这句不可以删除,指定版本的
 
import PackageDescription
 
let package = Package(
    name: "MyLibrary",
    platforms: [
        .iOS(.v13) // 适用的 iOS 版本
    ],
    products: [
        .library(
            name: "MyLibrary",
            targets: ["MyLibraryTarget"]
        ),
    ],
    dependencies: [
        .package(name: "MapboxMaps", url: "https://github.com/mapbox/mapbox-maps-ios.git", .exact("10.12.3")),
        .package(name: "Python-iOS", url: "https://github.com/kewlbear/Python-iOS.git", from: "0.1.1-b"),
        .package(name: "NumPy-iOS", url: "https://github.com/kewlbear/NumPy-iOS.git", .branch("main")),
    ],
    targets: [
        .binaryTarget(
            name: "MySDK", // 二进制库的名称
            url: "", // 二进制库的下载链接 上一步生成的
            checksum: "" // 二进制库的校验和 上一步生成的
        ),
        .target(
            name: "MyLibraryTarget",
            dependencies: ["MapboxMaps", "Python-iOS", "NumPy-iOS", "MySDK"],
        ),
        resources: [.copy("MyLib.bundle")],//资源包
        linkerSettings: [
            .linkedLibrary("z"),
            .linkedLibrary("bz2"),
            .linkedLibrary("sqlite3"),
            .linkedFramework("SystemConfiguration")
        ]
    ]
)

package.swift 必须以字符串"// swift-tools-version:"开头,后面跟一个版本号,例如:

// swift-tools-version:5.3

2.2.1、添加对另一个Swift Package的依赖项

Swift 复制代码
dependencies: [
    .package(url: "https://url/of/another/package.git", from: "1.0.0"),
    .package(path: "path/to/a/local/package/", "1.0.0"..<"2.0.0")
],

// 向位于给定路径的package添加依赖

.package(name: String, path: String)

// 向位于给定路径的package添加依赖

.package(path: String)

// 添加从特定最小版本开始的package依赖,直到下一个主要版本

.package(url: String, from: Version)

// 添加从特定最小版本开始的package依赖,直到但不包括指定的最大版本

.package(url: String, Range<Version>)

// 添加从特定最小版本开始的package依赖,直到并包括特定的最大版本

.package(url: String, ClosedRange<Version>)

// 添加给定分支需求的package依赖

.package(url: String, branch: String)

// 添加给定修订要求的package依赖

.package(url: String, revision: String)

// 添加使用确切版本要求的package依赖

.package(url: String, exact: Version)

2.2.2、明确声明资源

要添加Xcode无法自动处理的资源,需要在package.swift中明确声明为资源。

Swift 复制代码
targets: [
    .target(
        name: "MyLibrary",
        resources: [
            .process("text.txt")]
    ),
]

当明确声明资源时,必须选择以下规则之一,以确定Xcode如何处理资源文件:

  • .process

Xcode会为支持此类优化的平台优化图像文件。如果资源没有特殊处理,Xcode会将资源复制到资源包的顶级目录。

  • .copy

Xcode会将资源原样复制到资源包的顶层。保留目录的结构。

2.2.3、排除资源

如果文件驻留在target文件夹中,并且不希望它成为软件包资源,需要将其传递给exclude参数,来从target中排除文件:

Swift 复制代码
targets: [
    .target(
        name: "MyLibrary",
        exclude:["instructions.md"]
    ),
]

2.2.3、binaryTarget

创建一个引用本地库的二进制target

Swift 复制代码
.binaryTarget(
    name: "MySDK", // 二进制库的名称
    path: "", // 二进制库的路径
),

创建一个引用远程库的二进制target。

Swift 复制代码
.binaryTarget(
    name: "MySDK", // 二进制库的名称
    url: "", // 二进制库的下载链接
    checksum: "" // 二进制库的校验和
),

2.2.4、LinkerSettings

声明与系统框架的连接:

Swift 复制代码
linkerSettings: [
    .linkedFramework("SystemConfiguration")
]

声明与系统库的连接:

Swift 复制代码
linkerSettings: [
    .linkedLibrary("z"),
    .linkedLibrary("sqlite3"),
]

2.3、上传package到git

上传文件夹到git公开仓库,并且打上tag版本号。

3、使用package包

打开Xcode,选择file -> add Packages,将git路径粘贴到输入框。

相关推荐
幸福回头1 天前
ms-swift 代码推理数据集
llm·swift
若水无华2 天前
fiddler 配置ios手机代理调试
ios·智能手机·fiddler
不二狗2 天前
每日算法 -【Swift 算法】Two Sum 问题:从暴力解法到最优解法的演进
开发语言·算法·swift
Aress"2 天前
【ios越狱包安装失败?uniapp导出ipa文件如何安装到苹果手机】苹果IOS直接安装IPA文件
ios·uni-app·ipa安装
Jouzzy2 天前
【iOS安全】Dopamine越狱 iPhone X iOS 16.6 (20G75) | 解决Jailbreak failed with error
安全·ios·iphone
瓜子三百克2 天前
采用sherpa-onnx 实现 ios语音唤起的调研
macos·ios·cocoa
左钦杨2 天前
IOS CSS3 right transformX 动画卡顿 回弹
前端·ios·css3
努力成为包租婆2 天前
SDK does not contain ‘libarclite‘ at the path
ios
安和昂3 天前
【iOS】Tagged Pointer
macos·ios·cocoa
I烟雨云渊T3 天前
iOS 阅后即焚功能的实现
macos·ios·cocoa