用途:帮助在 CI 和本地可靠地构建、测试并交付 Apple 平台(macOS/iOS)原生 Swift/SwiftUI 应用,规避 Xcode 项目特有的构建与测试失败。核心原则是信任 xcodebuild,而非 IDE、swift build 或空跑的 make test。
主要能力与用法: CI 无法签名时改用无签名构建:xcodebuild build CODE_SIGNING_ALLOWED=NO;测试用 xcodebuild test CODE_SIGNING_ALLOWED=NO CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY=。仅用临时签名在声明 entitlements(CloudKit、App Groups、Keychain 共享)时仍会因校验失败。通过 Makefile 的 XCODE_FLAGS 统一本地与 CI。固定运行器与 Xcode 版本(如 macos-26、Xcode_26.2.app),避免默认 runner 拒绝 Swift 6.2 并发语义。
新增 .swift 文件必须写入 project.pbxproj 的三处:PBXFileReference、目标的 PBXSourcesBuildPhase 和 group,否则报 Cannot find 'NewType' in scope;添加后应构建 app target 而非仅预览。
区分 swift test 与 xcodebuild test:Package.swift 目标与 app target 是不同模块,@testable import 只可见 SwiftPM 目标内符号;仅 app 内类型(SwiftData @Model、SwiftUI 视图等)需通过 xcodebuild test 托管 XCTest 目标测试。“no testable scheme”表示缺 XCTest 目标、TEST_HOST 或共享 scheme,应通过日志中的测试数量确认测试真实运行。
其他要点:单目标项目中的 SourceKit 报错多为误报,以真实构建为准;被 gitignore 的 base xcconfig 会导致干净检出失败,需保留 .example 并复制;令牌密钥存 Keychain 而非 UserDefaults,OAuth 需 state 与 PKCE,URL 值用 base64url;CloudKit 同步的 SwiftData 属性必须可选或带默认值,勿改为非可选;Codable 内嵌值类型需做保存版本迁移,新增非可选字段需显式处理 decodeIfPresent;固定格式 DateFormatter 需设 en_US_POSIX locale 与时区;种子需包含稳定 run 身份加 step,避免 hashValue;嵌套随机决策统一走种子生成器;获取失败不得静默替换为示例数据。
适用场景:Apple 平台应用的 CI 流水线、测试策略设计、数据持久化与同步、安全凭据管理及确定性逻辑。
限制:资料未提供具体版本兼容范围、性能指标或收费信息。