iOS - monikapurpl3/breeze GitHub Wiki

iOS

Status: built, not tested. The ios branch has an iOS build of Breeze, and GitHub builds it into an IPA on every push. Nobody has run it on an iPhone yet: the maintainer does not have one. It compiles, and its analysis and tests pass. That is all that is known so far.

The IPA rides along on the Android release of the same version, marked untested. Breeze is still an Android app first, and the branch gets no new features until the iOS build is proven on a real phone.

Getting the IPA

Download breeze-<version>-unsigned.ipa and its .sha256 from the latest release, and check one against the other:

shasum -a 256 -c breeze-2.3.0-unsigned.ipa.sha256

Every push to the ios branch rebuilds it and replaces the IPA on that release, so it is always the branch's newest build, not necessarily the release's own commit. No GitHub account is needed.

The IPA is unsigned. iOS will not install it until it is signed, and signing it is part of sideloading.

Sideloading it

There is no paid Apple developer account, so there is no App Store or TestFlight build. The IPA goes onto the phone with a sideloading tool, signed with your own free Apple ID:

  • Sideloadly on Windows or macOS. On Windows it needs iTunes from Apple's website, not the Microsoft Store version.
  • AltStore with AltServer on a computer. AltStore PAL, the EU marketplace, is not an option: apps there have to be notarised by Apple under a paid account.

What a free Apple ID means:

  • Seven days. The signature lasts a week, and then the app stops opening until it is signed again. Both tools can re-sign it for you while the phone and the computer are on the same network.
  • Three sideloaded apps on a phone at once.
  • Developer Mode (iOS 16 and later). Switch it on in Settings → Privacy & Security → Developer Mode and restart. The option appears after the first sideload attempt.
  • Trust the profile once, in Settings → General → VPN & Device Management, under your Apple ID.
  • Always the same Apple ID. iOS keeps Breeze's pairing in the Keychain, which belongs to whoever signed the app. Re-signing with a different Apple ID starts from nothing, and the phone has to pair again.

Requirements: iOS 16.0 or newer, on an iPhone or iPad.

On first launch

Pairing works as it does on Android: see Installing it. iOS adds one step:

  • Local Network permission. The first connection to the server asks to find and connect to devices on your local network. Allow it: without it Breeze cannot reach a server on your LAN. If you declined, turn it on in Settings → Privacy & Security → Local Network.

Deleting the app does not reset its pairing, because iOS keeps Keychain items after an app is deleted. To start over, remove the server in Settings, or revoke the device on the server.

What is different on iOS

The app is the same Dart code, so the control screen, programs, timers, multiple servers and the Nerd screen are all there. What is missing:

  • No home-screen widget, and no background refresh. On iOS those need a WidgetKit extension and background-task setup the build does not have. They are switched off on iOS, not broken.
  • No Android Auto, and no CarPlay. CarPlay needs an entitlement from Apple, which a free account cannot get.
  • No Material You colours. iOS has no wallpaper palette, so Breeze starts with its teal palette, the one Android 11 and older get. Any other colour is a setting: tap the version in Settings seven times, open the Nerd screen's Internal tab, and choose My colour: a swatch or any hex colour, plus a style. See the Internal tab. Light and dark still follow the system.

Why is the IPA 8 MB and the APK 56?

It is the same app. The APK carries it three times over: one copy for 64-bit ARM phones, one for older 32-bit ARM phones, and one for x86_64 emulators and Chromebooks. Android also keeps an app's native libraries uncompressed inside the APK, so they can be loaded from it in place. One architecture of the APK is about 20 MB.

The IPA is 64-bit ARM only, because every iPhone that runs iOS 16 is. An IPA is also a plain zip, so everything in it is compressed. Unpacked, the app is 19 MB, about the same as one architecture of the APK.

How it is built

.github/workflows/ios.yml first runs the same analysis and tests as the Android CI. Then, on GitHub's macos-26 runner (Xcode 26.6, Flutter 3.44.4), it runs flutter build ios --release --no-codesign. The app it produces goes into an IPA, which is a zip with the app under Payload/. A run takes about six minutes. The repository is public, so the macOS runner costs nothing.

To build it yourself on a Mac:

git switch ios
flutter pub get
flutter build ios --release --no-codesign

…or open ios/Runner.xcworkspace in Xcode, choose your Apple ID as the team, and run it on a connected phone.

Reporting back

The first report from a real iPhone is the most useful thing this build can get. Did it install, did it open, did pairing work? Report it at https://github.com/monikapurpl3/breeze/issues.

⚠️ **GitHub.com Fallback** ⚠️