Учимся отправлять уведомления в Sailfish OS

Итак, по ходу разработки приложений в sailfish необходимо достаточно часто вызывать уведомления. Мне помогли реализовать данный функционал, а я расскажу Вам. Итак...что должно получиться в итоге:
Учимся отправлять уведомления в Sailfish OS

Если кратко то техзадание такое:
1 - Программа должна при нажатии на какую то кнопку высылать уведомления
2 - При нажатии на уведомление должно открываться окно

Итак приступим.

Открываем Sailfush OS SDK создаём простое приложение. Назовём его SimpleNotify. Да очень оригинально.
Так как уведомления работают через DBUS (подробнее об этом тут) то в первую очередь импортируем поддержку dbus
Код QML:
  1. import org.nemomobile.dbus 2.0

Пишем обработчик

Создаём DBusAdaptor который будет связывать действия с уведомлениями с нашим приложением
Код QML:
  1. DBusAdaptor{
  2. id: dbus
  3.  
  4. service: "ru.omprussia.notify"
  5. iface: "ru.omprussia.notify"
  6. path: "/ru/omprussia/notify"
  7.  
  8. xml: ' <interface name="com.omprussia.notify">' +
  9. ' <method name="activateApp">' +
  10. ' <arg name="message" type="s" direction="in"/>' +
  11. ' </method>' +
  12. ' </interface>'
  13.  
  14. function activateApp(message)
  15. {
  16. app.label = message
  17. app.activate();
  18. }
  19. }
Разберём подробнее что мы тут натворили. Если с id всё понятно то service/iface/path это жуткие пути из DBus. Они должны быть уникальными для каждого приложения. Если не так, то поправьте меня.
Дальше идёт xml - описание содержимого необходимого для dbus.
особенно обратите внимание на параметры метода и аргумента - их может быть несколько для одного приложения. Для примера: если мы хотим показывать уведомления отдельно для лайков и комментариев то необходимо создать несколько методов с различным действием. С аргументами так же, имя тип и направление может быть различным. На данном этапе нам будет достаточно тип - строка (type="s") и направление в функцию (direction="in").
Функция внутри DBusAdaptor и есть обработчик метода. Всего лишь мы присваиваем заголовку сообщение из интерфейса, которое мы передадим чуть позже.
Кстати:
Необходимо добавить id к ApplicationWindow и добавить параметр к нему. Итоговый SimpleNotify будет выглядеть так:
Код QML:
  1. import QtQuick 2.0
  2. import Sailfish.Silica 1.0
  3. import org.nemomobile.dbus 2.0
  4. import "pages"
  5.  
  6. {
  7. id: app
  8. initialPage: Component { FirstPage { } }
  9. cover: Qt.resolvedUrl("cover/CoverPage.qml")
  10. allowedOrientations: Orientation.All
  11. _defaultPageOrientations: Orientation.All
  12.  
  13. property string label: qsTr("Hello Sailors")
  14.  
  15. DBusAdaptor{
  16. id: dbus
  17.  
  18. service: "ru.omprussia.notify"
  19. iface: "ru.omprussia.notify"
  20. path: "/ru/omprussia/notify"
  21.  
  22. xml: ' <interface name="ru.omprussia.notify">' +
  23. ' <method name="activateApp">' +
  24. ' <arg name="message" type="s" direction="in"/>' +
  25. ' </method>' +
  26. ' </interface>'
  27.  
  28. function activateApp(message)
  29. {
  30. app.label = message
  31. app.activate();
  32. }
  33. }
  34. }
  35.  
  36.  

Приводим код в порядок

Далее чуть поправим pages/FirstPage.qml для того чтобы корректно отображался наш app.label . Находим в нём Label и приводим к следующему виду:
Код QML:
  1. x: Theme.paddingLarge
  2. text: app.label
  3. color: Theme.secondaryHighlightColor
  4. font.pixelSize: Theme.fontSizeExtraLarge
  5. }
суть этой правки достаточно проста: текст берём из параметра app.label который мы добавили выше.

А теперь самая магия

Нам необходимо вызвать само уведомление. Будем его вызывать из обложки - так что открываем cover/CoverPage.qml и в первую очередь добавляем поддержку самих уведомлений:
Код QML:
  1. import org.nemomobile.notifications 1.0
Далее создаём уведомления:
Код QML:
  1. Notification{
  2. id: simpleNotify
  3. category: "x-nemo.example"
  4. summary: ""
  5. body: ""
  6. itemCount: 1
  7. remoteActions: [ {
  8. "name": "default",
  9. "service": "ru.omprussia.notify",
  10. "path": "/ru/omprussia/notify",
  11. "iface": "ru.omprussia.notify",
  12. "method": "activateApp",
  13. "arguments": [ "Hello OMP! You have notify" ]
  14. }]
  15. }
Имя, достаточно понятная переменная, сервис путь и интерфейс мы берём из написанного выше DBusAdaptor метод - тоже я думаю понятен - тот который мы объявляли там же. Аргументы - те данные которые получит функция.
Осталось только вызывать само уведомление. Задействуем CoverAction. Добавим немного кода:
Код QML:
  1. onTriggered: {
  2. simpleNotify.summary = "Hello OMP! You have notify"
  3. simpleNotify.publish()
  4. }
summary это тот текст который увидит пользователь. Ну и конечно же publish достаточно понятная функция - получим наше опубликованное уведомление при нажатии на которое откроется приложение.
Комментарии (0)

Нет комментариев. Ваш будет первым!

Copyright 2016-2024 NeoChapay