Workouts 2.0: re-base persistence on iCloud Drive documents
Replace Core Data + NSPersistentCloudKitContainer + App-Group store + WatchConnectivity dictionary sync with the QuickRabbit iCloud-documents architecture: - iCloud Drive JSON documents are the sole source of truth (one file per aggregate: Splits/<ULID>.json, Workouts/YYYY/MM/<ULID>.json), with a rebuildable SwiftData cache populated only by an NSMetadataQuery observer and a connect-time reconcile. Soft-delete tombstones; hard iCloud gate. - Shared model layer (ULID, Codable *Documents + stateless mappers, @Model cache entities, SwiftData container) compiled into both targets. - New iPhone<->Watch bridge over WatchConnectivity keyed by ULIDs; the phone is the sole writer of iCloud Drive, the watch round-trips documents. - AppServices DI + iCloud-required root gate; Swift 6 strict concurrency. - Starter splits generated on demand from the bundled YAML catalogs. - Migrate to XcodeGen (project.yml), iOS 26 / watchOS 26; CloudDocuments entitlement (drop CloudKit/App Group/aps-environment). - Duration stored as Int seconds (was a Date epoch hack); fix workout end-on-create, undismissable delete dialog, toolbar-hiding nav stacks, and the Settings placeholder. - Add README/CHANGELOG/LICENSE, .gitignore, refreshed REQUIREMENTS, and the Scripts/ TestFlight pipeline (release.sh + ASC API scripts). MARKETING_VERSION 2.0.
This commit is contained in:
+82
@@ -0,0 +1,82 @@
|
||||
name: Workouts
|
||||
options:
|
||||
bundleIdPrefix: dev.rzen.indie
|
||||
deploymentTarget:
|
||||
iOS: "26.0"
|
||||
watchOS: "26.0"
|
||||
xcodeVersion: "26.0"
|
||||
defaultConfig: Debug
|
||||
|
||||
settings:
|
||||
base:
|
||||
SWIFT_VERSION: "6.0"
|
||||
DEVELOPMENT_TEAM: ${APPLE_TEAM_ID}
|
||||
MARKETING_VERSION: "2.0"
|
||||
CURRENT_PROJECT_VERSION: "1"
|
||||
ENABLE_USER_SCRIPT_SANDBOXING: "NO"
|
||||
|
||||
packages:
|
||||
IndieAbout:
|
||||
url: https://git.rzen.dev/rzen/indie-about.git
|
||||
from: "0.1.0"
|
||||
Yams:
|
||||
url: https://github.com/jpsim/Yams
|
||||
from: "6.0.0"
|
||||
|
||||
targets:
|
||||
# ---- iOS app (owns iCloud Drive sync; embeds the watch app) ----------------
|
||||
Workouts:
|
||||
type: application
|
||||
platform: iOS
|
||||
sources:
|
||||
- path: Shared
|
||||
- path: Workouts
|
||||
excludes:
|
||||
- "Resources/Info-*.plist"
|
||||
- "Resources/*.entitlements"
|
||||
- path: CHANGELOG.md
|
||||
buildPhase: resources
|
||||
type: file
|
||||
- path: README.md
|
||||
buildPhase: resources
|
||||
type: file
|
||||
- path: LICENSE.md
|
||||
buildPhase: resources
|
||||
type: file
|
||||
dependencies:
|
||||
- package: IndieAbout
|
||||
- package: Yams
|
||||
- target: Workouts Watch App
|
||||
settings:
|
||||
base:
|
||||
PRODUCT_BUNDLE_IDENTIFIER: dev.rzen.indie.Workouts
|
||||
INFOPLIST_FILE: Workouts/Resources/Info-iOS.plist
|
||||
CODE_SIGN_ENTITLEMENTS: Workouts/Resources/Workouts-iOS.entitlements
|
||||
GENERATE_INFOPLIST_FILE: false
|
||||
SWIFT_STRICT_CONCURRENCY: complete
|
||||
IPHONEOS_DEPLOYMENT_TARGET: "26.0"
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME: AccentColor
|
||||
TARGETED_DEVICE_FAMILY: "1,2"
|
||||
DEVELOPMENT_ASSET_PATHS: "\"Workouts/Preview Content\""
|
||||
|
||||
# ---- watchOS app (no iCloud; syncs through the phone via WatchConnectivity) -
|
||||
Workouts Watch App:
|
||||
type: application
|
||||
platform: watchOS
|
||||
sources:
|
||||
- path: Shared
|
||||
- path: Workouts Watch App
|
||||
excludes:
|
||||
- "Resources/Info-*.plist"
|
||||
settings:
|
||||
base:
|
||||
PRODUCT_BUNDLE_IDENTIFIER: dev.rzen.indie.Workouts.watchkitapp
|
||||
INFOPLIST_FILE: "Workouts Watch App/Resources/Info-watchOS.plist"
|
||||
GENERATE_INFOPLIST_FILE: false
|
||||
SWIFT_STRICT_CONCURRENCY: complete
|
||||
WATCHOS_DEPLOYMENT_TARGET: "26.0"
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME: AccentColor
|
||||
TARGETED_DEVICE_FAMILY: "4"
|
||||
DEVELOPMENT_ASSET_PATHS: "\"Workouts Watch App/Preview Content\""
|
||||
Reference in New Issue
Block a user