Notificacións push

Supoñamos que ten un aplicativo creado con Clickable e publicado en OpenStore. Pero agora quere enviar notificacións push aos seus usuarios. Primeiro de todo, debes entender como funciona isto:

../../_images/Diagram.png
  1. Cada aplicación que usa notificacións push ten un token único. Este token identifica ao usuario, ao dispositivo e ao propio aplicativo. O token é xerado polo servizo push de UBports.

  2. Necesitarás o token para enviar unha notificación push. Así, o aplicativo envía o seu token ao servidor do programador de aplicativos.

  3. Coa ficha pode enviar unha solicitude HTTP ao servidor push de UBports que reenviará a notificación ao dispositivo do usuario.

Practicemos este paso a paso.

Nota

No seguinte exemplo non implementaremos un servidor. Tamén a comunicación entre o teu aplicativo e o teu servidor depende de ti. Informe ao usuario sobre a comunicación co seu servidor proporcionando unha política de privacidade!

Prepara o aplicativo para as notificacións push

Implementando o PushClient

Primeiro necesitamos engadir o grupo de políticas «push-notification-client». O seu ficheiro apparmor podería ter este aspecto:

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

No seguinte paso necesitamos modificar as partes Qml. Necesitamos engadir un compoñente pushclient:

//...

import Ubuntu.PushNotifications 0.1

//...

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

Debe configurar o appId correcto. Se o nome do aplicativo no ficheiro manifesto é myapp.yourname e o nome do gancho principal (o que manexa o ficheiro .desktop) é hookname, entón o ID do aplicativo é: myapp.yourname_hookname. Cando iniciamos o aplicativo, obterá un token e imprimirá este token nos rexistros. Cos rexistros que se poden premer poderemos copiar este token do terminal. Pero o aplicativo aínda non está preparada para recibir unha notificación push. Para iso precisamos algo chamado axudante!

Implementando o axudante push

O pushhelper é unha parte do aplicativo que recibirá todas as notificacións push e as procesará antes de envialas ao centro de notificacións do sistema. Recibirá un ficheiro json e deberá emitir outro ficheiro json no formato correcto. O pushhelper está separado do aplicativo. Así que necesitamos un novo enganche no manifesto. Podería ter o seguinte aspecto:

    {
        //...

        "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})

[…]

Agora o aplicativo está preparado para recibir e procesar notificacións push!

Usando a API de servizo Push

Agora tes o token e o aplicativo está preparado para recibir e procesar notificacións push. Para enviar unha notificación, debe enviar unha solicitude HTTP a este enderezo: https://push.ubports.com/notify O tipo de contido debe ser application / json e debe encaixar no formato correcto. Un exemplo en javascript podería ter este aspecto:

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
                }
        }
}));

Envío de notificacións

Parámetro

Tipo

Descrición

appid

cadea

Obrigatorio. ID do aplicativo que recibirá a notificación,
como se describe na documentación do lado do cliente.

expire_on

cadea

Obrigatorio. Data / hora de caducidade desta mensaxe, en

token

cadea

Obrigatorio. O token que identifica o usuario + dispositivo ao que está a mensaxe
dirixido, como se describe na documentación do lado do cliente.

clear_pending

bool

Descarta todas as notificacións pendentes anteriores. Normalmente en resposta a
obtendo un erro «demasiados pendentes». O valor predeterminado é falso.

replace_tag

cadea

Se hai unha notificación pendente coa mesma etiqueta, elimínaa antes
facendo cola neste novo.

datos

Datos

Un obxecto JSON. O contido do campo de datos é arbitrario. Podemos usalo
para enviar calquera dato ao aplicativo.

Datos

Parámetro

Tipo

Descrición

notificación

Notificación

Un obxecto JSON que define como se presentará esta notificación.

mensaxe

obxecto

Un obxecto JSON que se pasa tal cal ao aplicativo a través de PopAll.

Notificación

Parámetro

Tipo

Descrición

etiqueta

cadea

A etiqueta da notificación push.

son

bool ou cadea

Este é un booleano (reproduce un son predeterminado) ou o
Este é un booleano (reproduce un son predeterminado) ou o
sobre el exclusivamente. Os valores predeterminados son baleiros (sen son). A ruta é
parente e buscarase no aplicativo de
.local/share/<pkgname>, and (b) standard xdg dirs.

vibrar

bool ou Vibrar

A notificación pode conter un campo vibratorio, o que pode causar háptica
comentarios, que poden ser booleanos (se é verdadeiro, vibran a
forma predeterminada) ou un obxecto Vibrar.

emblem-counter

Emblem-counter

Un obxecto JSON, que define como amosar o emblema
contas.

tarxeta

Tarxeta

Un obxecto JSON con información sobre a tarxeta de notificación.

Tarxeta

Parámetro

Tipo

Descrición

resumo

cadea

Obrigatorio. Un título. A tarxeta non se presentará se é así
perdido.

corpo

cadea

Texto máis longo, por defecto baleiro.

accións

taboleiro

Se está baleiro (o predeterminado), unha notificación de burbulla é
non se pode premer. Se engades un URL, entón notificacións de burbullas
pódese premer e lanzar ese URL. Un uso para isto é o uso
un URL como appid://com.ubuntu.developer.ralsina.hello
que cambiará ao aplicativo ou a iniciará.

icona

cadea

Unha icona relacionada co evento que se notifica. Por omisión
baleiro (sen icona); unha icona secundaria relacionada co aplicativo
tamén se amosará, independentemente deste campo.

timestamp

enteiro

Segundos desde a época de Unix, só se usan para persistir por agora.
Se é cero ou non se define, a marca de tempo actual é a predeterminada.

persistir

bool

Se é amosada no centro de notificacións; por omisión é falso.

elemento emerxente

bool

Se é amosada nunha burbulla. Os usuarios poden desactivar isto e poden
bótaos de menos facilmente, así que non confíes nel exclusivamente. Valores predeterminados
para falso.

Vibrar

Parámetro

Tipo

Descrición

patrón

taboleiro

Unha lista de números enteiros que describen un patrón de vibración (duración da alternancia
tempos de vibración / sen vibración, en milisegundos).

repetir

enteiro

Número de veces que se debe repetir o patrón (por defecto 1, 0 é o
igual a 1).

Contador de emblemas

Parámetro

Tipo

Descrición

conta

enteiro

Número que se amosará sobre a icona do aplicativo no iniciador.

visible

bool

Configure como verdadeiro para mostrar o contador ou falso para ocultalo.

Referencias

See the documentation of the Lomiri Push Service.