Skip to the content.

PTAcknowledgements 5.66.0

模块边界

产品 依赖 用途
PToolsAcknowledgementsCore Foundation 模型、离线读取、查询、筛选、统计、原文、导出、actor Repository
PToolsAcknowledgements Core + UIKit;PTools UIKit 可用时复用 PTBaseViewController 列表、搜索、详情、复制和分享
pt-acknowledgements Core,macOS 构建主机 扫描 Package.resolved、Podfile.lock、checkout 和手工覆盖,生成清单

Core 是默认的最小数据边界,不引入 UIKit、SnapKit、网络请求或完整 ptools。UIKit 列表和详情页只消费 Core 值类型;在 PTools UIKit target 可用时,PTAcknowledgementsViewController 与 PTAcknowledgementDetailViewController 都显式继承 PTBaseViewController。

生成与验证

bash Scripts/pt_acknowledgements_build.sh
bash Scripts/validate_acknowledgements.sh .build/acknowledgements/PTAcknowledgements.json

Build Phase 可以通过 PT_ACK_PACKAGE_RESOLVED、PT_ACK_PODFILE_LOCK、PT_ACK_OVERRIDES 和 DERIVED_FILE_DIR 指定输入输出。生成器只读本地文件,不在 App 运行时扫描工程或访问网络。

Release/CI 应将 --strict 校验作为阻断门禁,并确认 JSON 已复制到正确的 App target bundle。Debug 可以使用 review / unverified 条目辅助开发,但不能把缺失原文当成“没有依赖”。

自定义 UI 与手工条目

调用方可以只导入 PToolsAcknowledgementsCore,将 manifest.entries 交给自己的 PTCollectionView、UITableView 或 SwiftUI 页面;也可以注入 PTInMemoryAcknowledgementsDataSource。手工条目必须提供可公开展示的完整许可证原文,并保持稳定 id、版本和来源。

let entry = PTAcknowledgement(
    id: "vendor.example-sdk",
    name: "Example SDK",
    version: "1.0.0",
    sourceManagers: [.manual],
    licenseExpression: "Commercial",
    licenseTexts: [PTLicenseDocument(fileName: "LICENSE", text: suppliedText)],
    verification: .review
)
let manifest = try PTAcknowledgementsProvider.make(entries: [entry])

平台与并发

Core 的值类型和 actor Repository 可在 Package.swift 声明的 Apple 平台边界中独立使用。UIKit 页面只在有 UIKit 的目标中编译,当前 UI 最低为 iOS 17;macOS、watchOS、visionOS 使用 Core 时不携带 UIKit。页面状态更新在 @MainActor,跨 actor 只传递不可变的 Sendable Manifest/Entry 快照。

安全和合规

许可证文本来自构建期本地输入;模块不上传源码、不保存令牌、不把远程 Markdown 伪装为法律原文。PTAcknowledgements.report.json 供 CI 审核,不应默认打进生产 App。最终许可证义务仍由项目开发者和法务确认。