Исправить работу VoIP Push нотификаций в Linphone-based приложении

14 000 руб. за проект
28 октября 2020, 00:50 • 2 отклика • 14 просмотров
Ищу iOS Objective-C разработчика с опытом работы с VoIP.

Имеется приложение на базе Linphone, собственные SIP и PUSH серверы. Приложение использует VoIP Push и CallKit для отображения и приема звонков на iOS.

Проблема состоит в следующем:

1. Приложение получает push нотификацию, iOS отображает экран входящего вызова CallKit.
2. Пользователь отвечает на звонок, приложение открывае главный экран приложения вместо экрана разговора.
3. При переходе на домашний экран iOS, вверху экрана отображается зеленая строка текущего вызова.
4. При нажатии на строку вызова, iOS откроет меню текущего вызовов.
5. После завершения вызова в логе приложения можно прочесть, что SIP-соединение не было установлено.

Также в журналах приложения мы видим несколько ошибок:

1. Иногда приложение не может распарсить заголовок «To», потому что размер заголовка, приходящий с сервера, больше, чем ограничение на его длину в приложении.
2. Ошибка CallKit после получения push-уведомления.

```
ERROR (roviderDelegate.m:187 ) CallKit: cannot complete incoming call from [29028] caused by [The operation couldnÕt be completed. (com.apple.CallKit.error.incomingcall error 2.)]
2020-08-17 15:03:11:320 [bctbx] DEBUG (roviderDelegate.m:455 ) CallKit : Call changed
```

3. CallKit не ожидает вызова после получения push нотификации.

```
2020-08-17 15:09:31:807 [bctbx] DEBUG (roviderDelegate.m:273 ) CallKit : Answering Call
2020-08-17 15:09:31:822 [bctbx] DEBUG (roviderDelegate.m:455 ) CallKit : Call changed
2020-08-17 15:09:32:090 [bctbx] DEBUG (roviderDelegate.m:401 ) CallKit : Audio session activated
2020-08-17 15:09:32:090 [bctbx] ERROR (roviderDelegate.m:422 ) CallKit : No pending call
```

Журнал приложений доступен в gist - https://gist.github.com/dmpanch/27749d0985cff18d15eda8d23274a9d9

Видео с описанной проблемой - https://mega.nz/file/knQUQb7I#lbtKWRS2fuIXWpbmlq9Thx5EKUeSCHw2ywXSYuvawdA

Наши предположения о проблеме:

CallKit ожидает INVITE от сервера через определенное время после получения VoIP push нотификации, Linphone использует таймеры, а не модель подписки, чтобы проверить, поступил ли вызов после push нотификации, и если CallKit ожиает слишком долго/не получает INVITE вообще/получает INVITE перед push нотификацией - телефон отображает экран вызовов iOS, но после ответа на вызов соединение не устанавливается.

Необходимо исправить все указанные выше ошибки и добиться стабильного соединения после push нотификации.
Файлы