Release 1.0.0 !51

merged merged by cmc on 2026-10-19 06:46 UTC · krz/moonrise:release-1.0.0 into main

6 files changed, +95 −15

Layout: unified · split

App/README.org +14
@@ -15,3 +15,17 @@ subsystem =sh.krz.moonrise=.
1515Backend: both configurations use https://moonrise-server.audit-labs.workers.dev
1616(=MOONRISE_API_URL= in =project.yml=). For a local Worker, set it to
1717=http://localhost:8787= and regenerate.
18
19* Release
20
21#+begin_src sh
22scripts/release-ios.sh
23#+end_src
24
25Run from a clean =main=. It regenerates the project, archives the iPhone
26app with its widgets and the Watch app, and uploads it to App Store
27Connect, signed through the Apple ID in Xcode. The version is
28=MARKETING_VERSION= in =project.yml=; the build number is
29=git rev-list --count HEAD=, so each build maps to a commit.
30=MOONRISE_PUBLISH=0= exports the =.ipa= to =.build/ios-release= without
31uploading. The visionOS app is a separate product and is not uploaded.
App/Sources/InAppBrowser.swift −1
@@ -9,7 +9,6 @@ enum InAppBrowser {
99 static let action = OpenURLAction { url in
1010 guard url.scheme == "https" || url.scheme == "http", let top = topViewController() else { return .systemAction }
1111 let safari = SFSafariViewController(url: url)
12 safari.preferredControlTintColor = UIColor(red: 0.88, green: 0.24, blue: 0.19, alpha: 1)
1312 safari.dismissButtonStyle = .done
1413 top.present(safari, animated: true)
1514 return .handled
App/Watch/Widgets-Info.plist +2 −2
@@ -17,9 +17,9 @@
1717 <key>CFBundlePackageType</key>
1818 <string>XPC!</string>
1919 <key>CFBundleShortVersionString</key>
20 <string>1.0</string>
20 <string>$(MARKETING_VERSION)</string>
2121 <key>CFBundleVersion</key>
22 <string>1</string>
22 <string>$(CURRENT_PROJECT_VERSION)</string>
2323 <key>NSExtension</key>
2424 <dict>
2525 <key>NSExtensionPointIdentifier</key>
App/Widgets/Info.plist +2 −2
@@ -17,9 +17,9 @@
1717 <key>CFBundlePackageType</key>
1818 <string>XPC!</string>
1919 <key>CFBundleShortVersionString</key>
20 <string>1.0</string>
20 <string>$(MARKETING_VERSION)</string>
2121 <key>CFBundleVersion</key>
22 <string>1</string>
22 <string>$(CURRENT_PROJECT_VERSION)</string>
2323 <key>NSExtension</key>
2424 <dict>
2525 <key>NSExtensionPointIdentifier</key>
App/project.yml +14 −10
@@ -54,8 +54,8 @@ targets:
5454 CODE_SIGN_STYLE: Automatic
5555 SWIFT_VERSION: "6.0"
5656 TARGETED_DEVICE_FAMILY: "1,2"
57 MARKETING_VERSION: "1.0"
58 CURRENT_PROJECT_VERSION: "1"
57 MARKETING_VERSION: "1.0.0"
58 CURRENT_PROJECT_VERSION: "52"
5959 GENERATE_INFOPLIST_FILE: YES
6060 INFOPLIST_KEY_CFBundleDisplayName: Moonrise
6161 INFOPLIST_KEY_NSSupportsLiveActivities: YES
@@ -83,6 +83,8 @@ targets:
8383 path: Widgets/Info.plist
8484 properties:
8585 CFBundleDisplayName: Moonrise
86 CFBundleShortVersionString: $(MARKETING_VERSION)
87 CFBundleVersion: $(CURRENT_PROJECT_VERSION)
8688 NSWidgetWantsLocation: true
8789 NSExtension:
8890 NSExtensionPointIdentifier: com.apple.widgetkit-extension
@@ -93,8 +95,8 @@ targets:
9395 CODE_SIGN_STYLE: Automatic
9496 SWIFT_VERSION: "6.0"
9597 TARGETED_DEVICE_FAMILY: "1,2"
96 MARKETING_VERSION: "1.0"
97 CURRENT_PROJECT_VERSION: "1"
98 MARKETING_VERSION: "1.0.0"
99 CURRENT_PROJECT_VERSION: "52"
98100 MoonriseWatch:
99101 type: application
100102 platform: watchOS
@@ -111,8 +113,8 @@ targets:
111113 DEVELOPMENT_TEAM: ZCNAX3VL9D
112114 CODE_SIGN_STYLE: Automatic
113115 SWIFT_VERSION: "6.0"
114 MARKETING_VERSION: "1.0"
115 CURRENT_PROJECT_VERSION: "1"
116 MARKETING_VERSION: "1.0.0"
117 CURRENT_PROJECT_VERSION: "52"
116118 GENERATE_INFOPLIST_FILE: YES
117119 INFOPLIST_KEY_CFBundleDisplayName: Moonrise
118120 INFOPLIST_KEY_WKCompanionAppBundleIdentifier: sh.krz.moonrise
@@ -135,6 +137,8 @@ targets:
135137 path: Watch/Widgets-Info.plist
136138 properties:
137139 CFBundleDisplayName: Moonrise
140 CFBundleShortVersionString: $(MARKETING_VERSION)
141 CFBundleVersion: $(CURRENT_PROJECT_VERSION)
138142 NSWidgetWantsLocation: true
139143 NSExtension:
140144 NSExtensionPointIdentifier: com.apple.widgetkit-extension
@@ -144,8 +148,8 @@ targets:
144148 DEVELOPMENT_TEAM: ZCNAX3VL9D
145149 CODE_SIGN_STYLE: Automatic
146150 SWIFT_VERSION: "6.0"
147 MARKETING_VERSION: "1.0"
148 CURRENT_PROJECT_VERSION: "1"
151 MARKETING_VERSION: "1.0.0"
152 CURRENT_PROJECT_VERSION: "52"
149153 MoonriseVision:
150154 type: application
151155 platform: visionOS
@@ -169,8 +173,8 @@ targets:
169173 DEVELOPMENT_TEAM: ZCNAX3VL9D
170174 CODE_SIGN_STYLE: Automatic
171175 SWIFT_VERSION: "6.0"
172 MARKETING_VERSION: "1.0"
173 CURRENT_PROJECT_VERSION: "1"
176 MARKETING_VERSION: "1.0.0"
177 CURRENT_PROJECT_VERSION: "52"
174178 GENERATE_INFOPLIST_FILE: YES
175179 INFOPLIST_KEY_CFBundleDisplayName: Moonrise
176180 INFOPLIST_KEY_UIApplicationSceneManifest_Generation: YES
scripts/release-ios.sh added +63
@@ -0,0 +1,63 @@
1#!/bin/sh
2# Archives the iOS app (with its widgets and the watch app) and uploads it to App Store Connect,
3# signed automatically with the team's distribution certificate through the Apple ID signed in
4# to Xcode. The version is MARKETING_VERSION in App/project.yml; the build number is the commit
5# count on main, so every upload can be traced to a commit. The upload then shows in TestFlight
6# and can be picked for an App Store submission.
7# Usage: scripts/release-ios.sh
8# MOONRISE_PUBLISH 0 archives and exports the .ipa to .build/ios-release without uploading
9set -eu
10
11cd "$(dirname "$0")/.."
12publish="${MOONRISE_PUBLISH:-1}"
13team=ZCNAX3VL9D
14
15if [ "$publish" != 0 ]; then
16 [ -z "$(git status --porcelain)" ] || { echo "The working tree has changes." >&2; exit 1; }
17 [ "$(git branch --show-current)" = main ] || { echo "Release from main." >&2; exit 1; }
18fi
19
20version="$(sed -n 's/.*MARKETING_VERSION: "\(.*\)"/\1/p' App/project.yml | sort -u)"
21[ "$(printf '%s\n' "$version" | wc -l | tr -d ' ')" = 1 ] || { echo "The targets' MARKETING_VERSION differ: $version" >&2; exit 1; }
22build="$(git rev-list --count HEAD)"
23
24command -v xcodegen >/dev/null || { echo "Install XcodeGen: brew install xcodegen" >&2; exit 1; }
25(cd App && xcodegen generate --quiet)
26
27out=.build/ios-release
28rm -rf "${out:?}"
29mkdir -p "$out"
30archive="$out/moonrise.xcarchive"
31xcodebuild archive -project App/Moonrise.xcodeproj -scheme Moonrise -configuration Release \
32 -destination 'generic/platform=iOS' -archivePath "$archive" -allowProvisioningUpdates -quiet \
33 MARKETING_VERSION="$version" CURRENT_PROJECT_VERSION="$build"
34
35if [ "$publish" = 0 ]; then destination=export; else destination=upload; fi
36cat > "$out/ExportOptions.plist" <<PLIST
37<?xml version="1.0" encoding="UTF-8"?>
38<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
39<plist version="1.0">
40<dict>
41 <key>method</key>
42 <string>app-store-connect</string>
43 <key>destination</key>
44 <string>$destination</string>
45 <key>teamID</key>
46 <string>$team</string>
47 <key>signingStyle</key>
48 <string>automatic</string>
49 <key>manageAppVersionAndBuildNumber</key>
50 <false/>
51 <key>uploadSymbols</key>
52 <true/>
53</dict>
54</plist>
55PLIST
56xcodebuild -exportArchive -archivePath "$archive" -exportOptionsPlist "$out/ExportOptions.plist" \
57 -exportPath "$out/export" -allowProvisioningUpdates -quiet
58
59if [ "$publish" = 0 ]; then
60 echo "Exported $(ls "$out"/export/*.ipa): $version ($build), not uploaded"
61else
62 echo "Uploaded Moonrise $version ($build) to App Store Connect; it shows in TestFlight once processed"
63fi