fix: remove invalid 'network-extension' from UIBackgroundModes#17
Conversation
App Store Connect upload rejected build 0.0.2 (10) with: ERROR ITMS-90112: Invalid Info.plist value. The Info.plist key UIBackgroundModes contains an invalid value: 'network-extension'. `network-extension` isn't a valid UIBackgroundModes mode for a host app (Apple's allowed list: audio, bluetooth-central, bluetooth-peripheral, external-accessory, fetch, location, network-authentication, processing, push, remote-notification, voip). Network Extensions declare themselves via NSExtension / NSExtensionPointIdentifier in the extension target's Info.plist — which we already do correctly in Sources/ColumbaNetworkExtension/Info.plist. The host app doesn't need any background mode for the packet tunnel; the system keeps the extension running on its own once activated. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Greptile SummaryRemoves the invalid Confidence Score: 5/5Safe to merge — single-line removal of a value that Apple explicitly rejects; no functional code changes. The change is minimal, well-motivated by the App Store Connect error, and the resulting UIBackgroundModes array contains only documented, valid Apple values. No logic, runtime behaviour, or entitlements are affected. No files require special attention. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[App Store Connect submission] -->|ITMS-90112 rejection| B{UIBackgroundModes contains 'network-extension'?}
B -->|Yes – before this PR| C[Rejected: invalid value]
B -->|No – after this PR| D[Accepted: only valid modes remain]
D --> E[bluetooth-central]
D --> F[bluetooth-peripheral]
D --> G[location]
D --> H[voip]
I[NEPacketTunnelProvider] -->|runs in its own extension process| J[ColumbaNetworkExtension Info.plist NSExtensionPointIdentifier]
J -.->|host app needs no background mode for the tunnel| D
Reviews (1): Last reviewed commit: "fix: remove invalid 'network-extension' ..." | Re-trigger Greptile |
…orkaround reticulum-swift 0.3.1 (PR #17) makes `TCPInterface.endTunnelMode()` and `AutoInterface.endTunnelMode()` idempotent via an `outboundHook != nil` guard. That moves the contract upstream, so the `isTunnelModeActive` bool guard added in `c0d2213` is no longer necessary — the `endTunnelMode()` calls in `applyTunnelModeToInterfaces(active: false)` are now safely no-ops when fired on never-tunneled interfaces (e.g. the initial `.invalid` VPN-status notification on every cold start). Removed: - `isTunnelModeActive` field declaration + doc - `isTunnelModeActive = true` write in the active=true branch - `isTunnelModeActive = false` write in the active=false branch - The `guard isTunnelModeActive else { return }` short-circuit Build verified: xcodebuild for iOS Simulator BUILD SUCCEEDED. The port-deviations.md note for reticulum-swift's tunnel API spelled out that this Columba-iOS workaround should be deleted on the next deps bump — this is that deps bump. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
App Store Connect rejected build
0.0.2 (10)with:network-extensionisn't in Apple's allowedUIBackgroundModeslist (audio,bluetooth-central,bluetooth-peripheral,external-accessory,fetch,location,network-authentication,processing,push,remote-notification,voip). Network Extensions declare themselves viaNSExtension/NSExtensionPointIdentifierin the extension target's own Info.plist (which we already do correctly inSources/ColumbaNetworkExtension/Info.plist).The host app doesn't need any background mode for the packet tunnel — the system keeps the extension running on its own once
NEPacketTunnelProvideris started.Test plan
🤖 Generated with Claude Code