iPhone app: native SwiftUI Mesh+ without the SMS relay #1

Merged
backmeupplz merged 2 commits from ios-app into main 2026-10-16 18:45:16 +00:00
backmeupplz commented 2026-10-16 18:13:57 +00:00 (Migrated from github.com)

Native iOS version of Mesh+ in ios/ (SwiftUI, iOS 17+, iPhone only, no dependencies), ported from the Android app. TestFlight already has 0.4.4 (7), uploaded with ios/release.sh to validate it; App Store app 6823711977.

What's in it

  • Bluetooth connection to Meshtastic nodes through the same ToRadio/FromRadio/FromNum API. iOS asks for the node's PIN on the first connection, and the app reconnects by itself when the node comes back in range.
  • Region and name setup; rooms (create, invite by QR or link, join by scanning or pasting the same meshtastic.org/e/# links as Android); DMs; nodes with profiles; node settings with the same explanations; several radios; the demo node.
  • Runs in the background (bluetooth-central) and posts notifications for new messages.
  • Not on iPhone: SMS relay, USB and firmware updates. Node settings points to flasher.meshtastic.org.

App Review (guideline 1.2, chats)

  • A community rules screen with an Agree button comes before any chatting, the demo included. It links to meshplus.app/terms.html.
  • Long-press a message for Copy, Report and Block. Report opens a prefilled email to support@borodutch.com with the message, the sender's id and the time, and offers to block the sender. Block hides that node's messages, DMs and notifications on the phone; Settings → Blocked nodes lists them for unblocking. Profiles in Nodes have Block too.

Build and release

  • ios/release.sh <version> <build> [key-id issuer-id key.p8] archives the app unsigned, signs it ad hoc with ios/adhoc.entitlements, exports with App Store Connect cloud signing (ios/ExportOptions.plist) and uploads it with altool. It needs no signing identity, so it runs on a stock macOS runner.
  • ios/screenshots.sh saves the 6.9" App Store screenshots to ios/appstore/screenshots.
  • The new .github/workflows/ios.yml runs the unit tests and demo UI tests for ios/** changes only. release.yml and AGENTS.md are unchanged. No binaries for F-Droid's scanner (Python caches are ignored).

Checks

  • Unit tests: a Swift port of ProtoTest, plus malformed-input and invite round-trip cases.
  • UI tests on the demo node: the terms screen first, chatting with a reply, report, block from a message and from a profile, unblock in Settings. They pass locally on an iPhone 18 Pro Max simulator (iOS 27, light and dark) and on macos-26 in CI.

🤖 Generated with Claude Code

Native iOS version of Mesh+ in `ios/` (SwiftUI, iOS 17+, iPhone only, no dependencies), ported from the Android app. TestFlight already has 0.4.4 (7), uploaded with `ios/release.sh` to validate it; App Store app 6823711977. **What's in it** - Bluetooth connection to Meshtastic nodes through the same ToRadio/FromRadio/FromNum API. iOS asks for the node's PIN on the first connection, and the app reconnects by itself when the node comes back in range. - Region and name setup; rooms (create, invite by QR or link, join by scanning or pasting the same meshtastic.org/e/# links as Android); DMs; nodes with profiles; node settings with the same explanations; several radios; the demo node. - Runs in the background (bluetooth-central) and posts notifications for new messages. - Not on iPhone: SMS relay, USB and firmware updates. Node settings points to flasher.meshtastic.org. **App Review (guideline 1.2, chats)** - A community rules screen with an Agree button comes before any chatting, the demo included. It links to meshplus.app/terms.html. - Long-press a message for Copy, Report and Block. Report opens a prefilled email to support@borodutch.com with the message, the sender's id and the time, and offers to block the sender. Block hides that node's messages, DMs and notifications on the phone; Settings → Blocked nodes lists them for unblocking. Profiles in Nodes have Block too. **Build and release** - `ios/release.sh <version> <build> [key-id issuer-id key.p8]` archives the app unsigned, signs it ad hoc with `ios/adhoc.entitlements`, exports with App Store Connect cloud signing (`ios/ExportOptions.plist`) and uploads it with altool. It needs no signing identity, so it runs on a stock macOS runner. - `ios/screenshots.sh` saves the 6.9" App Store screenshots to `ios/appstore/screenshots`. - The new `.github/workflows/ios.yml` runs the unit tests and demo UI tests for `ios/**` changes only. release.yml and AGENTS.md are unchanged. No binaries for F-Droid's scanner (Python caches are ignored). **Checks** - Unit tests: a Swift port of ProtoTest, plus malformed-input and invite round-trip cases. - UI tests on the demo node: the terms screen first, chatting with a reply, report, block from a message and from a profile, unblock in Settings. They pass locally on an iPhone 18 Pro Max simulator (iOS 27, light and dark) and on macos-26 in CI. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.
No description provided.