應用但願能經過其餘應用喚起,這應該是個很是常見的需求html
搜半天,全是基於協議的。protocolvue
接着會發現關鍵代碼node
官網地址vue-cli
app.setAsDefaultProtocolClient(PROTOCOL, process.execPath, args);
複製代碼
這就讓人很難受了。segmentfault
那麼咱們須要想一想,有沒有辦法在安裝的時候把協議寫進去?windows
答案是:有。api
既然要在安裝的時候寫進去,那麼一定須要在打包的地方下功夫。瀏覽器
這裏我使用的是electron-builder來進行打包(個人項目是基於vue-cli4配合vue-cli-plugin-electron-builder建立的)markdown
所以咱們的打包配置文件中,須要寫入protocols配置app
注意,mac和Windows協議是分開的。
這裏咱們解釋一下
mac的協議喚起,實質上是dmg安裝文件後的info.plist文件下的URLType,幹過iOS開發的同事應該都有經驗。
路徑是/Application/你的應用程序 右鍵顯示包內容 /Contents/Info.plist
Windows須要經過指定打包方式nsis,並在打包時注入執行的sh腳本,以達到安裝注入協議的目的。
這裏有另外一個注意的點,就是卸載的時候最好能卸載掉對應的協議。(用戶體驗至上)
而後打包便可
還記得以前你寫的協議名稱麼?好比我這裏叫szyxqca
打開瀏覽器,在地址欄輸入
szyxqca://
複製代碼
便可
理論上你的瀏覽器會喚起你的應用
若是要傳參呢?
szyxqca://startapp/here?xxx=123&xxx2=222
複製代碼
這裏的startapp/here其實都是沒用的,主要是配合添加host和path以及query,這種格式比較適合後期延展
須要兩個生命週期
// windows喚起
app.on('second-instance', (event, argv) => {
if (process.platform === 'win32') {
logger.warn('喚起');
logger.warn(event, argv);
//TODO:還沒寫
}
});
// macOS喚起
app.on('open-url', (event, urlStr) => {
logger.warn('喚起');
logger.warn(event, urlStr);
// 解析數據
const urlObj = new URL(urlStr);
const { searchParams } = urlObj;
//數據
const xxx = searchParams.get('xxx');
const xxx2 = searchParams.get('xxx2');
});
複製代碼
我在mac上喚醒app,一直莫名其妙喚起了./node_modules/electron/dist/Electron.app,而後我把全部的node_modules刪了,並從新打開了一下app,再喚起,正常了。
實測直接把dmg直接發給同事,他安裝之後能夠直接喚醒,不會錯誤喚醒。
多是electron的bug吧