Blog

Native iOS and Android Apps: More Ways to Ship a Release

· Application Platform · 3 min read

AppsReleases
Native iOS and Android Apps: More Ways to Ship a Release

Shipping an app to a store rarely fails at the build. It fails in the layer between the last commit and the store listing: certificates, signing identities, store accounts and identifiers that all have to match exactly. That layer tends to live on individual machines — a keystore in someone’s downloads folder, a certificate in a colleague’s keychain. As long as the same person cuts every release, nobody notices. The moment somebody else takes over, the hunt begins.

As of 1 August the platform covers a wider set of release paths and keeps those credentials in one place.

Native project types in the wizard

The project wizard now offers native iOS apps in Swift and native Android apps in Kotlin as project types of their own, alongside Flutter and Expo — for cases where a cross-platform framework is not the right fit, such as an app that reaches deep into platform APIs, or an existing native codebase that carries on.

Pick a native stack and the platform proposes matching tooling: Xcode for iOS, Java for Android. Kotlin is also available as a tech stack for packages, useful for a shared library several apps depend on.

macOS: four release paths, configured separately

On macOS there is no single way to ship: an internally distributed app has different requirements from one in the Mac App Store. Four things are configured independently: Developer ID signing, notarisation, Mac App Store distribution and a public download. An internal tool can be signed, notarised and offered as a download without touching the store.

For Windows, the Microsoft Store and Azure Artifact Signing are available as connections.

  • App StoreApple releases with prepared metadata and assets.
  • Google PlayPlay Store listings populated automatically.
Powered by Fastlane
Publishing to the App Store and Play Store from the same pipeline.

When you link an App Store or Play Store account, the platform loads the apps that already exist there, and you pick the bundle identifier and package name from a list instead of typing them in. It sounds like a detail, but mistyped identifiers are a common way a release goes wrong: a single character is off, and the build runs the whole pipeline before the upload step reveals it.

Imported Android upload keystores can also be downloaded again, so the key stays available even when the local copy is missing.

Builds run in CI, releases go out through Fastlane

Builds happen in CI, with macOS machines available for iOS, so no dedicated Mac needs to sit in the office. Releases go out through Fastlane, so a release is no longer tied to one workstation — anyone with the right permissions can trigger it.

If your work is mostly Flutter, nothing about that changes — see Flutter CI/CD. The native project types sit next to it, not in place of it. For the bigger picture of how a commit turns into a store listing, see app store automation.

Start a native app project

Create a project with a native stack and see which release paths the platform sets up for you.

Back to blog