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/README.md +121 -0
- package/bin/install.js +52 -0
- package/docs/android.md +37 -0
- package/docs/ios.md +112 -0
- package/package.json +10 -0
- package/src/android.yml +125 -0
- package/src/android_keygen.yml +113 -0
- package/src/ios.yml +183 -0
- package/template/icon.png +0 -0
- package/template/setup_guide.txt +1 -0
- package/template/www/index.html +544 -0
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! 🚀
|