使用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路径粘贴到输入框。

相关推荐
mit6.82438 分钟前
[FSCalendar] 可定制的iOS日历组件 | docs | Interface Builder
ios
2501_9159214343 分钟前
iOS 应用加固与苹果软件混淆全解析 IPA 文件防反编译、混淆加密与无源码加固策略
android·macos·ios·小程序·uni-app·cocoa·iphone
2501_929382652 小时前
王国保卫战全集下载 1~5部全系列MOD DLC修版 安卓+ios+PC电脑版
游戏·ios·智能手机·iphone·玩游戏·单机游戏·安卓游戏
2501_916007474 小时前
iOS 代上架实战指南,从账号管理到使用 开心上架 上传IPA的完整流程
android·macos·ios·小程序·uni-app·cocoa·iphone
2501_915918415 小时前
iOS混淆与IPA文件加固深度解析,从反编译风险到苹果应用安全工程实践
android·macos·ios·小程序·uni-app·cocoa·iphone
萤虫之光12 小时前
【iOS】PrivacyInfo.xcprivacy隐私清单文件(二)
ios
YGGP14 小时前
【Swift】LeetCode 1. 两数之和
swift
巴博尔15 小时前
uniapp的IOS中首次进入,无网络问题
前端·javascript·ios·uni-app
Digitally16 小时前
如何从 iPhone 中导出视频
ios·iphone
_阿南_1 天前
flutter在Xcode26打包的iOS26上全屏支持右滑的问题
flutter·ios·xcode