Importare da Content Hub e URLdispatcher#

"hooks": {
    "openstore": {
        "apparmor": "openstore/openstore.apparmor",
        "desktop": "openstore/openstore.desktop",
        "urls": "openstore/openstore.url-dispatcher",
        "content-hub": "openstore/openstore-contenthub.json"
    }
},

Nella guida precedente abbiamo visto un po come funziona Content Hub. In questa guida vedremo come funziona URLdispatcher e come maneggiare dati importati da Content Hub.

Gestire i dati dall’Hub dei contenuti#

../../_images/02ichu.png

Applicazione OpenStore da open-store.io#

Uno dei modi più semplici per testare un’applicazione è inviare un clic di prova a se stessi su Telegram e aprire il file del clic con OpenStore attraverso Content Hub:

../../_images/03ichu.png

Se si tocca l’applicazione OpenStore, questa verrà aperta e chiederà se si vuole installare il file click. Diamo un’occhiata al codice Main.qml dell’applicazione <https://github.com/UbuntuOpenStore/openstore-app/blob/master/openstore/Main.qml#L85>`_ per vedere come avviene:

Connections {
        target: ContentHub

        onImportRequested: {
            var filePath = String(transfer.items[0].url).replace('file://', '')
            print("Should import file", filePath)
            var fileName = filePath.split("/").pop();
            var popup = PopupUtils.open(installQuestion, root, {fileName: fileName});
            popup.accepted.connect(function() {
                contentHubInstallInProgress = true;
                PlatformIntegration.clickInstaller.installPackage(filePath)
            })
        }
}

Si vede l’elemento Connections che punta al ContentHub? Quando riceve il segnale onImportRequested, prenderà l’url dei dati inviati dal Content Hub (transfer.items[0].url è l’url dei primi dati inviati) e aprirà un elemento PopUp per consentire all’utente di installare il clic.

Che dire dell’URLdispatcher?#

L’URL dispatcher è un software, simile al Content Hub, che ci semplifica la vita cercando di scegliere l’applicazione corretta per un determinato protocollo. Ad esempio: Probabilmente vogliamo aprire il browser web quando tocchiamo un protocollo http. Se tocchiamo un link a una mappa è comodo aprirlo con uNav o aprire un link a Twitter nell’app Twitter! Come funziona?

L”URLdispatcher seleziona quale applicazione (in base al suo manifest.json) aprirà un determinato collegamento.

../../_images/05ichu.png

Vediamo come appare la nostra applicazione di navigazione all’interno. Il manifest di uNav mostra ganci speciali per l”``URLdispatcher”” nel suo codice manifest.json:

1  [
2     {
3         "protocol": "http",
4         "domain-suffix": "map.unav.me"
5     },
6     {
7         "protocol": "http",
8         "domain-suffix": "unav-go.github.io"
9     },
10    {
11        "protocol": "geo"
12    },
13    {
14        "protocol": "http",
15        "domain-suffix": "www.openstreetmap.org"
16    },
17    {
18        "protocol": "http",
19        "domain-suffix": "www.opencyclemap.org"
20    },
21    {
22        "protocol": "https",
23        "domain-suffix": "maps.google.com"
24    }
25 ]

Ciò significa che un link che assomiglia a http://map.unav.me/xxxxx,xxxxx verrà aperto in uNav. Questo è definito nelle righe 2 e 3, dove si cerca il protocollo http seguito da map.unav.me.

Inoltre, un URI formattato geo:xxx,xxx dovrebbe aprirsi in uNav, come è stato definito nella riga 11.

E come gestiamo l’URL ricevuto?#

Dopo che l”``URLdispatcher”” invia il link all’applicazione corrispondente, dobbiamo gestire l’URL o l’URI nell’applicazione mirata. Vediamo come fare:

Nel file qml principale, dobbiamo aggiungere del codice per sapere cosa fare con l’URL inviato. Verifichiamo come l’applicazione Linphone gestisce questo aspetto, aggiungendo una connessione al gestore di URI con un elemento Connections che imposta UriHandler come target.

Connections {
    target: UriHandler

    onOpened: {
        console.log('Open from UriHandler')

        if (uris.length > 0) {
            console.log('Incoming call from UriHandler ' + uris[0]);
            showIncomingCall(uris[0]);
        }
    }
}

Questo codice gestirà un URI nella forma linphone://sip:xxx@xxx.xx quando l’applicazione viene aperta. Ma cosa dobbiamo fare per gestire questo link quando l’applicazione viene chiusa?

Dobbiamo aggiungere un po” di codice extra che coprirà due casi: 1) Riceviamo un URL 2) Riceviamo più di un URL

Controlliamo se Qt.application.arguments non è vuoto e, in caso contrario, se qualche argomento corrisponde al nostro formato URI.

Component.onCompleted: {
    //Check if opened the app because we have an incoming call
    if (Qt.application.arguments && Qt.application.arguments.length > 0) {

        for (var i = 0; i < Qt.application.arguments.length; i++) {
            if (Qt.application.arguments[i].match(/^linphone/)) {
                console.log("Incoming Call on Closed App")
                showIncomingCall(Qt.application.arguments[i]);
            }
        }
    }

    //Start timer for Registering Status
    checkStatus.start()
}

Ricordarsi di controllare che %u (per ricevere 1 URL) o %U (per ricevere 1 o più URL) sia presente sotto la riga Exec nel file .desktop dell’applicazione.

Tools#

From command line, lomiri-url-dispatcher-dump command will give you the full list of registered protocol schemes and their corresponding app.

Another usefull tool, but not installed by default on devices is lomiri-url-dispatcher-tools, it allows you to simulate a call from a third party app. e.g: lomiri-url-dispatcher https://youtu.be/CIX-a-i6B1w will launch youtube webapp.

To install, it make your partition writable (sudo mount -o rw,remount /) and install it via sudo apt install lomiri-url-dispatcher-tools

Cosa succede se più di un’applicazione ha lo stesso tipo di URL definito?#

Un’ottima domanda. Cosa succede se si tocca un link di Twitter? Come viene gestito un URL di questo tipo dall”URLdispatcher come protocollo http o come protocollo http://twitter?

Cosa succede se due applicazioni hanno lo stesso protocollo definito?

Ora è il momento di effettuare alcuni test e di condividere i risultati nella prossima guida.