ການແຈ້ງເຕືອນແບບ Push

ສົມມຸດວ່າທ່ານມີແອັບທີ່ສ້າງດ້ວຍ Clickable ແລະ ເຜີຍແຜ່ໃນ OpenStore. ແຕ່ຕອນນີ້ທ່ານຕ້ອງການສົ່ງການແຈ້ງເຕືອນແບບ Push ໃຫ້ຜູ້ໃຊ້ຂອງທ່ານ. ກ່ອນອື່ນໝົດ, ທ່ານຕ້ອງເຂົ້າໃຈວິທີການເຮັດວຽກຂອງມັນ:

../../_images/Diagram.png
  1. ທຸກໆແອັບທີ່ໃຊ້ການແຈ້ງເຕືອນແບບ Push ຈະມີໂໂເຄັນ (token) ທີ່ບໍ່ຊ້ຳກັນ. ໂທເຄັນນີ້ລະບຸຜູ້ໃຊ້, ອຸປະກອນ ແລະ ຕົວແອັບເອງ. ໂທເຄັນຖືກສ້າງຂຶ້ນໂດຍ UBports Push Service.

  2. ທ່ານຈະຕ້ອງການໂທເຄັນເພື່ອສົ່ງການແຈ້ງເຕືອນແບບ Push. ດັ່ງນັ້ນ ແອັບຈຶ່ງສົ່ງໂທເຄັນຂອງມັນໄປຍັງເຊີບເວີຂອງຜູ້ພັດທະນາແອັບ.

  3. ດ້ວຍໂທເຄັນນັ້ນ ທ່ານສາມາດສົ່ງຄຳຮ້ອງຂໍ HTTP ໄປຍັງ UBports Push Server ເຊິ່ງຈະສົ່ງຕໍ່ການແຈ້ງເຕືອນໄປຍັງອຸປະກອນຂອງຜູ້ໃຊ້.

ມາຝຶກເຮັດໄປເທື່ອລະຂັ້ນຕອນ.

Note

ໃນຕົວຢ່າງຕໍ່ໄປນີ້ ພວກເຮົາຈະບໍ່ຕິດຕັ້ງເຊີບເວີ. ນອກຈາກນີ້ ການສື່ສານລະຫວ່າງແອັບຂອງທ່ານ ແລະ ເຊີບເວີຂອງທ່ານແມ່ນຂຶ້ນກັບທ່ານ. ກະລຸນາແຈ້ງຜູ້ໃຊ້ກ່ຽັບການສື່ສານກັບເຊີບເວີຂອງທ່ານ ໂດຍການສະໜອງນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ!

ເຮັດໃຫ້ແອັບພ້ອມສຳລັບການແຈ້ງເຕືອນແບບ Push

ການນຳໃຊ້ PushClient

ທຳອິດພວກເຮົາຕ້ອງເພີ່ມກຸ່ມນະໂຍບາຍ "push-notification-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 ໃຫ້ຖືກຕ້ອງ! ຖ້າຊື່ແອັບໃນໄຟລ໌ manifest ຂອງທ່ານແມ່ນ myapp.yourname ແລະ ຊື່ຂອງ hook ຫຼັກ (ອັນທີ່ຈັດການໄຟລ໌ .desktop) ແມ່ນ hookname, ດັ່ງນັ້ນ appId ແມ່ນ: myapp.yourname_hookname. ເມື່ອພວກເຮົາເລີ່ມແອັບ, ມັນຈະໄດ້ຮັບໂທເຄັນ ແລະ ສະແດງໂທເຄັນນີ້ໃນບັນທຶກ (logs). ດ້ວຍ clickable logs ພວກເຮົາຈະສາມາດ copy ໂທເຄັນນີ້ອອກຈາກ terminal. ແຕ່ແອັບຍັງບໍ່ພ້ອມທີ່ຈະຮັບການແຈ້ງເຕືອນແບບ push ເທື່ອ. ສຳລັບສິ່ງນີ້ ພວກເຮົາຕ້ອງການສິ່ງທີ່ເອີ້ນວ່າ pushhelper!

ການນຳໃຊ້ pushhelper

The pushhelper ແມ່ນສ່ວນໜຶ່ງຂອງແອັບທີ່ຈະຮັບການແຈ້ງເຕືອນແບບ push ທັງໝົດ ແລະ ປະມວນຜົນພວກມັນກ່ອນທີ່ຈະສົ່ງໄປຍັງສູນການແຈ້ງເຕືອນຂອງລະບົບ. ມັນຈະຮັບໄຟລ໌ json ແລະ ຕ້ອງສົ່ງອອກໄຟລ໌ json ອີກອັນໜຶ່ງໃນຮູບແບບທີ່ຖືກຕ້ອງ. pushhelper ຖືກແຍກອອກຈາກແອັບ. ດັ່ງນັ້ນພວກເຮົາຕ້ອງການ hook ໃໝ່ໃນ manifest. ມັນອາດຈະມີລັກສະນະດັ່ງນີ້:

    {
        //...

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

        //...
    }

ມັນຄວນຈະຊັດເຈນວ່າຕອນນີ້ພວກເຮົາຕ້ອງການໄຟລ໌ apparmor ທີ່ແຕກຕ່າງ ແລະ ໄຟລ໌ executable ທີ່ແຕກຕ່າງ. ໄຟລ໌ push-apparmor.json ຕ້ອງມີພຽງແຕ່ກຸ່ມນະໂຍບາຍ push-notification-client ແລະ ຄວນມີລັກສະນະດັ່ງນີ້:

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

push.json ແມ່ນສຳລັບການປ່ຽນເສັ້ນທາງໄປຍັງໄຟລ໌ executable:

{
    "exec": "pushexec"
}

ໃນບົດຮຽນຂອງພວກເຮົາ ພວກເຮົາຈະໃຊ້ python ເພື່ອສ້າງ executable ທີ່ມີຊື່ວ່າ pushexec ເຊິ່ງຈະສົ່ງຕໍ່ການແຈ້ງເຕືອນໂດຍບໍ່ປ່ຽນແປງຫຍັງເລີຍ:

#!/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 ແລ້ວ!

ການໃຊ້ Push Service API

ດັ່ງນັ້ນຕອນນີ້ທ່ານມີໂທເຄັນ ແລະ ແອັບກໍພ້ອມທີ່ຈະຮັບ ແລະ ປະມວນຜົນການແຈ້ງເຕືອນແບບ push. ເພື່ອສົ່ງການແຈ້ງເຕືອນ, ທ່ານຕ້ອງສົ່ງຄຳຮ້ອງຂໍ HTTP ໄປທີ່ທີ່ຢູ່ນີ້: https://push.ubports.com/notify ປະເພດເນື້ອຫາ (content-type) ຕ້ອງເປັນ 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 (Push Notification Object)

ພາລາມິເຕີ

ປະເພດ

ຄຳອະທິບາຍ

appid

string

ຈຳເປັນ. ລະຫັດ (ID) ຂອງແອັບພລິເຄຊັນທີ່ຈະຮັບການແຈ້ງເຕືອນ,
ຕາມທີ່ອະທິບາຍໄວ້ໃນເອກະສານຝັ່ງ client.

expire_on

string

ຈຳເປັນ. ວັນທີ/ເວລາໝົດອາຍຸສຳລັບຂໍ້ຄວາມນີ້, ໃນ

token

string

ຈຳເປັນ. ໂທເຄັນທີ່ລະບຸຜູ້ໃຊ້+ອຸປະກອນ ທີ່ຈະສົ່ງຂໍ້ຄວາມໄປຫາ,
ຕາມທີ່ອະທິບາຍໄວ້ໃນເອກະສານຝັ່ງ client.

clear_pending

bool

ລຶບການແຈ້ງເຕືອນທີ່ຄ້າງຢູ່ກ່ອນໜ້ານີ້ທັງໝົດ. ໂດຍປົກກະຕິແມ່ນເພື່ອຕອບສະໜອງຕໍ່
ການໄດ້ຮັບຂໍ້ຜິດພາດ "too-many-pending" (ຄ້າງຢູ່ຫຼາຍເກີນໄປ). ຄ່າເລີ່ມຕົ້ນແມ່ນ false.

replace_tag

string

ຖ້າມີການແຈ້ງເຕືອນທີ່ຄ້າງຢູ່ທີ່ມີ tag ດຽວກັນ, ໃຫ້ລຶບມັນອອກກ່ອນ
ທີ່ຈະຈັດຄິວອັນໃໝ່ນີ້.

data

Data

ວັດຖຸ JSON. ເນື້ອຫາຂອງ data field ແມ່ນຕາມໃຈມັກ. ພວກເຮົາສາມາດໃຊ້
ມັນເພື່ອສົ່ງຂໍ້ມູນໃດໆໄປຍັງແອັບໄດ້.

Data

ພາລາມິເຕີ

ປະເພດ

ຄຳອະທິບາຍ

notification

Notification

ວັດຖຸ JSON ທີ່ກຳນົດວ່າການແຈ້ງເຕືອນນີ້ຈະຖືກສະແດງແນວໃດ.

message

object

ວັດຖຸ JSON ທີ່ຖືກສົ່ງໄປຍັງແອັບພລິເຄຊັນຕາມສະພາບເດີມ ຜ່ານ PopAll.

Notification

ພາລາມິເຕີ

ປະເພດ

ຄຳອະທິບາຍ

tag

string

Tag ຂອງການແຈ້ງເຕືອນແບບ push.

sound

bool ຫຼື string

ນີ້ແມ່ນ boolean (ຫຼິ້ນສຽງທີ່ກຳນົດໄວ້ລ່ວງໜ້າ) ຫຼື
path ໄປຫາໄຟລ໌ສຽງ. ຜູ້ໃຊ້ສາມາດປິດມັນໄດ້, ດັ່ງນັ້ນຢ່າເພິ່ງພາ
ມັນພຽງຢ່າງດຽວ. ຄ່າເລີ່ມຕົ້ນແມ່ນຫວ່າງເປົ່າ (ບໍ່ມີສຽງ). Path ແມ່ນ
relative (ສຳພັດ), ແລະ ຈະຖືກຊອກຫາໃນ (a) ຂອງແອັບພລິເຄຊັນ
.local/share/<pkgname>, ແລະ (b) standard xdg dirs.

vibrate

bool ຫຼື Vibrate

ການແຈ້ງເຕືອນສາມາດມີ vibrate field, ເຊິ່ງເຮັດໃຫ້ເກີດການສັ່ນເຕືອນ
haptic, ເຊິ່ງສາມາດເປັນ boolean (ຖ້າ true, ສັ່ນ
ຕາມແບບທີ່ກຳນົດໄວ້ລ່ວງໜ້າ) ຫຼື ວັດຖຸ Vibrate.

emblem-counter

Emblem-counter

ວັດຖຸ JSON, ເຊິ່ງກຳນົດວິທີການສະແດງ emblem
counter (ຕົວນັບ).

card

Card

ວັດຖຸ JSON ທີ່ມີຂໍ້ມູນກ່ຽວກັບບັດການແຈ້ງເຕືອນ.

Card

ພາລາມິເຕີ

ປະເພດ

ຄຳອະທິບາຍ

summary

string

ຈຳເປັນ. ຫົວຂໍ້. ບັດຈະບໍ່ຖືກສະແດງຖ້າບໍ່ມີ
ສິ່ງນີ້.

body

string

ຂໍ້ຄວາມທີ່ຍາວກວ່າ, ຄ່າເລີ່ມຕົ້ນແມ່ນຫວ່າງເປົ່າ.

actions

array

ຖ້າຫວ່າງເປົ່າ (ຄ່າເລີ່ມຕົ້ນ), ການແຈ້ງເຕືອນແບບ bubble ຈະ
ກົດບໍ່ໄດ້. ຖ້າທ່ານເພີ່ມ URL, ການແຈ້ງເຕືອນແບບ bubble
ຈະສາມາດກົດໄດ້ ແລະ ເປີດ URL ນັ້ນ. ການນຳໃຊ້ໜຶ່ງສຳລັບສິ່ງນີ້ແມ່ນການໃຊ້
a URL ເຊັ່ນ appid://com.ubuntu.developer.ralsina.hello
ເຊິ່ງຈະສະຫຼັບໄປຫາແອັບ ຫຼື ເປີດມັນຂຶ້ນມາ.

icon

string

ໄອຄອນທີ່ກ່ຽວຂ້ອງກັບເຫດການທີ່ຖືກແຈ້ງເຕືອນ. ຄ່າເລີ່ມຕົ້ນແມ່ນ
ຫວ່າງເປົ່າ (ບໍ່ມີໄອຄອນ); ໄອຄອນສຳຮອງທີ່ກ່ຽວຂ້ອງກັບແອັບພລິເຄຊັນ
ຈະຖືກສະແດງເຊັ່ນກັນ, ໂດຍບໍ່ສົນໃຈ field ນີ້.

timestamp

ຈຳນວນຖ້ວນ (integer)

ວິນາທີນັບຕັ້ງແຕ່ unix epoch, ໃຊ້ສຳລັບ persist ເທົ່ານັ້ນໃນຕອນນີ້.
ຖ້າເປັນສູນ ຫຼື ບໍ່ໄດ້ຕັ້ງຄ່າ, ຄ່າເລີ່ມຕົ້ນແມ່ນ timestamp ປັດຈຸບັນ.

persist

bool

ຈະສະແດງໃນສູນການແຈ້ງເຕືອນຫຼືບໍ່; ຄ່າເລີ່ມຕົ້ນແມ່ນ false.

popup

bool

ຈະສະແດງໃນ bubble ຫຼືບໍ່. ຜູ້ໃຊ້ສາມາດປິດສິ່ງນີ້ໄດ້, ແລະ ສາມາດ
ພາດພວກມັນໄດ້ງ່າຍ, ດັ່ງນັ້ນຢ່າເພິ່ງພາມັນພຽງຢ່າງດຽວ. ຄ່າເລີ່ມຕົ້ນ
ແມ່ນ false.

Vibrate

ພາລາມິເຕີ

ປະເພດ

ຄຳອະທິບາຍ

pattern

array

ລາຍຊື່ຂອງຈຳນວນຖ້ວນທີ່ອະທິບາຍຮູບແບບການສັ່ນ (ໄລຍະເວລາຂອງການສັ່ນສະຫຼັບກັນ
/ເວລາບໍ່ສັ່ນ, ເປັນ milliseconds).

repeat

ຈຳນວນຖ້ວນ (integer)

ຈຳນວນຄັ້ງທີ່ຮູບແບບຕ້ອງຖືກເຮັດຊ້ຳ (ຄ່າເລີ່ມຕົ້ນແມ່ນ 1, 0 ແມ່ນ
ຄືກັນກັບ 1).

Emblem-Counter

ພາລາມິເຕີ

ປະເພດ

ຄຳອະທິບາຍ

count

ຈຳນວນຖ້ວນ (integer)

ຕົວເລກທີ່ຈະສະແດງຢູ່ເທິງໄອຄອນຂອງແອັບພລິເຄຊັນໃນ launcher.

visible

bool

ຕັ້ງເປັນ true ເພື່ອສະແດງຕົວນັບ, ຫຼື false ເພື່ອເຊື່ອງມັນ.

ເອກະສານອ້າງອີງ

ເບິ່ງເອກະສານຂອງ Lomiri Push Service.