【Electron】酷家樂客戶端開發(fā)實(shí)踐分享 — 瀏覽器啟動(dòng)客戶端

作者:鐘離事哭,酷家樂PC客戶端負(fù)責(zé)人
原文地址:https://webfe.kujiale.com/browser-to-client/
酷家樂客戶端:下載地址 https://www.kujiale.com/activity/136
文章背景:在酷家樂客戶端在V12改版成功后,我們積累了許多的寶貴的經(jīng)驗(yàn)和最佳實(shí)踐只酥。前端社區(qū)里關(guān)于Electron知識(shí)相對(duì)較少丢氢,因此希望將這些內(nèi)容以系列文章的形式分享出來僚纷。
系列文章:

背景

許多本地應(yīng)用(例如vscode嫂便、QQ),都支持通過瀏覽器來啟動(dòng)PC上的本地軟件

這個(gè)功能夠使網(wǎng)頁端和客戶端聯(lián)動(dòng)起來忆绰,用戶體驗(yàn)還是很好的浩峡,實(shí)現(xiàn)起來也并不復(fù)雜〈砀遥酷家樂客戶端已經(jīng)支持了這個(gè)功能翰灾,如下圖:


從瀏覽器啟動(dòng)酷家樂

實(shí)現(xiàn)原理

瀏覽器在解析url的時(shí)候,會(huì)嘗試從系統(tǒng)本地尋找url協(xié)議所關(guān)聯(lián)的應(yīng)用稚茅,如果有關(guān)聯(lián)的應(yīng)用纸淮,則嘗試打開這個(gè)應(yīng)用

例如VsCode從web端安裝插件的時(shí)候,實(shí)際上是訪問了一個(gè)vscode協(xié)議的url亚享,從而達(dá)到啟動(dòng)用戶本地VsCode的目的

VsCode從web端安裝本地插件

具體實(shí)現(xiàn)

現(xiàn)在咽块,我們只需要將自定義的協(xié)議注冊(cè)到用戶電腦上,就可以實(shí)現(xiàn)功能了欺税。用戶瀏覽器里訪問帶有自定義協(xié)議的url侈沪,即可啟動(dòng)我們的客戶端。

Windows

在windows下晚凿,注冊(cè)一個(gè)協(xié)議比較簡單亭罪,寫注冊(cè)表就可以了。這部分微軟爸爸有很詳細(xì)的文檔歼秽,參考 Registering an Application to a URI Scheme

建議在安裝程序中寫入注冊(cè)表項(xiàng)应役,并且指定在卸載程序中,刪除這些注冊(cè)表項(xiàng)哲银。以下是inno setup打包程序中扛吞,操作注冊(cè)表的示例代碼

[Registry]
Root: HKCR; SubKey: Kujiale; ValueData: "KujialeProtocol"; ValueType: string; Flags: createvalueifdoesntexist uninsdeletekey;
Root: HKCR; SubKey: Kujiale; ValueName: "URL Protocol"; ValueData: "{app}\{#appExe}"; ValueType: string; Flags: createvalueifdoesntexist uninsdeletekey;
Root: HKCR; SubKey: Kujiale\DefaultIcon; ValueData: "{app}\{#appExe}"; ValueType: string; Flags: createvalueifdoesntexist uninsdeletekey;
Root: HKCR; SubKey: Kujiale\shell\open\command; ValueData: "{app}\{#appExe} ""%1"""; Flags: createvalueifdoesntexist uninsdeletekey; ValueType: string;

當(dāng)然,也可以在軟件啟動(dòng)的時(shí)候操作注冊(cè)表荆责,這個(gè)時(shí)候其實(shí)是用NodeJs來與注冊(cè)表交互滥比,推薦一個(gè)npm包node-regedit

自定義協(xié)議注冊(cè)成功后,注冊(cè)表里是這樣子的


注冊(cè)協(xié)議成功

MacOS

在MacOS系統(tǒng)下面做院,我們就沒有注冊(cè)表可以寫了盲泛,所以要換一個(gè)實(shí)現(xiàn)方法。在這之前键耕,先介紹一些東西

info.plist

iOS和MacOS的應(yīng)用包中寺滚,都有一個(gè)info.plist文件,這個(gè)文件主要用來記錄應(yīng)用的一些meta信息屈雄,參考Information Property List村视。文件用鍵值對(duì)的形式來記錄信息(xml),結(jié)構(gòu)如下:

info.plist

CFBundleURLTypes

官方解釋:CFBundleURLTypes:A list of URL schemes (http, ftp, and so on) supported by the app.

其實(shí)呢酒奶,這個(gè)就是info.plist里面的一個(gè)key蚁孔,對(duì)應(yīng)的value是一個(gè)數(shù)組奶赔。可以通過這個(gè)字段來為應(yīng)用注冊(cè)一個(gè) or 多個(gè) URL Schema杠氢。參考CFBundleURLTypes

修改info.plist文件

在了解了plist文件之后站刑,我們現(xiàn)在只需為App包中info.plist,設(shè)置CFBundleURLTypes的值即可鼻百。那么如何修改呢绞旅,手寫嗎?nonono温艇,這種事情當(dāng)然要交給工具來做因悲,不然太low了。

Electron Packager中中贝,有一個(gè)配置protocols可以注冊(cè)自定義協(xié)議囤捻,只對(duì)MacOS端生效,原理就是上面提到的修改infi.plist文件邻寿。

// for mac
options.protocols = [{
  name: '鐘離',
  schemes: ['zhongli', 'test'], // 可以注冊(cè)多個(gè)協(xié)議
}];

接收參數(shù)

協(xié)議注冊(cè)完畢之后,我們已經(jīng)可以在瀏覽器中视哑,通過訪問自定義協(xié)議url來啟動(dòng)客戶端了绣否。

對(duì)于url中的不同參數(shù),客戶端的行為也是不一樣的挡毅,例如vscode:extension/ms-python.python這個(gè)url蒜撮,啟動(dòng)了VsCode的同時(shí)也告訴了VsCode:我要安裝插件,插件名是ms-phthon.python跪呈。

Vscode通過解析url中的參數(shù)來實(shí)現(xiàn)自定義行為段磨,那么作為客戶端如何拿到這個(gè)url呢?

Windows

對(duì)于windows耗绿,參數(shù)會(huì)通過啟動(dòng)參數(shù)的形式傳遞給應(yīng)用程序苹支。因此,我們可以很方便的拿到這個(gè)參數(shù)

// 通過自定義url啟動(dòng)客戶端時(shí)
console.log(process.argv);

// 打印出
[
 'C://your-app.exe', // 啟動(dòng)路徑
 'kujiale://111',  // 啟動(dòng)的自定義url
]

MacOS

在Mac下不會(huì)通過啟動(dòng)參數(shù)傳遞給應(yīng)用误阻,通過自定義協(xié)議打開應(yīng)用债蜜,app會(huì)收到 open-url 事件

// mac下通過kujiale協(xié)議啟動(dòng)應(yīng)用
app.on('open-url', (e, url) => { // eslint-disable-line
  parse(url); 解析url
});

最后

本文分了兩部分來講述如何從瀏覽器啟動(dòng)PC端的應(yīng)用

  1. 注冊(cè)自定義協(xié)議究反,對(duì)于所有應(yīng)用程序都適用

  2. 接收參數(shù)寻定,對(duì)使用Electron構(gòu)建的應(yīng)用適用

歡迎大家在評(píng)論區(qū)討論,技術(shù)交流 & 內(nèi)推 -> zhongli@qunhemail.com

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末精耐,一起剝皮案震驚了整個(gè)濱河市狼速,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卦停,老刑警劉巖向胡,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浅浮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捷枯,警方通過查閱死者的電腦和手機(jī)滚秩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淮捆,“玉大人郁油,你說我怎么就攤上這事∨嗜” “怎么了桐腌?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長苟径。 經(jīng)常有香客問我案站,道長,這世上最難降的妖魔是什么棘街? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任蟆盐,我火速辦了婚禮,結(jié)果婚禮上遭殉,老公的妹妹穿的比我還像新娘石挂。我一直安慰自己,他們只是感情好险污,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布痹愚。 她就那樣靜靜地躺著,像睡著了一般蛔糯。 火紅的嫁衣襯著肌膚如雪拯腮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天蚁飒,我揣著相機(jī)與錄音动壤,去河邊找鬼。 笑死飒箭,一個(gè)胖子當(dāng)著我的面吹牛狼电,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弦蹂,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼肩碟,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了凸椿?” 一聲冷哼從身側(cè)響起削祈,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后髓抑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咙崎,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年吨拍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褪猛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羹饰,死狀恐怖伊滋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情队秩,我是刑警寧澤笑旺,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站馍资,受9級(jí)特大地震影響筒主,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸟蟹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一乌妙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧戏锹,春花似錦冠胯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽置蜀。三九已至奈搜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盯荤,已是汗流浹背馋吗。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秋秤,地道東北人宏粤。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像灼卢,于是被迫代替她去往敵國和親绍哎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容