Prepare Apple App Store distribution (#59)

This commit is contained in:
2026-08-16 17:55:59 +02:00
parent b50e47ab73
commit f894d43eb6
46 changed files with 20694 additions and 166 deletions

View File

@@ -0,0 +1,69 @@
# Apple App Store distribution
Use `distribution/` only as ignored local staging. Never store Apple credentials,
signing material, review credentials, GPG material, application tokens, or
private diagnostics in the repository or release logs.
## Release identity
- iPhone application: `de.rfc1437.ironstorage`
- AutoFill extension: `de.rfc1437.ironstorage.autofill`
- Apple Watch companion: `de.rfc1437.ironstorage.watch`
- Apple Developer team: `MU22FMRGK8`
The submitted archive must embed the Watch application beneath the iPhone
application. An iPhone-only archive is not a releasable IronStorage build.
## Prepare and submit
1. Generate the project and release attribution, then run the release verifier:
```sh
cargo metadata --format-version 1 --filter-platform aarch64-apple-ios \
> /private/tmp/ironstorage-ios-metadata.json
cargo run -p ironstorage-apple-release -- licenses \
/private/tmp/ironstorage-ios-metadata.json \
apple/Resources/App/ThirdPartyLicenses.txt
cargo run -p ironstorage-apple-release -- verify .
```
2. Run the repository gates and build both simulator applications. Validate the
local-first flow with synthetic data: generate or import a GPG key, create
folders and encrypted entries, read TOTP codes, select Watch entries, and
verify the Watch list and selected-code progress display.
3. Create the production archive with normal App Store distribution signing:
```sh
cd apple
xcodegen generate
xcodebuild -project IronStorage.xcodeproj -scheme IronStorage \
-configuration Release -destination 'generic/platform=iOS' \
-archivePath /private/tmp/IronStorage.xcarchive archive
```
4. Inspect the archive before upload. The iPhone, AutoFill, and Watch bundle
identifiers and versions must match the metadata; the Watch app must be
embedded; privacy manifests and license resources must be present; the
archive must use distribution signing and must not contain `get-task-allow`,
simulator artifacts, synthetic demo data, private endpoints, or secrets.
5. Export and upload with the checked-in App Store Connect export options:
```sh
xcodebuild -exportArchive \
-archivePath /private/tmp/IronStorage.xcarchive \
-exportPath /private/tmp/IronStorage-AppStore \
-exportOptionsPlist AppStore/ExportOptions.plist
```
6. In App Store Connect, complete the listing from `metadata.toml`, upload the
reviewed screenshots, answer privacy and encryption questions, provide
local-first review instructions, select the processed build, and submit it
for review. Do not provide a production password store or real credentials.
7. After approval, install the public release from the App Store on the paired
iPhone and Apple Watch. Verify local onboarding, key overwrite confirmation,
local Git history, folders, encrypted entries, Face ID, TOTP, optional HTTPS
pull and push, Watch snapshot delivery, the Watch entry-only list, and the
larger selected code with its validity progress indicator.
8. Verify an App Store update in place. Verify the documented uninstall and
reinstall Keychain lifecycle only with disposable test data; never erase the
paired physical device or its unrelated IronStorage data.