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:
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.
Necesitarás o token para enviar unha notificación push. Así, o aplicativo envía o seu token ao servidor do programador de aplicativos.
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.helloque 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.