@voipsdk/react-native-voipcloud 1.0.8 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,39 @@ All notable changes to `@voipsdk/react-native-voipcloud` are documented here.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.0.9] - 2026-11-08
9
+
10
+ Folds in the push-wake / audio-session recovery fixes that were living as an
11
+ app-side `patch-package` patch (`@voipsdk+react-native-voipcloud+1.0.8.patch`),
12
+ so a fresh install behaves correctly without any patch. Adds an explicit
13
+ transport-recovery API and fixes iOS audio routing for CallKit (incoming) calls
14
+ and after a GSM-call interruption.
15
+
16
+ ### Added
17
+
18
+ - `VoipCloud.handleIpChange()` — iOS: restart the SIP transports (UDP rebind,
19
+ TCP/TLS shutdown) and re-REGISTER every account with a refreshed Contact
20
+ (PJSIP `Endpoint::handleIpChange`). Use after a long iOS suspend / network
21
+ change, when `refreshRegistration` would reuse a dead socket and the REGISTER
22
+ never leaves / never gets a 200. Refused (`VC_IP_CHANGE`) while any call
23
+ exists, so it never disturbs a ringing/active call; rejects `VC_UNSUPPORTED`
24
+ where the native side lacks it. Wired on iOS (`handleIpChangeWithError:`).
25
+
26
+ ### Changed / Fixed
27
+
28
+ - **iOS (CallKit audio):** incoming (CallKit) calls no longer call
29
+ `setActive:YES` from the app on answer. Activating the `AVAudioSession` from
30
+ the app before CallKit grants priority failed with `!pri`
31
+ (`AVAudioSessionErrorInsufficientPriority`), so PJSIP opened its sound device
32
+ on a session CallKit didn't control → silent call. CallKit now owns the
33
+ session for incoming calls; the host rewires media from
34
+ `provider:didActivateAudioSession:`. The engine only activates/deactivates the
35
+ session it owns itself (outgoing calls), tracked via `_appOwnsAudioSession`.
36
+ - **iOS (GSM interruption):** `reconnectAudioMedia` now reopens the sound device
37
+ (`pjsua_set_null_snd_dev` + `pjsua_set_snd_dev`) before reconnecting media — a
38
+ stopped audio unit (GSM-call interruption) is not restarted by `refreshDevs`
39
+ alone, which left call audio dead after the interruption ended.
40
+
8
41
  ## [1.0.8] - 2026-08-26
9
42
  Update libraries voipcloud-release.aar 16kb for android
10
43
 
package/ios/VoipCloud.mm CHANGED
@@ -109,6 +109,17 @@ RCT_EXPORT_METHOD(refreshRegistration:(NSInteger)accountId
109
109
  else reject(@"VC_REFRESH", err.localizedDescription ?: @"Failed to refresh registration", err);
110
110
  }
111
111
 
112
+ // Restart SIP transports + re-REGISTER (Endpoint::handleIpChange). For the
113
+ // push-wake path after a long suspend / network change, when a plain refresh
114
+ // would go out on a dead socket.
115
+ RCT_EXPORT_METHOD(handleIpChange:(RCTPromiseResolveBlock)resolve
116
+ rejecter:(RCTPromiseRejectBlock)reject)
117
+ {
118
+ NSError *err = nil;
119
+ if ([VoipCloudEngine.shared handleIpChangeWithError:&err]) resolve(nil);
120
+ else reject(@"VC_IP_CHANGE", err.localizedDescription ?: @"handleIpChange failed", err);
121
+ }
122
+
112
123
  #pragma mark - Calls
113
124
 
114
125
  RCT_EXPORT_METHOD(makeCall:(NSInteger)accountId
@@ -46,6 +46,11 @@ NS_ASSUME_NONNULL_BEGIN
46
46
  /// of unregister+recreate — the push-wake refresh that avoids contact churn/482.
47
47
  /// NO (with *error) if the account was never registered.
48
48
  - (BOOL)refreshRegistrationAccount:(int)accountId error:(NSError **)error;
49
+ /// Endpoint::handleIpChange — restart the SIP transports (UDP rebind, TCP/TLS
50
+ /// shutdown) and re-REGISTER every account with a refreshed Contact. Use after an
51
+ /// iOS suspend / network change, when the socket under a plain refresh may be dead.
52
+ /// Refused (NO) while calls exist, to never disturb a ringing/active call.
53
+ - (BOOL)handleIpChangeWithError:(NSError **)error;
49
54
 
50
55
  /// Place a call from `accountId` to `uri` (full SIP URI). Returns callId, or -1.
51
56
  - (int)makeCallFromAccount:(int)accountId toUri:(NSString *)uri error:(NSError **)error;
@@ -114,7 +114,13 @@ public:
114
114
  }
115
115
 
116
116
  void reconnectAudioMedia() {
117
+ // [VoicePBX] reopen sound device - a stopped audio unit (GSM call
118
+ // interruption) is not restarted by refreshDevs alone.
119
+ pjsua_set_null_snd_dev();
117
120
  try { Endpoint::instance().audDevManager().refreshDevs(); } catch (...) {}
121
+ pj_status_t st = pjsua_set_snd_dev(PJMEDIA_AUD_DEFAULT_CAPTURE_DEV,
122
+ PJMEDIA_AUD_DEFAULT_PLAYBACK_DEV);
123
+ if (st != PJ_SUCCESS) NSLog(@"[VoipCloud] reopen sound device failed: %d", st);
118
124
  connectAudioMedia();
119
125
  emitMediaState();
120
126
  }
@@ -288,6 +294,11 @@ void VCCall::onDtmfDigit(OnDtmfDigitParam &prm) {
288
294
  int _udpTransportId;
289
295
  int _tcpTransportId;
290
296
  int _tlsTransportId;
297
+ // YES only while the APP activated the AVAudioSession (outgoing call). For
298
+ // incoming calls CallKit owns the session: it activates it after the answer
299
+ // action is fulfilled (provider:didActivateAudioSession:) and deactivates it
300
+ // itself, so the engine must neither activate nor deactivate it then.
301
+ BOOL _appOwnsAudioSession;
291
302
  }
292
303
 
293
304
  + (instancetype)shared {
@@ -560,6 +571,34 @@ void VCCall::onDtmfDigit(OnDtmfDigitParam &prm) {
560
571
  }
561
572
  }
562
573
 
574
+ // Recover the SIP transport after an iOS suspend or a network switch. A plain
575
+ // setRegistration(true) reuses the old socket: after a long suspend a TCP/TLS
576
+ // connection is dead and a UDP socket may be defunct or bound to a vanished
577
+ // interface, so the REGISTER never leaves / never gets a 200 and the PBX can't
578
+ // route the INVITE. handleIpChange is PJSIP's documented recovery: restarts the
579
+ // listeners, shuts down the accounts' connections and re-REGISTERs (contact
580
+ // update). Registration results arrive via onRegState as usual.
581
+ - (BOOL)handleIpChangeWithError:(NSError **)error {
582
+ if (!_ep) {
583
+ if (error) *error = VCMakeError(-1, @"Endpoint not started");
584
+ return NO;
585
+ }
586
+ if (!_calls.empty()) {
587
+ if (error) *error = VCMakeError(-1, @"Calls in progress — IP change refused");
588
+ return NO;
589
+ }
590
+ try {
591
+ IpChangeParam prm;
592
+ prm.restartListener = true;
593
+ prm.restartLisDelay = 0;
594
+ _ep->handleIpChange(prm);
595
+ return YES;
596
+ } catch (Error &err) {
597
+ if (error) *error = VCMakeError(err.status, VCStr(err.info()));
598
+ return NO;
599
+ }
600
+ }
601
+
563
602
  #pragma mark Calls
564
603
 
565
604
  - (int)makeCallFromAccount:(int)accountId toUri:(NSString *)uri error:(NSError **)error {
@@ -579,6 +618,8 @@ void VCCall::onDtmfDigit(OnDtmfDigitParam &prm) {
579
618
  int cid = call->getId();
580
619
  call->cachedId = cid;
581
620
  [self storeCall:call withId:cid];
621
+ // Outgoing calls do not go through CallKit on iOS — the app owns audio.
622
+ _appOwnsAudioSession = YES;
582
623
  [self activateAudioSession];
583
624
  return cid;
584
625
  } catch (Error &err) {
@@ -593,7 +634,12 @@ void VCCall::onDtmfDigit(OnDtmfDigitParam &prm) {
593
634
  try {
594
635
  CallOpParam op; op.statusCode = PJSIP_SC_OK;
595
636
  call->answer(op);
596
- [self activateAudioSession];
637
+ // Incoming calls are CallKit calls: do NOT setActive:YES here. Doing it
638
+ // from the app (background/lock screen, before CallKit grants priority)
639
+ // fails with '!pri' (AVAudioSessionErrorInsufficientPriority) and PJSIP
640
+ // opens its sound device on a session CallKit doesn't control → silent
641
+ // call. CallKit activates the session; the host then rewires media via
642
+ // reconnectCallAudio from didActivateAudioSession.
597
643
  return YES;
598
644
  } catch (Error &err) { if (error) *error = VCMakeError(err.status, VCStr(err.info())); return NO; }
599
645
  }
@@ -709,6 +755,9 @@ void VCCall::onDtmfDigit(OnDtmfDigitParam &prm) {
709
755
 
710
756
  - (void)deactivateAudioSessionIfIdle {
711
757
  if (!_calls.empty()) return;
758
+ // Only undo an activation the app itself made — CallKit deactivates its own.
759
+ if (!_appOwnsAudioSession) return;
760
+ _appOwnsAudioSession = NO;
712
761
  NSError *e = nil;
713
762
  [[AVAudioSession sharedInstance]
714
763
  setActive:NO
@@ -50,6 +50,17 @@ const VoipCloud = exports.VoipCloud = {
50
50
  refreshRegistration(accountId) {
51
51
  return callNative(() => _nativeModule.NativeVoipCloud.refreshRegistration(accountId));
52
52
  },
53
+ /**
54
+ * iOS: restart SIP transports and re-REGISTER all accounts (PJSIP
55
+ * `Endpoint::handleIpChange`). Use after a long suspend / network change, when
56
+ * `refreshRegistration` would reuse a dead socket. Rejects `VC_IP_CHANGE`
57
+ * while calls exist, and `VC_UNSUPPORTED` where the native side lacks it.
58
+ */
59
+ handleIpChange() {
60
+ return callNative(() => typeof _nativeModule.NativeVoipCloud.handleIpChange === 'function' ? _nativeModule.NativeVoipCloud.handleIpChange() : Promise.reject(Object.assign(new Error('handleIpChange not supported'), {
61
+ code: 'VC_UNSUPPORTED'
62
+ })));
63
+ },
53
64
  makeCall(accountId, destinationUri) {
54
65
  return callNative(() => _nativeModule.NativeVoipCloud.makeCall(accountId, destinationUri));
55
66
  },
@@ -1 +1 @@
1
- {"version":3,"names":["_nativeModule","require","_events","rejectNotLinked","Promise","reject","Object","assign","Error","code","callNative","fn","NativeVoipCloud","VoipCloud","exports","init","cfg","shutdown","register","account","unregister","accountId","refreshRegistration","makeCall","destinationUri","answer","callId","hangup","mode","hold","unhold","mute","on","sendDtmf","digits","transferCall","hangupAllCalls","reconnectCallAudio"],"sourceRoot":"../../src","sources":["VoipCloud.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_nativeModule","require","_events","rejectNotLinked","Promise","reject","Object","assign","Error","code","callNative","fn","NativeVoipCloud","VoipCloud","exports","init","cfg","shutdown","register","account","unregister","accountId","refreshRegistration","handleIpChange","makeCall","destinationUri","answer","callId","hangup","mode","hold","unhold","mute","on","sendDtmf","digits","transferCall","hangupAllCalls","reconnectCallAudio"],"sourceRoot":"../../src","sources":["VoipCloud.ts"],"mappings":"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","ignoreList":[]}
@@ -45,6 +45,17 @@ export const VoipCloud = {
45
45
  refreshRegistration(accountId) {
46
46
  return callNative(() => NativeVoipCloud.refreshRegistration(accountId));
47
47
  },
48
+ /**
49
+ * iOS: restart SIP transports and re-REGISTER all accounts (PJSIP
50
+ * `Endpoint::handleIpChange`). Use after a long suspend / network change, when
51
+ * `refreshRegistration` would reuse a dead socket. Rejects `VC_IP_CHANGE`
52
+ * while calls exist, and `VC_UNSUPPORTED` where the native side lacks it.
53
+ */
54
+ handleIpChange() {
55
+ return callNative(() => typeof NativeVoipCloud.handleIpChange === 'function' ? NativeVoipCloud.handleIpChange() : Promise.reject(Object.assign(new Error('handleIpChange not supported'), {
56
+ code: 'VC_UNSUPPORTED'
57
+ })));
58
+ },
48
59
  makeCall(accountId, destinationUri) {
49
60
  return callNative(() => NativeVoipCloud.makeCall(accountId, destinationUri));
50
61
  },
@@ -1 +1 @@
1
- {"version":3,"names":["NativeVoipCloud","on","rejectNotLinked","Promise","reject","Object","assign","Error","code","callNative","fn","VoipCloud","init","cfg","shutdown","register","account","unregister","accountId","refreshRegistration","makeCall","destinationUri","answer","callId","hangup","mode","hold","unhold","mute","sendDtmf","digits","transferCall","hangupAllCalls","reconnectCallAudio"],"sourceRoot":"../../src","sources":["VoipCloud.ts"],"mappings":"AACA,SAASA,eAAe,QAAQ,gBAAgB;AAChD,SAASC,EAAE,QAAQ,UAAU;;AAE7B;AACA,SAASC,eAAeA,CAAA,EAAmB;EACvC,OAAOC,OAAO,CAACC,MAAM,CACjBC,MAAM,CAACC,MAAM,CACT,IAAIC,KAAK,CACL,+DAA+D,GAC/D,+CAA+C,GAC/C,gFACJ,CAAC,EACD;IAAEC,IAAI,EAAE;EAAgB,CAC5B,CACJ,CAAC;AACL;AAEA,SAASC,UAAUA,CAAIC,EAAoB,EAAc;EACrD,IAAI,CAACV,eAAe,EAAE,OAAOE,eAAe,CAAC,CAAC;EAC9C,OAAOQ,EAAE,CAAC,CAAC;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,SAAS,GAAG;EACrBC,IAAIA,CAACC,GAAe,GAAG,CAAC,CAAC,EAAiB;IACtC,OAAOJ,UAAU,CAAC,MAAMT,eAAe,CAACY,IAAI,CAACC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;EAC5D,CAAC;EAEDC,QAAQA,CAAA,EAAkB;IACtB,OAAOL,UAAU,CAAC,MAAMT,eAAe,CAACc,QAAQ,CAAC,CAAC,CAAC;EACvD,CAAC;EAEDC,QAAQA,CAACC,OAAsB,EAAmB;IAC9C,OAAOP,UAAU,CAAC,MAAMT,eAAe,CAACe,QAAQ,CAACC,OAAO,CAAC,CAAC;EAC9D,CAAC;EAEDC,UAAUA,CAACC,SAAiB,EAAiB;IACzC,OAAOT,UAAU,CAAC,MAAMT,eAAe,CAACiB,UAAU,CAACC,SAAS,CAAC,CAAC;EAClE,CAAC;EAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EACIC,mBAAmBA,CAACD,SAAiB,EAAiB;IAClD,OAAOT,UAAU,CAAC,MAAMT,eAAe,CAACmB,mBAAmB,CAACD,SAAS,CAAC,CAAC;EAC3E,CAAC;EAEDE,QAAQA,CAACF,SAAiB,EAAEG,cAAsB,EAAmB;IACjE,OAAOZ,UAAU,CAAC,MAAMT,eAAe,CAACoB,QAAQ,CAACF,SAAS,EAAEG,cAAc,CAAC,CAAC;EAChF,CAAC;EAEDC,MAAMA,CAACC,MAAc,EAAiB;IAClC,OAAOd,UAAU,CAAC,MAAMT,eAAe,CAACsB,MAAM,CAACC,MAAM,CAAC,CAAC;EAC3D,CAAC;EAEDC,MAAMA,CAACD,MAAc,EAAEE,IAAkC,GAAG,QAAQ,EAAiB;IACjF,OAAOhB,UAAU,CAAC,MAAMT,eAAe,CAACwB,MAAM,CAACD,MAAM,EAAEE,IAAI,CAAC,CAAC;EACjE,CAAC;EAEDC,IAAIA,CAACH,MAAc,EAAiB;IAChC,OAAOd,UAAU,CAAC,MAAMT,eAAe,CAAC0B,IAAI,CAACH,MAAM,CAAC,CAAC;EACzD,CAAC;EAEDI,MAAMA,CAACJ,MAAc,EAAiB;IAClC,OAAOd,UAAU,CAAC,MAAMT,eAAe,CAAC2B,MAAM,CAACJ,MAAM,CAAC,CAAC;EAC3D,CAAC;EAEDK,IAAIA,CAACL,MAAc,EAAEtB,EAAW,EAAiB;IAC7C,OAAOQ,UAAU,CAAC,MAAMT,eAAe,CAAC4B,IAAI,CAACL,MAAM,EAAEtB,EAAE,CAAC,CAAC;EAC7D,CAAC;EAED4B,QAAQA,CAACN,MAAc,EAAEO,MAAc,EAAiB;IACpD,OAAOrB,UAAU,CAAC,MAAMT,eAAe,CAAC6B,QAAQ,CAACN,MAAM,EAAEO,MAAM,CAAC,CAAC;EACrE,CAAC;EAEDC,YAAYA,CAACR,MAAc,EAAEF,cAAsB,EAAiB;IAChE,OAAOZ,UAAU,CAAC,MAAMT,eAAe,CAAC+B,YAAY,CAACR,MAAM,EAAEF,cAAc,CAAC,CAAC;EACjF,CAAC;EAEDW,cAAcA,CAAA,EAAkB;IAC5B,OAAOvB,UAAU,CAAC,MAAMT,eAAe,CAACgC,cAAc,CAAC,CAAC,CAAC;EAC7D,CAAC;EAEDC,kBAAkBA,CAACV,MAAc,EAAiB;IAC9C,OAAOd,UAAU,CAAC,MAAMT,eAAe,CAACiC,kBAAkB,CAACV,MAAM,CAAC,CAAC;EACvE,CAAC;EAEDtB;AACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["NativeVoipCloud","on","rejectNotLinked","Promise","reject","Object","assign","Error","code","callNative","fn","VoipCloud","init","cfg","shutdown","register","account","unregister","accountId","refreshRegistration","handleIpChange","makeCall","destinationUri","answer","callId","hangup","mode","hold","unhold","mute","sendDtmf","digits","transferCall","hangupAllCalls","reconnectCallAudio"],"sourceRoot":"../../src","sources":["VoipCloud.ts"],"mappings":"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","ignoreList":[]}
@@ -23,6 +23,13 @@ export declare const VoipCloud: {
23
23
  * registered — the caller should fall back to `register()` on a cold start.
24
24
  */
25
25
  refreshRegistration(accountId: number): Promise<void>;
26
+ /**
27
+ * iOS: restart SIP transports and re-REGISTER all accounts (PJSIP
28
+ * `Endpoint::handleIpChange`). Use after a long suspend / network change, when
29
+ * `refreshRegistration` would reuse a dead socket. Rejects `VC_IP_CHANGE`
30
+ * while calls exist, and `VC_UNSUPPORTED` where the native side lacks it.
31
+ */
32
+ handleIpChange(): Promise<void>;
26
33
  makeCall(accountId: number, destinationUri: string): Promise<number>;
27
34
  answer(callId: number): Promise<void>;
28
35
  hangup(callId: number, mode?: "busy" | "cancel" | "normal"): Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voipsdk/react-native-voipcloud",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "description": "Public React Native VoIP SDK (VoipCloud).",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
package/src/VoipCloud.ts CHANGED
@@ -59,6 +59,20 @@ export const VoipCloud = {
59
59
  return callNative(() => NativeVoipCloud.refreshRegistration(accountId));
60
60
  },
61
61
 
62
+ /**
63
+ * iOS: restart SIP transports and re-REGISTER all accounts (PJSIP
64
+ * `Endpoint::handleIpChange`). Use after a long suspend / network change, when
65
+ * `refreshRegistration` would reuse a dead socket. Rejects `VC_IP_CHANGE`
66
+ * while calls exist, and `VC_UNSUPPORTED` where the native side lacks it.
67
+ */
68
+ handleIpChange(): Promise<void> {
69
+ return callNative(() =>
70
+ typeof NativeVoipCloud.handleIpChange === 'function'
71
+ ? NativeVoipCloud.handleIpChange()
72
+ : Promise.reject(Object.assign(new Error('handleIpChange not supported'), { code: 'VC_UNSUPPORTED' })),
73
+ );
74
+ },
75
+
62
76
  makeCall(accountId: number, destinationUri: string): Promise<number> {
63
77
  return callNative(() => NativeVoipCloud.makeCall(accountId, destinationUri));
64
78
  },