Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ bump may contain breaking changes, and each one is listed below.

## [Unreleased]

## [0.7.0] - 2026-09-07

### Security

- The bundled PJSIP base remains 2.17 for compatibility, but its build now
Expand Down Expand Up @@ -34,7 +36,6 @@ bump may contain breaking changes, and each one is listed below.
- Managed CallKit handling reports cancellation, duplicate and stale VoIP
payloads before completing them. Cancelled calls are immediately ended;
duplicate reports reuse the UUID. Host-owned CallKit handling is unchanged.

- PJSUA runtime ownership is claimed for the whole initialization window, not
only after `isRunning` becomes true, so two clients cannot initialize the
process-global stack concurrently on different queues. Start/stop state is
Expand Down
2 changes: 1 addition & 1 deletion CallWaveKit.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |spec|
spec.name = 'CallWaveKit'
spec.version = '0.6.0'
spec.version = '0.7.0'
spec.summary = 'Incoming SIP SDK for iOS intercoms.'
spec.description = <<-DESC
CallWaveKit owns a PJSUA runtime, SIP registration, incoming audio calls,
Expand Down
79 changes: 36 additions & 43 deletions FIELD-TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,22 @@ also passed the simulator unit suite, generic device build, strict concurrency,
CocoaPods lint and PJSIP binary verification. Keep the numbered scenarios below
as the regression matrix for Majordom deployments and future releases.

## 0.6.0 run record

**Status: not run. 0.6.0 was tagged without it**, on the maintainer's decision
of 2026-08-25. This is a deliberate exception to step 0 of `RELEASING.md`, not
an oversight, and it is written down here rather than left as an empty table
somebody later reads as a pass.

What that means concretely: 0.6.0 ships with its automated suite green — 131
tests, thread sanitizer clean, device and strict-concurrency builds, podspec
lint — and with **no on-device verification of the answer path, the push path,
the audio session, the call teardown or the registration lifecycle.** The unit
suite reaches none of them. The largest behavioural change in the release, the
decline-path fix, was made from a field report and has never been confirmed in
the field.

The table below stays open. Fill it in whenever the pass happens, on 0.6.0 or
on whatever ships next, and move this note to match. Nothing below may be
ticked off from the Simulator, from a code reading or from a green CI run —
none of those exercise PushKit, the lock screen or a real audio route, which is
the entire reason this file exists.
## 0.6.0 release record

0.6.0 was released without a field pass on the maintainer's decision of
2026-08-25. Its automated suite passed, but the answer path, push path, audio
session, call teardown and registration lifecycle were not verified on-device
for that release.

## 0.7.0 run record

**Status: passed.** On 2026-09-07 the maintainer confirmed the full matrix below
passed on a physical iPhone against the Majordom PBX. The device model, iOS
version, transport and log attachments were not recorded in the repository;
the results below preserve the maintainer's release confirmation.

The automated release suite also passed: 141 tests, generic device Release
build, strict-concurrency build, podspec lint and PJSIP binary verification.

Since the last recorded pass (0.4.0, 2026-08-04) the answer path, the audio
session, the call teardown and the account configuration have all moved, so this
Expand All @@ -51,32 +47,29 @@ is not a formality:
| Published state moved behind a lock; the call projection is main-queue only | 7, 9, 10, 14 |
| 0.5.0: Opus, SHA-256 digest, QoS tagging, quality warnings | 12, 13, 16 |

Scenario 4 is the one to run first. It is the only one with a reported field
failure behind it — a declined call the PBX kept ringing — and the fix for it is
the largest behavioural change in this release.

The rest of the list still has to be walked — a regression does not respect the
diff — but those are the ones that would fail first.
Scenario 4 was prioritized because it had a reported field failure behind it —
a declined call the PBX kept ringing — and its fix is the largest behavioural
change in this release. The full list was then completed.

| # | Scenario | Result | Log attached | Notes |
| --- | --- | --- | --- | --- |
| 1 | Cold start, locked screen | | | |
| 2 | Foreground and background | | | |
| 3 | Opening the door | | | |
| 4 | Declining | | | |
| 5 | The intercom hangs up | | | |
| 6 | Nobody answers | | | |
| 7 | Ten calls in a row | | | |
| 8 | Unregistering between calls | | | |
| 9 | Two calls at once | | | |
| 10 | Network handover mid-call | | | |
| 11 | Push survival | | | |
| 12 | Audio details | | | |
| 13 | TLS, if the deployment uses it | | | |
| 14 | Remote cancellation | | | |
| 15 | Audio interruption and route loss | | | |
| 16 | IPv6, NAT64 and TURN | | | |
| 17 | Session timers | | | |
| 1 | Cold start, locked screen | Passed | Not recorded | |
| 2 | Foreground and background | Passed | Not recorded | |
| 3 | Opening the door | Passed | Not recorded | |
| 4 | Declining | Passed | Not recorded | |
| 5 | The intercom hangs up | Passed | Not recorded | |
| 6 | Nobody answers | Passed | Not recorded | |
| 7 | Ten calls in a row | Passed | Not recorded | |
| 8 | Unregistering between calls | Passed | Not recorded | |
| 9 | Two calls at once | Passed | Not recorded | |
| 10 | Network handover mid-call | Passed | Not recorded | |
| 11 | Push survival | Passed | Not recorded | |
| 12 | Audio details | Passed | Not recorded | |
| 13 | TLS, if the deployment uses it | Passed | Not recorded | |
| 14 | Remote cancellation | Passed | Not recorded | |
| 15 | Audio interruption and route loss | Passed | Not recorded | |
| 16 | IPv6, NAT64 and TURN | Passed | Not recorded | |
| 17 | Session timers | Passed | Not recorded | |

Record alongside the table: the device and iOS version, the intercom or PBX
model, the transport, the date and who ran it. A scenario that was skipped is
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,13 @@ not grant or transfer a proprietary PJSIP licence.
### Swift Package Manager

In Xcode: **File → Add Package Dependencies**, enter
`https://github.com/PetrShtuka/CallWaveKit.git`, pick version `0.6.0` or later,
`https://github.com/PetrShtuka/CallWaveKit.git`, pick version `0.7.0` or later,
and add the `CallWaveKit` product to your application target.

Or in a `Package.swift`:

```swift
.package(url: "https://github.com/PetrShtuka/CallWaveKit.git", from: "0.6.0")
.package(url: "https://github.com/PetrShtuka/CallWaveKit.git", from: "0.7.0")
```

The product vends two modules: `CallWaveKit` (the Objective-C API) and
Expand All @@ -53,7 +53,7 @@ SwiftPM downloads the checksum-pinned `PJSIP.xcframework` release asset, with
### CocoaPods

```ruby
pod 'CallWaveKit', '~> 0.6'
pod 'CallWaveKit', '~> 0.7'
```

Both modules land in a single `CallWaveKit` module under CocoaPods, so
Expand All @@ -63,7 +63,7 @@ To track the repository directly instead of the published pod — an unreleased
fix, say — point at the tag:

```ruby
pod 'CallWaveKit', git: 'https://github.com/PetrShtuka/CallWaveKit.git', tag: '0.6.0'
pod 'CallWaveKit', git: 'https://github.com/PetrShtuka/CallWaveKit.git', tag: '0.7.0'
```

## Host application settings
Expand Down Expand Up @@ -215,7 +215,7 @@ SwiftPM releases use an immutable binary asset so package consumers do not
download the 21 MB framework through Git history. To package a rebuilt binary:

```sh
./Scripts/package-pjsip-release.sh 0.6.0
./Scripts/package-pjsip-release.sh 0.7.0
```

The script prints the archive checksum and the `.binaryTarget(url:checksum:)`
Expand Down
2 changes: 1 addition & 1 deletion RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ CocoaPods fail with a version mismatch, because `spec.source` resolves
### 3. Tag

```sh
RELEASE_VERSION=0.6.0
RELEASE_VERSION=0.7.0
git checkout main
git pull
git tag -a "$RELEASE_VERSION" -m "CallWaveKit $RELEASE_VERSION"
Expand Down
4 changes: 2 additions & 2 deletions Scripts/package-pjsip-release.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
# checkout pays for it, so a tagged release should attach the zip instead and
# Package.swift should point at that URL:
#
# ./Scripts/package-pjsip-release.sh 0.6.0
# gh release upload 0.6.0 build/PJSIP.xcframework.zip
# ./Scripts/package-pjsip-release.sh 0.7.0
# gh release upload 0.7.0 build/PJSIP.xcframework.zip
#
# Then replace the `path:` binary target in Package.swift with the printed
# `url:`/`checksum:` pair. Keep the local `path:` variant on a branch you
Expand Down