Skip to content

[FCE-3464] Add ios-expo-voip package for iOS appDelegate config#566

Merged
Magmusacy merged 60 commits into
feature/voip-callsfrom
FCE-3464
Jul 22, 2026
Merged

[FCE-3464] Add ios-expo-voip package for iOS appDelegate config#566
Magmusacy merged 60 commits into
feature/voip-callsfrom
FCE-3464

Conversation

@Magmusacy

@Magmusacy Magmusacy commented Jul 20, 2026

Copy link
Copy Markdown
Collaborator

Description

Replaces the withAppDelegate regex block in the iOS config plugin with a proper Expo module.

  • New package @fishjam-cloud/expo-voip — glue-only, iOS-only, no JS. One ExpoAppDelegateSubscriber that registers PushKit at launch and forwards INStart* call intents. Both gated on the FishjamVoipEnabled Info.plist flag.
  • withFishjamIos.ts — regex block deleted. The plugin now just writes FishjamVoipEnabled and throws if voip options are set without the new package installed.
  • react-native-webrtc submodule bumpDEFINES_MODULE => YES so the Swift subscriber can import 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 early registerForVoIPPushes() call.

ExpoAppDelegateSubscriber is 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

  • Documentation update required
  • Documentation updated in another PR
  • No documentation update required

The VoIP README still documents the old flow (hand-editing AppDelegate.swift, bridging header) and wrongly claims aps-environment is already present and should be set in Xcode.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to
    not work as expected)

Magmusacy and others added 10 commits July 16, 2026 19:23
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>
@linear

linear Bot commented Jul 20, 2026

Copy link
Copy Markdown

FCE-3464

@Magmusacy Magmusacy changed the title Add expo voip package for iOS appDelegate config [FCE-3464] Add expo voip package for iOS appDelegate config Jul 20, 2026
@Magmusacy
Magmusacy marked this pull request as ready for review July 20, 2026 17:08
@Magmusacy Magmusacy changed the title [FCE-3464] Add expo voip package for iOS appDelegate config [FCE-3464] Add ios-expo-voip package for iOS appDelegate config Jul 21, 2026
Base automatically changed from FCE-3435 to feature/voip-calls July 21, 2026 12:54
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.
Comment thread packages/ios-expo-voip/package.json
Comment thread packages/mobile-client/plugin/src/withFishjamIos.ts Outdated
@Magmusacy
Magmusacy merged commit 79ef52e into feature/voip-calls Jul 22, 2026
@Magmusacy
Magmusacy deleted the FCE-3464 branch July 22, 2026 11:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants