80 lines
3.7 KiB
Markdown
80 lines
3.7 KiB
Markdown
# 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`
|
|
- Apple Watch companion: `de.rfc1437.ironstorage.watch`
|
|
- Apple Watch compatibility: watchOS 26; the archive carries Apple's required
|
|
arm64 and arm64_32 slices
|
|
- 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
|
|
rustup toolchain install nightly --component rust-src
|
|
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 \
|
|
-allowProvisioningUpdates archive
|
|
```
|
|
|
|
4. Inspect the archive before upload. The iPhone 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
|
|
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Xcode.app/Contents/Developer/usr/bin \
|
|
xcodebuild -exportArchive \
|
|
-archivePath /private/tmp/IronStorage.xcarchive \
|
|
-exportPath /private/tmp/IronStorage-AppStore \
|
|
-exportOptionsPlist AppStore/ExportOptions.plist \
|
|
-allowProvisioningUpdates
|
|
```
|
|
|
|
Keep this restricted `PATH`: Xcode's system `rsync` otherwise starts a
|
|
Homebrew `rsync` server, which interprets `-E` differently and fails with
|
|
`exportArchive Copy failed` and `--extended-attributes: unknown option`.
|
|
|
|
6. In App Store Connect, complete the listing from `metadata.toml`, upload the
|
|
reviewed required-size iPhone screenshots and Watch 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.
|