Skip to main content

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:

PRWhat it delivered
#41The iOS POC app: the project, the SwiftUI skeleton, the SDK wiring
#43The deployment target bump
#44Port of the Android UI/UX: theme, components, navigation, all the screens
#46Feature parity, step 2: the flows the screens drive (transfers, recovery, airdrops…)
#47The MoonPay (fiat on/off-ramp) integration
#48The Reown (WalletConnect) integration
#49The toolchain alignment (NDK r30, Gradle 9.8, AGP 9.4, Kotlin 2.4.21, API 37, minSdk 24, iOS 17)
#50The cloud-token recovery fixes: the token lands on disk, the count is instant, the share escape hatch
#53The 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:

TabWhat it does
Portfoliothe balances of the supported coins, the per-coin detail screen, the WalletConnect entry point
Sendthe transfer flow (recipient, amount, the VCA confirmation)
Buy/Sellthe MoonPay fiat on/off-ramp (sandbox)
Airdropthe campaign list + the campaign detail (registration & claim)
Backupthe recovery methods (VCA token / NFC) and the cloud-token recovery
Settingsthe server-reset handling, the account identity, the app settings
Same guarantees, same names

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.

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.

Not the same as Android

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.

Known issue (transient, Simulator only)

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​