PTools 依赖与供应链
本文件描述当前依赖的用途、所有权、风险和替换策略,不绑定某个历史版本。当前版本号和一次
解析结果分别由 PooTools.podspec、Podfile.lock 和 report/current/ 维护;本文件不修改
第三方源码。
安装入口和 6.0 取舍的逐模块事实见
PACKAGE_MATRIX.md 与 DEPENDENCY_MATRIX.md。
Ownership rules
PooTools/Core是PooTools.podspec的default_subspec,其他能力围绕 Core 扩展。- SwiftPM 的
PToolsLogging、PToolsCore、PToolsUIFoundation、PToolsPermissionCore和PToolsPermissionUI提供分层契约;ptools是兼容 umbrella。 - 功能模块只声明直接依赖,不在文档中重复计算传递依赖。
- 第三方依赖的版本、revision 和实际解析状态以
Package.swift、Podfile.lock和自动报告为准。 - 不为了解决外部 Pods 的 Swift 6 警告修改 Pods 源码或把依赖错误归因于 PTools Core。
Direct dependency groups
| 模块 | CocoaPods | SwiftPM | 主要直接依赖 | 不应直接带入 |
|---|---|---|---|---|
| Logging | PooTools/Logging |
PToolsLogging |
Foundation、OSLog、文件日志后端 | UIKit、Debug UI、外部日志后端、Network、媒体 |
| Core / UIKit Base | PooTools/Core |
ptools |
PToolsLogging、PToolsUIFoundation、PToolsDevice、SnapKit、IQKeyboardManager、Kingfisher、SmartCodable、KakaJSON、Lottie | Network、PhotoKit 浏览器、Debug UI |
| Overlay | PooTools/Overlay |
PToolsOverlay |
Core、UIFoundation、Logging | Banner 业务、Network、媒体 |
| Banner | PooTools/Banner |
PooToolsBanner |
Overlay、Symbols、Logging、UIKit | Core 反向依赖、第三方通知条 |
| Network | PooTools/NetWork |
PooToolsNetWork |
Core、Loading、Alamofire | PhotoPicker、MediaViewer、VideoEditor |
| Security | PooTools/Security |
PooToolsSecurity |
Foundation、CryptoKit、Security.framework | Network、Debug UI、业务模块 |
| SocketKit | PooTools/SocketKit |
PooToolsSocketKit |
Core、SocketRocket(兼容入口) | PhotoPicker、VideoEditor |
| MediaCore | PooTools/MediaCore |
PooToolsMediaCore |
Foundation-only 值类型和并发契约 | UIKit、PhotoKit、Network、Debug |
| ImagePicker | PooTools/ImagePicker |
PooToolsImagePicker |
Core、CameraPermission | PhotoKit 多选浏览器 |
| PhotoPicker | PooTools/PhotoPicker |
PooToolsPhotoPicker |
Core、ImagePicker、Network、Loading、Kakapos | VideoEditor、MediaViewer |
| MediaViewer | PooTools/MediaViewer |
PooToolsMediaViewer |
Core、ProgressBar、Network、PageControl、LivePhoto、Photos | ImagePicker、PhotoPicker 浏览器 |
| ImageEditor | PooTools/ImageEditor |
PooToolsImageEditor |
Core、HarbethKit、PhotoPicker | Network 请求层 |
| VideoEditor | PooTools/VideoEditor |
PooToolsVideoEditor |
Core、HarbethKit、ProgressBar、Loading | Network 请求层 |
| ScrollBanner / PageControl | PooTools/ScrollBanner、PooTools/PageControl |
对应 PooToolsScrollBanner、PooToolsPageControl |
Core;ScrollBanner 使用 PageControl | Network、媒体模块 |
| Search / SearchBar | PooTools/Search、PooTools/SearchBar |
PooToolsSearch、PooToolsSearchBar |
Search 依赖 Core、SearchBar;富文本使用 Core 提供的 PTRichText |
Network、媒体和业务数据 |
| Debug | PooTools/DEBUG |
PooToolsDEBUG |
Core、Network、Share、SearchBar、PDF | Core 反向依赖 Debug;生产不隐式启动诊断 |
| Configuration | PooTools/Configuration |
PToolsConfiguration |
Storage、Foundation | Firebase、LaunchDarkly、CloudKit、Core 默认依赖 |
| Feedback | PooTools/Feedback |
PToolsFeedback |
UIKit、CoreHaptics | 具体设备型号表、第三方触觉库 |
| Audio | PooTools/Audio |
PToolsAudio |
AVFoundation、AudioToolbox | 完整音乐播放器、MusicKit、流媒体引擎 |
| AppIntents | PooTools/AppIntents |
PToolsAppIntents |
RouteCore、AppIntents | UIKit window、业务动作执行器 |
| WidgetCore | PooTools/WidgetCore |
PToolsWidgetCore |
Storage、RouteCore、DeepLink、WidgetKit | SwiftUI Widget UI、猜测 App Group |
| Activities | PooTools/Activities |
PToolsActivities |
ActivityKit | 业务 ActivityAttributes UI、Push Server |
ImagePicker 与 PhotoPicker 有意共存:前者负责单媒体系统选择和相机,后者负责多选、编辑、原图、 Live Photo、自定义 Cell 和 iCloud 进度。不要因都能选择图片就合并成一条不清晰的依赖。
5.69.0 起 PhotoPicker 内部按 PTMediaPickerSession、PTMediaSelectionStore、
PTMediaAlbumRepository 和 PTMediaSubmissionCoordinator 分工;PTMediaLibViewController
仍是公开协调入口,PTMediaLibManager 仍是兼容门面。PhotoPicker 继续依赖现有 Core 的
PTMediaRequestCoordinator、PTMediaSaveService、PTMediaCache 和 PTImageDownsampler,不反向依赖
ImageEditor。该模块使用 UIKit/PhotoKit,当前支持边界为 iOS/iPadOS;watchOS、visionOS、macOS
只保留 Core/值类型层评估,不宣称可直接运行 PhotoPicker UI。
5.15.0 的媒体缓存和解码由 Core 提供:PTImageDownsampler 负责 ImageIO 目标像素解码,
PTMediaCache 负责 Memory/Disk 变体键和容量维护,PTVideoThumbnailService 负责视频帧生成。
Feature 模块只能使用这些入口,不应重新创建 CGImageSource、视频封面磁盘目录或重复的缓存键。
Third-party inventory
| 依赖 | 所属边界 | 用途 | 维护风险 | 替换方向 |
|---|---|---|---|---|
| SwiftDate | Core | 日期解析和格式化 | 中 | Foundation Calendar / ISO8601 |
| SnapKit | Core / UI | UIKit 布局 DSL | 低至中 | 原生 NSLayoutConstraint,按模块迁移 |
| PToolsLogging | Core / Debug | PTLogger、OSLog、文件日志和内存日志 | 低 | PTools 自有实现;不得重新引入外部日志后端 |
| PToolsDevice | Core / Foundation | 设备身份、目录和动态能力状态 | 低 | Foundation、Apple 公开系统 API |
| PTRichText | Core / UI Foundation | Foundation AttributedString 值模型、UIKit 桥接和安全匹配 |
低 | PTools 自有实现;继续收敛 UIKit 与 Foundation 边界 |
| IQKeyboardManager | Core / UI | 键盘避让兼容 | 中 | keyboardLayoutGuide 和通知 |
| Kingfisher | Core / Image | 图片缓存和加载 | 中 | PTLoadImageFunction + URLSession/cache |
| SmartCodable | Core / Network | 类型化模型解析 | 中 | Foundation Codable 或独立 Serialization |
| KakaJSON | 兼容层 | 历史动态模型解析 | 高 | 只保留兼容包装器,6.0 评估移出 Core |
| Lottie | UI / Debug | 动画资源播放 | 中 | UIKit / Core Animation |
| Alamofire | Network | 上传、下载和请求适配 | 中 | URLSession 统一执行器 |
| CryptoSwift | DataEncrypt 兼容层 | 历史 AES/DES API | 高 | PTSecurity 的 CryptoKit/Security.framework 入口 |
| PToolsOverlay / PooToolsBanner | UI | Scene-aware 浮层基础设施和原生通知条 | 低 | PTools 自有 UIKit 实现 |
| Swift-JWT | CheckUpdate | Apple API JWT 签名 | 高 | CryptoKit/Security 窄适配器 |
| SocketRocket | SocketKit | WebSocket 兼容 | 中 | URLSessionWebSocketTask |
Fixed revisions
当前已固定的外部 revision:
| 依赖 | URL | Revision |
|---|---|---|
| SocketRocket | https://github.com/robnadin/SocketRocket.git |
fe86ec01176ea3365ffa2d04a2bb6dd7a9e6c01e |
固定 revision 只保证可复现,不等价于上游 release 稳定;升级必须经过构建、API 和运行时回归。
Kitura / JWT boundary
PTCheckUpdateFunction.swift 是仓库内直接使用 Swift-JWT 的生产路径。BlueCryptor、BlueRSA、
BlueECC、LoggerAPI 和 KituraContracts 是传递依赖,不在 PTools Core 重复声明。当前 5.x 保留 JWT
行为;6.0 再评估使用 CryptoKit/Security 的窄范围实现。外部依赖的 Swift 6 诊断属于环境阻断,
不应通过修改 Pods 源码解决。
Codable dual stack
SmartCodable 是当前类型化入口;KakaJSON 只留在 PTBaseModel 和 Network 的历史兼容边界。新
代码不得让 Any 或 KakaJSON 动态结果进入 Swift 6 并发核心执行器。后续可在独立 Serialization
feature 中完成迁移,不能在兼容版本中直接删除公开模型。
Rich text boundary
5.25.0 removes the third-party lixiang1994/AttributedString package from SwiftPM,
CocoaPods and production source. PTRichText stores the Foundation AttributedString
value and exposes an explicit NSAttributedString bridge for UIKit. Search, Base, Button,
ScrollBanner, Stepper, PhotoPicker and WhatsNewsKit use this bridge instead of importing a
third-party type. Interactive text actions are represented by explicit UI callbacks or
PTTextActionRegistry; closures are not stored inside the Sendable text value.
5.25.0 从 SwiftPM、CocoaPods 和生产源码移除 lixiang1994/AttributedString。PTRichText
内部保存 Foundation AttributedString,通过明确的 NSAttributedString 桥接服务 UIKit。
交互行为使用 UI 回调或 PTTextActionRegistry,不把闭包写入 Sendable 富文本值。
Binary and validation
Bugly 等二进制 SDK 必须提供与目标平台匹配的 XCFramework 或 simulator/device slices;缺失产物、
Metal toolchain、签名和链接搜索路径单独记入 report/baselines/。依赖图、module parity、branch
扫描和供应链事实以 report/current/ 为准。