iOS platform
platform/ios hosts the iOS app: the XcodeGen
project, the Objective-C bridges that build.rs compiles into the Rust
binary, and the Xcode build phase that runs Cargo. src/platform/ios.rs is
the application side of the host contract in
platform/README.md.
Releases include an unsigned IPA that people sideload with their own Apple ID; docs/install.md explains how.
Building
On a Mac with Xcode:
rustup target add aarch64-apple-ios aarch64-apple-ios-sim
brew install xcodegen
cd platform/ios
xcodegen generate
open FlectarMail.xcodeproj
Choose a simulator, or your team under Signing & Capabilities to run on a
device. The Build Rust application phase builds flectar-mail with Cargo
for each architecture Xcode asks for and embeds PDFium as a framework.
scripts/package-ios.sh target/ios builds what releases publish: an unsigned
archive packaged as target/ios/flectar-mail-ios-arm64.ipa, stamped with the
Cargo.toml version. CFBundleShortVersionString takes only numbers, so
prereleases share it, and CFBundleVersion follows the Android version
sequence (0.1.0-alpha.8 is build 1000008), which AltStore and SideStore
compare to offer updates.
Accounts and sign-in
Account secrets live in the Keychain, readable once the device has been
unlocked after starting up and never restored onto another device
(src/platform/keychain.rs).
Gmail and Outlook sign in through ASWebAuthenticationSession, which shows
the provider's page in a system sheet and hands its redirect back to the app
(src/platform/web_authentication.rs). The providers need:
- Google gives every platform its own OAuth client. In the Google Cloud
project of the desktop client, create an OAuth client of type iOS for
the bundle ID
com.flectar.mailand store its ID as theFLECTAR_GOOGLE_IOS_CLIENT_IDrepository secret. The client has no secret and redirects to its reversed client ID,com.googleusercontent.apps.<id>:/oauth2redirect. - Microsoft registrations serve several platforms, so iOS reuses the one
Android uses. Add the iOS / macOS platform for the bundle ID
com.flectar.mailto it, which registers the redirectmsauth.com.flectar.mail://auth. The iOS job builds withFLECTAR_MICROSOFT_ANDROID_CLIENT_ID.
Local builds read FLECTAR_GOOGLE_IOS_CLIENT_ID and
FLECTAR_MICROSOFT_IOS_CLIENT_ID from the environment. Without them, people
can enter their own iOS registrations in Sign-in settings. Sideloading
tools may change the bundle ID when they sign the app, which neither redirect
depends on.
Releases and the AltStore source
Tag pushes run the iOS job in native-platforms.yml, and the release
publishes flectar-mail-<version>-ios-arm64.ipa with its checksum and build
provenance like every other download.
Next to it, scripts/prepare-release.py publishes
flectar-mail-altstore-source.json, an
AltStore source that
SideStore also reads. It offers the release's IPA with its size, SHA-256 and
permissions, which both apps check before installing. People add it once from
https://github.com/flectar/mail/releases/latest/download/flectar-mail-altstore-source.json,
and the apps read it again from there to find updates. Every release is
published as the latest one, so that address always reaches the newest IPA.
Known limitations
- Mail syncs while the app is open. There is no background refresh or notification support yet.
- Without an Apple Developer Program membership there is no App Store or TestFlight build, and copies signed with a free Apple ID expire after 7 days unless they are refreshed.
- Mobile document transfers are capped at 512 MiB, as platform/README.md describes.