[FCE-3464] Add ios-expo-voip package for iOS appDelegate config#566
Merged
Conversation
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- server: restore optional FCM/APNs credentials via readIfPresent helper, guard sendFcmPush/sendApnsPush with clear errors when creds are missing - app: drop stale setTelecomCallActive from effect dependency array - app: route call-cancelled/call-rejected signals by stable handle instead of displayName - docs: rename includeCallsInRecents -> enableCallIntents and FishjamVoip* timeout keys -> Voip* to match the implementation Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- VoipProvider: swallow the old call's late onEnded after an accepted waiting-call swap so it cannot tear down the newly promoted call - README: Recents inclusion is always on (includesCallsInRecents is hardcoded in the SDK) — drop the documented opt-in key that nothing reads Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Magmusacy
marked this pull request as ready for review
July 20, 2026 17:08
An error occurred while trying to automatically change base from
FCE-3435
to
feature/voip-calls
July 21, 2026 12:54
Brings in the squash-merge of FCE-3435 (#562). FCE-3464 branched off FCE-3435 on Jul 17, so it already contained most of that work as individual commits; the merge only picks up the review refinements made on the PR between Jul 17 and the Jul 21 squash-merge. Conflict resolution: - useCallSignaling.ts, VoipProvider.tsx -> took the merged PR's version. It replaces the JS-side waiting-call swap scaffolding (swapInProgressRef / endedBySwapRoomRef) with lastEndedReason-based signaling and a 'rejected' end reason. This supersedes and subsumes FCE-3464's partial revert in 376ce8f. - withFishjamIos.ts -> kept FCE-3464's version. The PR patched the AppDelegate inline for Recents call intents; FCE-3464 replaces that with the @fishjam-cloud/ios-expo-voip subscriber, which handles the same continueUserActivity forwarding. - packages/react-native-webrtc -> kept ours (strictly one commit ahead). - yarn.lock -> kept the ios-expo-voip workspace entry.
MiloszFilimowski
approved these changes
Jul 22, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Replaces the
withAppDelegateregex block in the iOS config plugin with a proper Expo module.@fishjam-cloud/expo-voip— glue-only, iOS-only, no JS. OneExpoAppDelegateSubscriberthat registers PushKit at launch and forwardsINStart*call intents. Both gated on theFishjamVoipEnabledInfo.plist flag.withFishjamIos.ts— regex block deleted. The plugin now just writesFishjamVoipEnabledand throws ifvoipoptions are set without the new package installed.react-native-webrtcsubmodule bump —DEFINES_MODULE => YESso the Swift subscriber canimport FishjamReactNativeWebrtc.No Info.plist keys are lost. Verified on device: the subscriber runs at launch, a VoIP token is issued, and the device registers.
Motivation and Context
The old approach string-spliced generated Swift in
AppDelegate.swift. It silently no-ops whenever Expo changes its template or the regex stops matching — and the failure mode is an app that builds and launches fine but can never receive a call. It also forced consumers to hand-add a bridging-header import and an earlyregisterForVoIPPushes()call.ExpoAppDelegateSubscriberis the supported extension point for this. It's re-applied by autolinking instead of patching generated code, so it survives prebuild, and both manual steps go away.Documentation impact
The VoIP README still documents the old flow (hand-editing
AppDelegate.swift, bridging header) and wrongly claimsaps-environmentis already present and should be set in Xcode.Types of changes
not work as expected)