在 Android 通過 sheme 協議可以拉起其他應用。
electron 應用也可以通過類似特定協議被拉起。
在同時有 web、客戶端的應用里,可以通過這種方式在 web 拉起客戶端。
支持拉起客戶端
const PROTOCOL = 'xxx'if (process.defaultApp) {// 這里是開發環境,有啟動參數if (process.argv.length >= 2) {app.setAsDefaultProtocolClient(PROTOCOL, process.execPath, [path.resolve(process.argv[1])]);}} else {app.setAsDefaultProtocolClient(PROTOCOL);}
這里注冊啟動協議得程序運行一次才生效,體驗不好。有沒有在安裝時就生效的實現?同時在卸載時就取消注冊?
mac
在electron-builder.yml加配置,xxx是協議名
# 注冊客戶端啟動協議,適用于mac
protocols:- name: ' xxx'schemes: - 'xxx'
windows
在electron-builder.yml的 build 目錄增加installer.nsh文件,比如electron-builder.yml是
directories:buildResources: build
就增加build/installer.nsh
!define PROTOCOL_NAME "xxx"
!macro customInstallDeleteRegKey HKCU "${PROTOCOL_NAME}"WriteRegStr HKCU "${PROTOCOL_NAME}" "" "URL:${PROTOCOL_NAME}"WriteRegStr HKCU "${PROTOCOL_NAME}" "URL Protocol" ""WriteRegStr HKCU "${PROTOCOL_NAME}\shell" "" ""WriteRegStr HKCU "${PROTOCOL_NAME}\shell\Open" "" ""WriteRegStr HKCU "${PROTOCOL_NAME}\shell\Open\command" "" "$INSTDIR\${APP_EXECUTABLE_FILENAME} %1"
!macroend!macro customUnInstallDeleteRegKey HKCU "${PROTOCOL_NAME}"
!macroend
除此之外
還要記得本地開發時仍需要注冊,不然調試不生效,但程序退出后記得取消注冊
app.removeAsDefaultProtocolClient(PROTOCOL, process.execPath, [path.resolve(process.argv[1])]);
處理二次啟動時的參數
拉起后希望能處理傳參,比如在瀏覽器通過 xxx://open?a=1拉起,希望能獲取到 open,a=1這些參數。由于 mac默認單例和electron實現的原因,在 mac 和 windows 下有些不一樣。
mac
// 處理請求參數app.on('open-url', (_, url) => {dialog.showErrorBox('Welcome Back from open-url', `You arrived from: ${url}`);handleUrl(url);});
windows
app.on('second-instance', (_, commandLine) => {const url = commandLine[commandLine.length - 1]dialog.showErrorBox('Welcome Back 111', `You arrived from: ${url}`);if(url) handleUrl(url);});
處理首次啟動時的參數
if (process.argv.length > 1) {const url = process.argv.find(arg => arg.startsWith(`${PROTOCOL}://`));if (url) handleUrl(url, {fromInit: true});}
參考鏈接
https://www.electronjs.org/docs/latest/tutorial/launch-app-from-url-in-another-app
https://xuxin123.com/electron/url-scheme/