70 lines
3.0 KiB
JavaScript
70 lines
3.0 KiB
JavaScript
// Builds the iOS app for the Apple-Silicon simulator.
|
|||
|
|
//
|
||
|
|
// Why this is special: the barcode scanner (`@capacitor-mlkit/barcode-scanning` →
|
||
|
|
// GoogleMLKit) ships only device-arm64 + simulator-x86_64 slices — there is NO
|
||
|
|
// arm64-simulator slice. CocoaPods therefore adds `EXCLUDED_ARCHS[sdk=iphonesimulator*] =
|
||
|
|
// arm64`, so a normal build produces an x86_64-only binary that can't install on an
|
||
|
|
// arm64-only iOS 26+ simulator ("does not contain code for ... arm64").
|
||
|
|
//
|
||
|
|
// QR scanning needs a camera, which the simulator doesn't have, so dropping the scanner for
|
||
|
|
// simulator builds loses nothing: this script temporarily removes the MLKit pod, builds an
|
||
|
|
// arm64 simulator binary, then restores the Podfile + Pods so device/TestFlight builds keep
|
||
|
|
// the scanner. The JS side already degrades cleanly when the native plugin is absent
|
||
|
|
// (mobileQrScan: getScannerPlugin() → null → isQrScanSupported() false).
|
||
|
|
|
||
|
|
import { spawnSync } from 'node:child_process';
|
||
|
|
import { readFileSync, writeFileSync } from 'node:fs';
|
||
|
|
import { dirname, join } from 'node:path';
|
||
|
|
import { fileURLToPath } from 'node:url';
|
||
|
|
|
||
|
|
const mobileRoot = join(dirname(fileURLToPath(import.meta.url)), '..');
|
||
|
|
const iosAppDir = join(mobileRoot, 'ios', 'App');
|
||
|
|
const podfilePath = join(iosAppDir, 'Podfile');
|
||
|
|
|
||
|
|
const run = (command, args, cwd = mobileRoot) => {
|
||
|
|
const result = spawnSync(command, args, { stdio: 'inherit', cwd, env: process.env });
|
||
|
|
if (result.status !== 0) {
|
||
|
|
throw new Error(`${command} ${args.join(' ')} exited with ${result.status ?? result.signal}`);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
// 1. Build the web bundle and copy it into the iOS project (no pod regen — `copy`, not `sync`).
|
||
|
|
run('bun', ['run', 'build']);
|
||
|
|
run('cap', ['copy', 'ios']);
|
||
|
|
|
||
|
|
// 2. Strip the MLKit barcode-scanning pod, then reinstall pods without it.
|
||
|
|
const originalPodfile = readFileSync(podfilePath, 'utf8');
|
||
|
|
const strippedPodfile = originalPodfile
|
||
|
|
.split('\n')
|
||
|
|
.filter((line) => !line.includes('CapacitorMlkitBarcodeScanning'))
|
||
|
|
.join('\n');
|
||
|
|
|
||
|
|
if (strippedPodfile === originalPodfile) {
|
||
|
|
console.warn('[ios-sim-build] CapacitorMlkitBarcodeScanning not found in Podfile — building as-is.');
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
writeFileSync(podfilePath, strippedPodfile);
|
||
|
|
run('pod', ['install'], iosAppDir);
|
||
|
|
|
||
|
|
// 3. Build for the simulator. With MLKit gone the arm64 simulator slice builds cleanly.
|
||
|
|
run('xcodebuild', [
|
||
|
|
'-workspace', 'ios/App/App.xcworkspace',
|
||
|
|
'-scheme', 'App',
|
||
|
|
'-configuration', 'Debug',
|
||
|
|
'-sdk', 'iphonesimulator',
|
||
|
|
'-destination', 'generic/platform=iOS Simulator',
|
||
|
|
'CODE_SIGNING_ALLOWED=NO',
|
||
|
|
'build',
|
||
|
|
]);
|
||
|
|
} finally {
|
||
|
|
// 4. Always restore the Podfile + Pods so device/TestFlight builds keep the scanner. Pods/
|
||
|
|
// and Podfile.lock return to their original state (a no-op for git once this completes).
|
||
|
|
if (strippedPodfile !== originalPodfile) {
|
||
|
|
writeFileSync(podfilePath, originalPodfile);
|
||
|
|
run('pod', ['install'], iosAppDir);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log('[ios-sim-build] Simulator build complete. Run `bun run sim:run` to install + launch.');
|