Імпорт з Content Hub та URLdispatcher¶
"hooks": {
"openstore": {
"apparmor": "openstore/openstore.apparmor",
"desktop": "openstore/openstore.desktop",
"urls": "openstore/openstore.url-dispatcher",
"content-hub": "openstore/openstore-contenthub.json"
}
},
У попередньому посібнику ми трохи ознайомилися з принципом роботи Content Hub. У цьому посібнику ми розглянемо, як працює URLdispatcher і як обробляти імпортовані дані з Content Hub.
Обробка даних з Content Hub¶
Програма OpenStore з open-store.io¶
Один з простих шляхів перевірки програм — це надіслати собі у Telegram тестовий click та відкрити його там в OpenStore через Content Hub:
Якщо ми тицьнемо на програму OpenStore, вона запуститься та запитає чи ми не хочемо встановити цей файл click. Подивимося на код програми Main.qml щоби зрозуміти як це робиться:
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)
})
}
}
Ви бачите елемент Connections, який вказує на ContentHub? Коли він отримує сигнал onImportRequested, він бере посилання з надісланих від Content Hub даних (transfer.items[0].url — це посилання на перші надіслані дані) та відкриває елемент PopUp, щоби користувач міг встановити цей click-пакунок.
Як щодо URLdispatcher?¶
URLdispatcher — це програмна частина, схожа на Content Hub, яка робить наше життя легшим, намагаючись вибрати правильну програму, відповідно до протоколу. Наприклад, тицьнувши на протокол http Ви хочете відкрити веббраузер. Коли ми тицяємо на посилання для мапи, було б зручно його відкрити в uNav, а посилання twitter — у Twitter! Як це працює?
URLdispatcher обирає яка програма (відповідно до manifest.json) які посилання повинна відкривати.
Подивімося, як виглядає наша навігаційна програма зсередини. Маніфест uNav у коді manifest.json містить особливі хуки для URLdispatcher:
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 ]
Це значить, що посилання вигляду http://map.unav.me/xxxxx,xxxxx буде відкриватися в uNav. І це визначено у рядках 2 та 3, де після зазначеного протоколу http вказано map.unav.me.
Також в uNav будуть відкриватися URI у форматі geo:xxx,xxx, про що вказано у рядку 11.
І як ми керуємо отриманими URL?¶
Після того як URLdispatcher надсилає посилання до відповідної програми, потрібно опрацювати URL / URI у цільовій програмі. Подивимося як це зробити:
У головному файлі qml нам потрібно додати код, щоб знати, що робити з відправленою URL-адресою. Розглянемо як це робиться у програмі Linphone, додавши з’єднання до обробника URI з елементом Connections, що встановлює UriHandler як ціль.
Connections {
target: UriHandler
onOpened: {
console.log('Open from UriHandler')
if (uris.length > 0) {
console.log('Incoming call from UriHandler ' + uris[0]);
showIncomingCall(uris[0]);
}
}
}
Із запуском програми код буде керувати URI у формі linphone://sip:xxx@xxx.xx. Але що потрібно зробити для опрацювання цього посилання, коли програма закрита?
Потрібно лише трішки додаткового коду, який закриє два моменти: 1) Ми отримуємо одне посилання URL, 2) Ми отримуємо декілька посилань URL
Перевіримо чи Qt.application.arguments не порожній, та якщо ні, чи є збіги аргументів з нашим форматом 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()
}
Не забудьте перевірити, що %u (для 1 URL) або %U (для декількох URL) присутні у файлі програми .desktop під рядком Exec.
Інструменти¶
Команда lomiri-url-dispatcher-dump з командного рядка надає повний список зареєстрованих протокольних схем та їх відповідних програм.
Інший корисний інструмент, але не встановлений типово на пристроях — це lomiri-url-dispatcher-tools, який може симулювати виклик від сторонньої програми, напр., lomiri-url-dispatcher https://youtu.be/CIX-a-i6B1w запустить веб-програму youtube.
Для встановлення зробіть розділ доступним на запис (sudo mount -o rw,remount /) та встановіть командою sudo apt install lomiri-url-dispatcher-tools
Що відбувається якщо той самий тип URL визначений у декількох програмах?¶
Дуже гарне запитання. Що станеться, якщо тицьнути на посилання Twitter? За яким протоколом таке посилання обробляється URLdispatcher — http чи http://twitter?
Що станеться, якщо у двох програм буде описаний однаковий протокол?
Тепер настав час для деяких тестів, результатами яких можна буде поділитися у наступному посібнику.