apple build exports each build into build/ios/export/<version>-<build>/ (cleaned first), runs xcodebuild with Apple's tool folders first on PATH (Homebrew rsync 3.x broke Xcode's IPA step: exportArchive Copy failed), shows the IDEDistribution log's real error lines and exits non-zero on any export failure; apple upload fails with exit 1 when the IPA's build number is already on App Store Connect (stale IPA after a failed build), --allow-existing re-checks, --build N picks that build's IPA, release and beta flows use both; doctor flags a non-Apple rsync first on PATH; desktop publish calls rsync by absolute path without --chmod (publishSteps); site download notice per OS (macOS signed and notarized, Windows unsigned for now, Linux unsigned); game-report credential tests hermetic against a machine default profile (pitfalls 53, 54)

This commit is contained in:
CRTkafa 2026-10-13 09:45:48 +08:00
parent 8fd4ac741e
commit 0e4f579899
20 changed files with 338 additions and 48 deletions

View file

@ -319,13 +319,20 @@
if (k === here) { b.classList.add('is-here', 'btn-primary'); b.classList.remove('btn-ghost'); }
}
const unsigned = keys.filter(k => !d[k].codeSigned && (k === 'macos-universal-dmg' || k === 'windows-x86_64-nsis'));
if (unsigned.length) {
{
// signing per OS, from latest.json's codeSigned (macOS is Developer ID signed and notarized)
const n = el('div', { class: 'dl-notice', role: 'note' });
n.appendChild(el('b', null, 'Unsigned preview. '));
n.appendChild(document.createTextNode('This early build is not yet signed by Apple or Microsoft, so your system asks once before opening it. Check the SHA-256 under "Checksums and signatures" first.'));
n.appendChild(el('b', null, 'Signing. '));
n.appendChild(document.createTextNode(unsigned.length ? 'Check the SHA-256 under "Checksums and signatures" before opening an unsigned build.' : 'The SHA-256 of every file is under "Checksums and signatures".'));
const ol = el('ol');
if (unsigned.includes('macos-universal-dmg')) ol.appendChild(el('li', null, 'macOS: drag storebound to Applications and open it; when macOS refuses, open System Settings > Privacy & Security and choose Open Anyway (once).'));
if (unsigned.includes('windows-x86_64-nsis')) ol.appendChild(el('li', null, 'Windows: when SmartScreen shows "Windows protected your PC", choose More info > Run anyway.'));
const has = k => keys.includes(k);
if (has('macos-universal-dmg')) ol.appendChild(el('li', null, unsigned.includes('macos-universal-dmg')
? 'macOS: this build is not signed; when macOS refuses to open it, open System Settings > Privacy & Security and choose Open Anyway (once).'
: 'macOS: signed with an Apple Developer ID and notarized by Apple; it opens without a warning.'));
if (has('windows-x86_64-nsis')) ol.appendChild(el('li', null, unsigned.includes('windows-x86_64-nsis')
? 'Windows: not signed yet, so SmartScreen may warn ("Windows protected your PC"): choose More info › Run anyway.'
: 'Windows: signed; it installs without a SmartScreen warning.'));
if (keys.some(k => k.startsWith('linux'))) ol.appendChild(el('li', null, 'Linux: AppImage and .deb are not signed (Linux has no OS signing check); compare the SHA-256.'));
n.appendChild(ol);
notice.appendChild(n);
}