Publishing

iOS

iOS Builds

Build the iOS client with:

ruflet build ios
ruflet build ios --self

For an archive you can upload to App Store Connect, build an IPA:

ruflet build ipa --self

Server-driven builds require a device-reachable app.backend_url in ruflet.yaml.

Permissions and usage descriptions

Declare protected access in services.yaml:

services:
  - camera:
      description: Allows users to capture photos.
  - microphone:
      description: Allows users to record voice notes.

Ruflet uses these declarations to configure the required iOS permission definitions and usage descriptions.

Signing

Name the Apple team that signs the app in ruflet.yaml:

ios:
  team_id: ABCDE12345

Ruflet writes it into the Xcode project during the build. Signing itself is automatic: Xcode issues and renews the distribution certificate, so sign in to that team under Xcode → Settings → Accounts once and no certificate has to be created by hand.

Without team_id the field is left empty and Xcode chooses, which is usually what you want while developing.

Store listing

The version and build number come from app.version in ruflet.yaml:

app:
  name: My App
  package_name: my_app
  organization: com.example
  version: 1.0.0+1

The number after + is the build number. App Store Connect rejects an upload that reuses one for the same version, so raise it for every upload.

Release requirements

Test permission flows and physical-device behaviour before preparing a release build. App Store Connect submission and review stay a normal Apple release responsibility.