appmachine 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/ios.yml ADDED
@@ -0,0 +1,183 @@
1
+ name: AppMachine / iOS
2
+ on:
3
+ push:
4
+ tags: [iosdev, ios]
5
+
6
+ permissions:
7
+ contents: write
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: macos-26
12
+ timeout-minutes: 15
13
+ environment: ${{ github.ref == 'refs/tags/iosdev' && 'Development' || 'Production' }}
14
+ env:
15
+ APP_SERVER_URL: ${{ vars.APP_SERVER_URL }}
16
+ APP_ID: ${{ vars.APP_ID }}
17
+ APP_NAME: ${{ vars.APP_NAME }}
18
+ IOS_CERT_BASE64: ${{ secrets.IOS_CERT_BASE64 }}
19
+ IOS_CERT_PASSWORD: ${{ secrets.IOS_CERT_PASSWORD }}
20
+ IOS_PROFILE_BASE64: ${{ secrets.IOS_PROFILE_BASE64 }}
21
+ IOS_TEAM_ID: ${{ vars.IOS_TEAM_ID }}
22
+
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+
26
+ - name: 🕵️ Preflight
27
+ run: |
28
+ set -euo pipefail
29
+ req() { [ -n "${!1:-}" ] || { echo "❌ Missing: $1" >&2; exit 1; }; }
30
+ req APP_SERVER_URL; req APP_ID; req APP_NAME
31
+ req IOS_TEAM_ID
32
+ req IOS_CERT_BASE64; req IOS_CERT_PASSWORD
33
+ req IOS_PROFILE_BASE64
34
+
35
+ - uses: actions/setup-node@v4
36
+ with: { node-version: lts/* }
37
+
38
+ - name: 🚀 Install & Generate
39
+ run: |
40
+ set -euo pipefail
41
+
42
+ # 1. Install
43
+ [ -f package-lock.json ] && npm ci || npm install
44
+ npm i -D @capacitor/core @capacitor/cli @capacitor/ios @capacitor/assets \
45
+ --no-save --no-package-lock --no-fund --no-audit
46
+
47
+ # 2. Config & WWW
48
+ rm -rf www && mkdir -p www && cp -R appmachine/www/. www/
49
+ rm -f capacitor.config.*
50
+
51
+ node -e '
52
+ const fs = require("fs"), { URL } = require("url");
53
+ const raw = process.env.APP_SERVER_URL;
54
+ try { new URL(raw); } catch { console.error("❌ Invalid URL"); process.exit(1); }
55
+
56
+ const u = new URL(raw.replace(/\/$/, "")), host = u.hostname;
57
+ const cfg = {
58
+ appId: process.env.APP_ID,
59
+ appName: process.env.APP_NAME,
60
+ webDir: "www",
61
+ server: {
62
+ url: u.href,
63
+ cleartext: u.protocol === "http:",
64
+ allowNavigation: [host, "*." + host]
65
+ }
66
+ };
67
+ fs.writeFileSync("capacitor.config.json", JSON.stringify(cfg, null, 2));
68
+ '
69
+
70
+ # 3. Generate (keep ios/ so Package.resolved stays stable)
71
+ if [ -d ios/App ]; then
72
+ echo "✅ iOS project exists (keeping ios/ + Package.resolved)"
73
+ else
74
+ npx --no-install cap add ios
75
+ fi
76
+
77
+ mkdir -p assets
78
+ if [ -f "appmachine/icon.png" ]; then
79
+ echo "✅ Custom icon found"
80
+ for f in logo logo-dark splash splash-dark; do cp "appmachine/icon.png" "assets/$f.png"; done
81
+ npx --no-install capacitor-assets generate --ios --assetPath assets
82
+ fi
83
+
84
+ npx --no-install cap sync ios
85
+
86
+ echo "📂 swiftpm lock (if present):"
87
+ ls -la ios/App/App.xcodeproj/project.xcworkspace/xcshareddata/swiftpm || true
88
+
89
+ - name: 🔐 Configure Signing
90
+ run: |
91
+ set -euo pipefail
92
+
93
+ # 1. Decode Cert (Safer printf)
94
+ printf "%s" "$IOS_CERT_BASE64" | base64 -D > cert.p12
95
+
96
+ # 2. Setup Keychain with Memory-Only Password
97
+ KC_PATH="$RUNNER_TEMP/app-signing.keychain-db"
98
+ KC_PW="$(uuidgen)"
99
+
100
+ security create-keychain -p "$KC_PW" "$KC_PATH"
101
+ security set-keychain-settings -lut 21600 "$KC_PATH"
102
+ security unlock-keychain -p "$KC_PW" "$KC_PATH"
103
+ security list-keychains -d user -s "$KC_PATH" login.keychain-db
104
+ security default-keychain -d user -s "$KC_PATH"
105
+
106
+ security import cert.p12 -k "$KC_PATH" -P "$IOS_CERT_PASSWORD" -A
107
+
108
+ # FIX: Added codesign: to partition list
109
+ security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KC_PW" "$KC_PATH"
110
+
111
+ security find-identity -v -p codesigning "$KC_PATH" || true
112
+
113
+ # 3. Profile (Safer printf)
114
+ printf "%s" "$IOS_PROFILE_BASE64" | base64 -D > profile.mobileprovision
115
+ security cms -D -i profile.mobileprovision > profile.plist
116
+ UUID=$(/usr/libexec/PlistBuddy -c "Print UUID" profile.plist)
117
+ NAME=$(/usr/libexec/PlistBuddy -c "Print Name" profile.plist)
118
+ echo "✅ Profile: $NAME ($UUID)"
119
+
120
+ mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
121
+ cp profile.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/"$UUID".mobileprovision
122
+
123
+ # 4. Generate Export Options (Scoped to ios/App)
124
+ cat > ios/App/exportOptions.plist <<EOF
125
+ <?xml version="1.0" encoding="UTF-8"?>
126
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
127
+ <plist version="1.0">
128
+ <dict>
129
+ <key>method</key><string>app-store</string>
130
+ <key>teamID</key><string>${IOS_TEAM_ID}</string>
131
+ <key>signingStyle</key><string>manual</string>
132
+ <key>provisioningProfiles</key>
133
+ <dict>
134
+ <key>${APP_ID}</key><string>${NAME}</string>
135
+ </dict>
136
+ </dict>
137
+ </plist>
138
+ EOF
139
+
140
+ echo "PROFILE_NAME=$NAME" >> $GITHUB_ENV
141
+
142
+ - name: 📦 Build & Archive
143
+ run: |
144
+ set -euo pipefail
145
+
146
+ echo "📂 ios/App contents:"
147
+ ls -la ios/App
148
+
149
+ # 1. Bump Build Number
150
+ BUILD_NUM="${{ github.run_number }}"
151
+ echo "🔢 Updating CFBundleVersion to: $BUILD_NUM"
152
+ /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUM" ios/App/App/Info.plist \
153
+ || /usr/libexec/PlistBuddy -c "Add :CFBundleVersion string $BUILD_NUM" ios/App/App/Info.plist
154
+
155
+ # 2. Set Non-Exempt Encryption to NO
156
+ echo "🚫 Setting ITSAppUsesNonExemptEncryption = NO"
157
+ /usr/libexec/PlistBuddy -c "Set :ITSAppUsesNonExemptEncryption false" ios/App/App/Info.plist \
158
+ || /usr/libexec/PlistBuddy -c "Add :ITSAppUsesNonExemptEncryption bool false" ios/App/App/Info.plist
159
+
160
+ echo "🔧 Resolve SwiftPM deps (use Package.resolved)"
161
+ xcodebuild -resolvePackageDependencies \
162
+ -project ios/App/App.xcodeproj \
163
+ -scheme App
164
+
165
+ xcodebuild -project ios/App/App.xcodeproj -scheme App \
166
+ -archivePath ios/App/App.xcarchive archive \
167
+ -configuration Release \
168
+ -destination "generic/platform=iOS" \
169
+ CODE_SIGN_IDENTITY="Apple Distribution" \
170
+ CODE_SIGN_STYLE=Manual \
171
+ DEVELOPMENT_TEAM="$IOS_TEAM_ID" \
172
+ PROVISIONING_PROFILE_SPECIFIER="$PROFILE_NAME"
173
+
174
+ xcodebuild -exportArchive -archivePath ios/App/App.xcarchive \
175
+ -exportOptionsPlist ios/App/exportOptions.plist \
176
+ -exportPath output
177
+
178
+ - name: 📤 Upload Artifact
179
+ uses: actions/upload-artifact@v4
180
+ with:
181
+ name: ios-build
182
+ path: output/*.ipa
183
+ if-no-files-found: error
Binary file
@@ -0,0 +1 @@
1
+ Workflows have been added to your .github/ folder! 🚀