В системе ECSS-10 реализован сервис отправки push-нотификаций, поддержаны Apple Push Notification Service и Firebase Cloud Messaging.

Требования к клиентскому приложению

  • При регистрации устройству нужно прислать следующие push-параметры в заголовке Contact:
    • pn-prid (токен, полученный устройством от провайдера push-нотификаций)
    • pn-provider (провайдер push-нотификаций)
    • pn-params (параметры push-нотификаций) в данный момент используется только для матчинга контактов
  • Устройству не требуется обновлять expires регистрации, т.к все контакты с валидными pn-* параметрами будут храниться на SSW бесконечно, либо до того момента пока клиент сам не разрегистрируется с этими же параметрами, либо пока не пошлет регистрацию с тем же label, что был и у предыдущей, либо пока не будет выключен сервис push-нотификаций конкретного провайдера на софтсвиче (system/push_notification/properties/*).

Реализация взаимодействия с устройством и провайдером на стороне SSW

Push-нотификация о входящем звонке

  • При поступлении INVITE, направленного на устройство, которое при регистрации отправило не пустые push-параметры отправляется push-нотификация о входящем звонке.


    Пример JSONа нотификации для firebase:

    {"to": "device_token", "priority":10, "data":
      {"type":"invite", "date":1623753491},
        "time_to_live":28
    } 

    Пример JSONа нотификации для apns:

    {"aps":
      {"badge":"10"},
     "acme":
      {"badge":"10", "type":"invite", "date":1623753691, "number":"uri|anonymous", "dispaly_name":"name|empty_list"}
    }

  • SSW ждет перерегистрацию клиента;
  • После перерегистрации устройства, если таймаут звонка не закончился, то к push-клиенту посылается инвайт и звонок продолжается в обычном режиме;
  • Если перерегистрации не было, то считается, что клиент не ответил на звонок и не получил push-нотификацию;
  • Push-нотификация на перерегистрацию была удалена, т.к. теперь push-параметры на SSW хранятся "вечно"

Push-нотификация о пропущенных звонках (на время отсутствия клиента в сети)

  • При долгом отсутствии push-клиента, после его регистрации должна приходить push-нотификация о всех пропущенных звонках.
  • Для реализации нужно сделать push bucket: хранить в нем все push-нотификации о входящих инвайтах вместе с call_ref(ами) звонков
  • При ответе на звонок удалять его из push-бакета
  • Если клиент перерегистрировался, но в push-бакете есть нотификации о входящих звонках, то формируется нотификация о пропущенных звонках
  • Нотификация отправляется push-клиенту(ам)

Пример JSON нотификации для firebase:

{"to": "token", "priority":10, "data":{
    "type":"missed_calls", "date":1625133614, "calls":[
        {"id":0, "remote_uri":"103", "date":1625158716}, {"id":1, "remote_uri":"105", "date":1625158725}, 
        {"id":2, "remote_uri":"109","date":1625158736}
    ]
}

Пример JSON нотификации для APNS:

{"aps":
  {"badge":"10"},
 "acme":
  {"type":"missed_calls", "date":1623753691, "calls":[
        {"id":0, "remote_uri":"103", "date":1625158716}, {"id":1, "remote_uri":"105", "date":1625158725}, 
        {"id":2, "remote_uri":"103","date":1625158736}
    ]}, "time_to_live":120
}