Electron适配Linux踩的坑

2,896 阅读3分钟

前言

近日,公司要求把原有已经适配window和mac的electron应用,也给Linux系统适配,主要是UOS和麒麟系统。下面就总结一下这个过程踩到的坑以及比较难解决的问题。

electron版本

16.x

第一次尝试使用最新版本的包,即为16.x。但是发现samesite的问题,导致三方cookie种不了,登录出现了问题。尝试过修改samesite的值并没有作用

15.x

15版本倒是没有samesite的问题,但是发现边框的拖拽缩放不生效

14.2.3

最终,验证了14版本没有samesite和边框缩放的问题,可以正常使用

任务栏标题中文乱码

image.png

如图,中文标题显示乱码。

先捋一捋我们原来的打包方式:

  • 把对应版本的electron的dist内容复制出来,作为应用的包内容

image.png

  • 再用electron-installer-debian把包打成deb安装包

为什么没有直接使用electron-builder呢?

因为这个项目原来的mac和window的包,都是保留包的内容,每次重新打包直接把包的内容用对应的工具构建成安装包。所以在linux的适配上,为了统一打包规范,也沿用这种做法。

除了任务栏标题中文乱码,其他倒是没有问题。 大概研究了两天,根据网上的说法用electron-packager构建出包内容,也是不生效。

后面想起,最开始的时候,尝试使用过electron-builder构建linux包,并没有出现标题乱码的问题。于是开始从electron-builder入手

使用electron-builder构建出包内容

  • 根据electron-builder的使用教程(这里不详细说),获取构建出来的unpacked dir

image.png

  • 再使用electron-installer-debian把包打成deb安装包 果不其然,这样子就不会有中文乱码了

image.png

原因

请教过我们公司负责wps统信系统兼容的同事,可能是electron这里默认没有对字符串编码进行转码设置。

猜测(个人猜测,没经过验证),electron-builder进行打包的时候,有字符串编码转码这一步,unpack里面的包内容经过了转码。

综上,在electron的打包工具来说,electron-builder还是比较强大的。

生成桌面快捷方式

在这里,需要在postinst脚本里面进行设置,但是有注意的点:

  1. 快捷方式是需要把desktop文件复制到/home/$USER/Desktop里面,但是postinst脚本是以root权限运行的,无法获取到当前USER、HOME等这些环境变量 解决:
for FILENAME in /home/*; do
if [ -d "${FILENAME}/桌面" ]; then
	cp /usr/applications/cn.kdocs.kdesktop.desktop $FILENAME/桌面
elif [ -d "${FILENAME}/Desktop" ]; then
	cp /usr/applications/cn.kdocs.kdesktop.desktop $FILENAME/Desktop
fi
done

查找home/* 下有Desktop和桌面的文件夹,把对应的desktop文件复制过去。

  1. UOS规范的包路径 在统信系统上架应用,建议构建成符合UOS规范的包。

根据第1点,构建成uos包时,就不能在postinst文件里面读取/usr/applications/cn.kdocs.kdesktop.desktop(猜测是在postinst脚本执行的时机,uos还未在applications下创建desktop)

解决:

for FILENAME in /home/*; do
if [ -d "${FILENAME}/桌面" ]; then
	cp /opt/apps/cn.kdocs.kdesktop/entries/applications/cn.kdocs.kdesktop.desktop $FILENAME/桌面
elif [ -d "${FILENAME}/Desktop" ]; then
	cp /opt/apps/cn.kdocs.kdesktop/entries/applications/cn.kdocs.kdesktop.desktop $FILENAME/Desktop
fi
done

把实际包的安装路径的desktop作为复制对象

开机自启动适配

我们的应用是可以动态设置是否开机启动:

image.png

按照网上的教程和uos的说法,应该是复制一个desktop文件到/etc/xdg/autostart/,这种方式并不支持动态通过脚本去设置的。

大概研究了两天,去electron的issue上查找有无类似的问题。 发现了可以通过在/home/${process.env.USER}/.config/autostart/里面的desktop文件的状态,是判断开机启动的状态。 如果desktop里面的Hidden=false,则代表开机自启动,其他情况都代表不开机启动

image.png

那么,应用内部的开机启动配置,通过去读写这个文件里面的Hidden的值即可

总结

以上4个问题是我遇到过解决起来比较棘手和耗时的问题,其实本质还是对linux的应用开发不熟悉,毕竟本职是做前端开发的。希望这篇文章可以帮助到大家!

📣📣号外

金山文档客户端在统信UOS和麒麟系统已经上架,希望大家可以多多支持~~