iOS packages
iOS packaging produces an .ipa through Apple tooling. The important release inputs are bundle id, marketing version, build number, team id, entitlements, provisioning profile, signing identity, generated host files, icons, launch assets, privacy strings, and App Store Connect release content.
Realistic package configuration
[app]
name = "Acme Notes"
app_id = "com.acme.notes"
version = "1.4.0"
build = 37
[targets.ios]
enabled = true
[package.ios]
bundle_id = "com.acme.notes"
marketing_version = "1.4.0"
build_number = "37"
team_id = "ABCDE12345"
entitlements = "platforms/ios/AcmeNotes.entitlements"
provisioning_profile = "profiles/ios/AcmeNotes.mobileprovision"
signing_identity = "Apple Distribution"
| |
|---|
| iOS bundle identifier used by signing, generated host metadata, and App Store Connect. Usually matches [app].app_id. |
| User-visible iOS version. |
| Provider-facing build number. It must be incremented for new uploads. |
| Apple Developer Team ID used by signing and readiness checks. |
| iOS entitlements plist passed into signing. |
| Mobile provisioning profile for the release build. |
| Release signing identity. |
Keep Apple API keys, private signing material, and passwords outside fission.toml.
App Store Connect configuration
Publishing to TestFlight or App Review uses provider credentials and release content in addition to the IPA.
[distribution.app_store]
bundle_id = "com.acme.notes"
issuer_id = "00000000-0000-0000-0000-000000000000"
key_id = "ABC123DEFG"
api_key_env = "APP_STORE_CONNECT_API_KEY"
api_key_base64_env = "APP_STORE_CONNECT_API_KEY_BASE64"
default_track = "testflight"
The API key value should come from the named environment variable or CI secret. Use base64 for CI when that is easier to store safely.
Native iOS additions
Use native modules when the generated iOS host needs Swift source directories, linked frameworks, or Swift package dependencies.
[[native.modules]]
name = "scanner-sdk"
[native.modules.ios]
source_dirs = ["platforms/ios/Scanner"]
linked_frameworks = ["AVFoundation.framework", "CoreImage.framework"]
[[native.modules.ios.swift_packages]]
url = "https://github.com/example/scanner-ios"
product = "ScannerSDK"
from = "1.2.3"
Native modules supply native build inputs. Keep user-facing privacy strings, usage descriptions, and product policy in the visible target/capability configuration so reviewers and teammates can audit why the app needs each capability.
Version and build checks
When provider credentials are available, check App Store state before upload:
fission release-config version-state \
--project-dir . \
--provider app-store \
--target ios \
--json
If the build number is already used, update release configuration and rebuild the IPA. Do not upload a known-bad artifact.
Readiness and packaging loop
fission readiness package --project-dir . --target ios --format ipa
fission package --project-dir . --target ios --format ipa --release
The output contains the .ipa and artifact-manifest.json. Publish the manifest so the release command has the artifact hash, version, build number, package identity, and secondary files in one immutable handoff.
Verify on iOS
Before App Store submission:
Run on simulator for layout, safe areas, keyboard, navigation, and common device sizes.
Run on a real device for camera, Bluetooth, file, push, health, location, or other hardware/platform capabilities.
Verify icons, launch screen, permission prompts, deep links, and any native module behavior.
Validate release notes, screenshots, privacy declarations, review notes, and TestFlight tester targeting.