iOS Port β the Wallet App and the SDK
Overviewβ
Milestone 6 delivers the iOS port of the Interstellar wallet technology. It is not only the SDK: the whole wallet app exists on iOS, with the same features, the same flows and the same VCA/pinpad guarantee as on Android.
The port was done in steps, each one a pull request in the wallet-app-internal repository:
| PR | What it delivered |
| #41 | The iOS POC app: the project, the SwiftUI skeleton, the SDK wiring |
| #43 | The deployment target bump |
| #44 | Port of the Android UI/UX: theme, components, navigation, all the screens |
| #46 | Feature parity, step 2: the flows the screens drive (transfers, recovery, airdropsβ¦) |
| #47 | The MoonPay (fiat on/off-ramp) integration |
| #48 | The Reown (WalletConnect) integration |
| #49 | The toolchain alignment (NDK r30, Gradle 9.8, AGP 9.4, Kotlin 2.4.21, API 37, minSdk 24, iOS 17) |
| #50 | The cloud-token recovery fixes: the token lands on disk, the count is instant, the share escape hatch |
| #53 | The iOS SDK published as a Swift package + the TestFlight publishing |
The appβ
The iOS app (iosApp/) is a SwiftUI application with the same tab structure as the Android
one:
| Tab | What it does |
|---|---|
| Portfolio | the balances of the supported coins, the per-coin detail screen, the WalletConnect entry point |
| Send | the transfer flow (recipient, amount, the VCA confirmation) |
| Buy/Sell | the MoonPay fiat on/off-ramp (sandbox) |
| Airdrop | the campaign list + the campaign detail (registration & claim) |
| Backup | the recovery methods (VCA token / NFC) and the cloud-token recovery |
| Settings | the server-reset handling, the account identity, the app settings |
The app is the reference integration of the iOS SDK: it consumes the very same
InterstellarSdk API that is published to third parties β same function names as Android, so a
flow implemented on one platform maps one-to-one onto the other.
The SDKβ
The iOS SDK is the InterstellarSdk Swift package (iosSdk/), published as one ready-to-use
zip (the Swift sources + the two .xcframeworks). A consumer needs nothing but Xcode/SPM:
no Rust, no uniffi, no Kotlin/Native, no linker flags and no "Embed & Sign" phase.
- Full reference: iOS SDK β Overview & Integration Β· API Reference Β· VCA Pinpad Β· Getting Started.
The device keyβ
The iOS device key is a P-256 (secp256r1) ECDSA key stored in the iOS Keychain
(MobileKeychainSigner) β the counterpart of the Android Keystore key.
Contrary to Android, the Keychain key is NOT deleted when the app is uninstalled: a reinstall keeps the same identity and the same root account. On Android the key lives in the Android Keystore, which is wiped together with the app β an uninstall + reinstall gives a brand-new account.
The VCA pinpadβ
The pinpad is rendered by the same Rust renderer as on Android, through the
rendererFFI framework and the TxPinpadScreen SwiftUI view: 12 digit slots + the message bar,
painted with the garbled-circuit pixel stream. The contract is identical on both platforms
(navigateToPinpad β render pendingCircuitsPackage β processPinpadInputs β read
showTxFailed) β cf the iOS pinpad guide.
Running itβ
The app runs in the iOS Simulator (the Rust libraries are compiled for the simulator slice as well) and on real devices through TestFlight β see App Distribution β Android & iOS and the local demo.
When adding a cloud-token recovery, tapping "save to files" can show a white window instead of the file explorer. It is a transient Simulator issue, not a bug of the Interstellar app: Device β Erase All Content and Settings, then reinstall the app.
See alsoβ
- Interstellar SDK β Integration Delivered in Milestone 6 β the SDK itself.
- App Distribution β Android & iOS β how to install the app.
- Local Demo with Docker β run the stack and drive the app.