Push-уведомления

Предположим, у Вас есть приложение, созданное с помощью Clickable и размещенное в OpenStore. Но теперь Вы хотите отправлять Push-уведомления своим пользователям. Прежде всего, нужно понять, как это работает:

../../_images/Diagram.png
  1. Каждое приложение, которое использует push-уведомления, имеет уникальный токен. Этот токен идентифицирует пользователя, устройство и само приложение. Маркер генерируется службой UBports Push.

  2. Для отправки push-уведомления потребуется токен. Таким образом, приложение отправляет свой токен на сервер разработчика приложения.

  3. С помощью токена можно отправить HTTP-запрос на UBports Push Server, а он перенаправит уведомление на устройство пользователя.

Давайте попробуем повторить этот алгоритм шаг за шагом.

Примечание

В следующем примере мы не будем заниматься настройками сервера. Связь между приложением и сервером зависит от вас. Пожалуйста, сообщите пользователю о соединении с сервером и попросите у него согласие с политикой конфиденциальности!

Подготовьте приложение к работе с push-уведомлениями

Реализиция PushClient

Сначала нам нужно добавить группу политик «push-messages-client». Ваш файл для apparmor может выглядеть так:

    {
        "policy_groups": [
            "networking",
            "push-notification-client"
        ],
        "policy_version": 16.04
    }

Далее нам нужно внести изменения в Qml. Добавляем компонент pushclient:

//...

import Ubuntu.PushNotifications 0.1

//...

PushClient {
        id: pushClient
        appId: "myapp.yourname_hookname"
        onTokenChanged: console.log("👍", pushClient.token)
}

Необходимо указать правильный appId! Если имя приложения в файле манифеста - myapp.yourname, а имя основного обработчика (которое обрабатывает файл .desktop) - это имя_хука, тогда appId будет такой: myapp.yourname_hookname. Когда мы запустим приложение, оно получит токен и запишет его в лог-файл. Из лог-файлов для clickable можно скопировать этот токен в терминале. Но приложение еще не готово для получения push-уведомления. Для этого нам понадобится pushhelper!

Реализация pushhelper

Pushhelper - это часть приложения, которая будет получать все push-уведомления и обрабатывать их перед отправкой в центр системных уведомлений. Pushhelper получит json-файл и должен вывести другой json-файл в правильном формате. Pushhelper отделен от приложения. Итак, нам нужен новый hook в файле manifest. Это может выглядеть так:

    {
        //...

        "title": "myapp",
        "hooks": {
            "myapp": {
                "apparmor": "myapp.apparmor",
                "desktop":  "myapp.desktop"
            },
            "push": {
                "apparmor": "push-apparmor.json",
                "push-helper": "push.json"
            }
        },

        //...
    }

It should be clear that we now need a different apparmor file and a different executable file. The push-apparmor.json file must only contain the policy group push-notification-client and should look like this:

{
    "template": "ubuntu-push-helper",
    "policy_groups": [
        "push-notification-client"
    ],
    "policy_version": 16.04
}

The push.json is for redirecting to the executable file:

{
    "exec": "pushexec"
}

In our tutorial we will use python to create a executable named pushexec which will forward the notification without changing anything:

#!/usr/bin/python3

import sys

f1, f2 = sys.argv[1:3]

open(f2, "w").write(open(f1).read())

We also need to add this new files to the CMakeLists.txt and make the pushexec executable:

[…]

install(FILES pushexec PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ DESTINATION ${DATA_DIR})
install(FILES push.json DESTINATION ${DATA_DIR})
install(FILES push-apparmor.json DESTINATION ${DATA_DIR})

[…]

Теперь приложение готово для получения и обработки push-уведомлений!

Использование API сервиса Push

Теперь у нас есть токен, и приложение готово для получения и обработки push-уведомлений. Чтобы отправить уведомление, нужно отправить HTTP-запрос по этому адресу: https://push.ubports.com/notify. Тип содержимого должен быть application/json в соответствующем формате. Пример в javascript может выглядеть так:

var req = new XMLHttpRequest();
req.open("post", "https://push.ubports.com/notify", true);
req.setRequestHeader("Content-type", "application/json");
req.onreadystatechange = function() {
        if ( req.readyState === XMLHttpRequest.DONE ) {
                        console.log("✍ Answer:", req.responseText);
        }
}
var approxExpire = new Date ();
approxExpire.setUTCMinutes(approxExpire.getUTCMinutes()+10);
req.send(JSON.stringify({
        "appid" : "appname.yourname_hookname",
        "expire_on": approxExpire.toISOString(),
        "token": "aAnqwiFn§DF%2",
        "data": {
                "notification": {
                        "card": {
                                "icon": "notification",
                                "summary": "Push Notification",
                                "body": "Hello world",
                                "popup": true,
                                "persist": true
                        },
                "vibrate": true,
                "sound": true
                }
        }
}));

Объект Push Notification

Параметр

Тип

Описание

appid

строка

Обязательный параметр. ID приложения, которое получит уведомление,
как это описано в документации для клиентской части.

expire_on

строка

Обязательный параметр. Срок (время и дата) истечения для этого сообщения, в
формате ISO8601 Extendendformat.

token

строка

Обязательный параметр. Токен, идентифицирующий пользователя и устройство, которому предназначено сообщение
как это описано в клиентской части документации.

clear_pending

bool

Отменяет все предыдущие ожидающие уведомления. Обычно в ответ на
ошибку «too-many-pending». По умолчанию отключена.

replace_tag

строка

Если есть ожидающее уведомление с тем же тегом, удалите его
в очереди появится это новое сообщение.

data

Данные

Объект JSON. Содержимое поля данных является произвольным. Мы можем использовать
его для отправки любых данных в приложение.

Данные

Параметр

Тип

Описание

notification

Уведомление

Объект JSON, который определяет, как будет представлено это уведомление.

message

объект

Объект JSON, который передается приложению в состоянии «как есть» через PopAll.

Уведомление

Параметр

Тип

Описание

tag

строка

Тэг push-уведомления.

sound

логическая опция или путь к объекту

Эта опция или задается логически (воспроизведение предустановленной мелодии), или
путь к звуковому файлу. Пользователь может выключить опцию, поэтому не доверяйте
этой опции полностью. По умолчанию отключена (звука нет). Путь
относительный, и будет задаваться (a) в разделе настроек приложения
.local/share/<pkgname>, и (b) в стандартных директориях xdg.

vibrate

bool или Вибрация

В уведомлении может содержаться поле для вибрации, вызывающей тактильную
обратную связь, опция может быть логической (если активирована, идет вибрация
в заранее заданном режиме) или может быть выбран готовый объект.

еmblem-счетчика

Эмблема-счетчик

Объект JSON, который определяет, как отображать эмблему
счетчика.

card

Карточка

Объект JSON с информацией о карточке уведомления.

Карточка

Параметр

Тип

Описание

summary

строка

Обязательно к заполнению. Карточка не будет видна, если это поле
не заполнено.

body

строка

Более длинный текст, пустой по умолчанию.

actions

массив

Если пустое (по умолчанию), нажатие на bubble notification
не даёт ничего. Если Вы добавите адрес URL, то bubble notifications
становятся активными и позволяют открыть этот URL. Один из способов это использовать -
a URL like appid://com.ubuntu.developer.ralsina.hello
это позволит переключиться на приложение или запустит его.

icon

строка

Иконка относится к событию, к которому относится уведомление. По умолчанию,
значение пустое (иконка отсутствует); дополнительная иконка относится к приложению
будет также отображаться, независимо от настроек этого поля.

timestamp

integer - целое число

Секунды, прошедшие с начала эпохи Unix, пока используются только для сохранения.
Если значение не задано или нулевое, то используется текущая временная отметка.

persist

bool

показывать ли в центре уведомлений; по умолчанию отключено.

popup

bool

Показывать ли в bubble notification. Пользователи могут отключить это, и могут
легко отключить их, поэтому не нужно полагаться на эту опцию. Значения по умолчанию -
опция отключена.

Вибрация

Параметр

Тип

Описание

pattern

массив

Список переменных, описывающих схемы вибрации (длительность периодов
вибраций или её отсутствие - время в милисекундах).

repeat

integer - целое число

Сколько раз будет повторяться выбранняя модель (по умолчанию установлен 1 раз, 0 -
тоже самое, что и 1).

Эмблема-счетчик

Параметр

Тип

Описание

count

integer - целое число

Число, отображаемое над значком приложения в панели запуска (launcher).

visible

bool

Установите значение true, чтобы показать счетчик, или false, чтобы скрыть его.

References

See the documentation of the Lomiri Push Service.