Notificacions d’inserció

Suposem que teniu una aplicació creada amb Clickable i publicada a l’OpenStore. Però ara voleu poder enviar notificacions Push als vostres usuaris. En primer lloc, cal entendre com funciona això:

../../_images/Diagram.png
  1. Cada aplicació que utilitza notificacions push té un token únic. Aquest token identifica l’usuari, el dispositiu i la pròpia aplicació. La fitxa la genera el Servei de Push d’UBports.

  2. Necessitaràs el testimoni per enviar una notificació push. Així que l’aplicació envia el seu testimoni al servidor del desenvolupador d’aplicacions.

  3. Amb el token podeu enviar una sol·licitud HTTP al Servidor Push d’UBports que reenviarà la notificació al dispositiu de l’usuari.

Practiquem pas a pas.

Nota

En el següent exemple no implementarem un servidor. També la comunicació entre la teva app i el teu servidor depèn de tu. Si us plau, informeu l’usuari sobre la comunicació amb el vostre servidor proporcionant una política de privacitat!

Fes que l’aplicació estigui llesta per a notificacions push

Implementació del PushClient

Primer hem d’afegir el grup de polítiques «push-notification-client». El fitxer apparmor podria ser així:

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

En el següent pas hem de modificar les parts Qml. Cal afegir un component pushclient:

//...

import Ubuntu.PushNotifications 0.1

//...

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

Heu d’establir el appId correcte! Si el nom de l’aplicació del vostre fitxer manifest és myapp.yourname i el nom del ganxo principal (el que gestiona el fitxer .desktop) és hookname, llavors el appId és: myapp.yournamehookname. Quan comencem ara l’aplicació, obtindrà un token i imprimirà aquest token als registres. Amb els registres clicables podrem copiar aquest testimoni fora del terminal. Però l’aplicació encara no està preparada per rebre una notificació push. Per a això necessitem alguna cosa que es diu pushhelper!

Implementació de l’ajudant push

El pushhelper és una part de l’aplicació que rebrà totes les notificacions push i les processarà abans d’enviar-les al centre de notificacions del sistema. Rebrà un fitxer json i haurà de generar un altre fitxer json en el format correcte. L’ajudant està separat de l’aplicació. Així que necessitem un nou ganxo en el manifest. Podria semblar així:

    {
        //...

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

        //...
    }

Hauria de quedar clar que ara necessitem un fitxer de apparmor diferent i un fitxer executable diferent. El fitxer push-apparmor.json només ha de contenir el grup de polítiques push-notification-client i hauria de tenir aquest aspecte:

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

El push.json és per a redirigir al fitxer executable:

{
    "exec": "pushexec"
}

En el nostre tutorial utilitzarem python per a crear un executable anomenat pushexec que reenviarà la notificació sense canviar res:

#!/usr/bin/python3

import sys

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

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

També hem d’afegir aquests nous fitxers al CMakeLists.txt i fer que el pushexec sigui 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})

[…]

Ara l’aplicació està llesta per rebre i processar notificacions push!

Ús de l’API del servei Push

Així que ara tens el token i l’aplicació està llesta per rebre i processar notificacions push. Per enviar una notificació, cal enviar una sol·licitud HTTP a aquesta adreça: https://push.ubports.com/notify El tipus de contingut ha de ser application/json i ha d’ajustar-se al format correcte. Un exemple en javascript podria ser així:

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

Notificacions d’inserció

Paràmetre

Tipus

Descripció

appid

cadena

Requerit. ID de l’aplicació que rebrà la notificació,
tal com es descriu a la documentació del costat del client.

expireon

cadena

Requerit. Data/hora de venciment d’aquest missatge, a
.ISO8601 Extendendformat <https://www.w3.org/TR/NOTE-datetime>..

token

cadena

Requerit. El testimoni que identifica l’usuari+dispositiu al qual el missatge és
dirigit, tal com es descriu a la documentació del costat del client.

neteja

bool

Descarta totes les notificacions pendents anteriors. Normalment en resposta a
s’està obtenint un error «massa pendent». Per defecte és fals.

reemplaça etiqueta

cadena

Si hi ha una notificació pendent amb la mateixa etiqueta, esborra-la abans
fent cua a aquest nou.

dades

Dades

Un objecte JSON. Els continguts del camp de dades són arbitraris. Podem utilitzar
per enviar qualsevol dada a l’app.

Dades

Paràmetre

Tipus

Descripció

Notificacions d’inserció

Notificacions d’inserció

Un objecte JSON que defineix com es presentarà aquesta notificació.

missatge

objecte

Un objecte JSON que es passa tal com és a l’aplicació a través de PopAll.

Notificacions d’inserció

Paràmetre

Tipus

Descripció

etiqueta

cadena

L’etiqueta de les notificacions push.

so

bool o cadena

Això és booleà (tocar un so predeterminat) o el
Camí a un fitxer de so. L’usuari pot desactivar-lo, així que no confiïs
en ella exclusivament. Per defecte està buit (sense so). El camí és
relatiu, i se cercarà a (a) les
.local/share/<pkgname>, i (b) directoris xdg estàndard.

vibra

booleà o vibrat

La notificació pot contenir un camp de vibració, causant haptic
retroalimentació, que pot ser booleà (si és cert, vibra a
via predeterminada) o un objecte Vibrat.

emblem-counter

Emblem-counter

Un objecte JSON, que defineix com mostrar l’emblema
compador.

targeta

Targeta

Un objecte JSON amb informació sobre la targeta de notificació.

Targeta

Paràmetre

Tipus

Descripció

resum

cadena

Requerit. Un títol. La targeta no es presentarà si és
Falta.

cos

cadena

Text més llarg, per defecte buit.

ubicació

matriu

Si està buit (per defecte), una notificació de bombolla és
no es pot fer clic. Si afegiu un URL, llavors les notificacions de bombolles
es pot fer clic i llançar aquest URL. Un ús per a això és l’ús
un URL com appid://com.ubuntu.developer.ralsina.hello
que canviarà a l’app o la llançarà.

icona

cadena

Una icona relacionada amb l’esdeveniment que s’està notificant. Per defecte a
buit (sense icona); una icona secundària relacionada amb l’aplicació
També es mostrarà, independentment d’aquest camp.

marca horària

enter

Segons des de l’època unix, només s’utilitza per a persistir per ara.
Si és zero o no s’estableix, per defecte es marca el temps actual.

persistència

bool

Si s’ha de mostrar al centre de notificacions; per defecte és fals.

emergent

bool

Si s’ha de mostrar en una bombolla. Els usuaris poden desactivar-ho i poden
fàcilment es perden, així que no confieu en ell exclusivament. Per defecte
a fals.

Vibra

Paràmetre

Tipus

Descripció

patró

matriu

Una llista d’enters que descriuen un patró de vibració (duració de l’alternança
vibració/sense temps de vibració, en mil·lisegons).

repeteix

enter

Nombre de vegades que el patró s’ha de repetir (per defecte 1, 0 és el
igual que 1).

Emblema-component

Paràmetre

Tipus

Descripció

Comptes

enter

Un número que es mostrarà sobre la icona de l’aplicació al llançador.

visible

bool

Establiu-ho a «true» (cert) per a mostrar el comptador, o «false» (fals) per a ocultar-lo.

Referències

Vegeu la documentació del Servei de Push de Lomiri.