前言
近日,公司要求把原有已经适配window和mac的electron应用,也给Linux系统适配,主要是UOS和麒麟系统。下面就总结一下这个过程踩到的坑以及比较难解决的问题。
electron版本
16.x
第一次尝试使用最新版本的包,即为16.x。但是发现samesite的问题,导致三方cookie种不了,登录出现了问题。尝试过修改samesite的值并没有作用
15.x
15版本倒是没有samesite的问题,但是发现边框的拖拽缩放不生效
14.2.3
最终,验证了14版本没有samesite和边框缩放的问题,可以正常使用
任务栏标题中文乱码
如图,中文标题显示乱码。
先捋一捋我们原来的打包方式:
- 把对应版本的electron的dist内容复制出来,作为应用的包内容
- 再用electron-installer-debian把包打成deb安装包
为什么没有直接使用electron-builder呢?
因为这个项目原来的mac和window的包,都是保留包的内容,每次重新打包直接把包的内容用对应的工具构建成安装包。所以在linux的适配上,为了统一打包规范,也沿用这种做法。
除了任务栏标题中文乱码,其他倒是没有问题。 大概研究了两天,根据网上的说法用electron-packager构建出包内容,也是不生效。
后面想起,最开始的时候,尝试使用过electron-builder构建linux包,并没有出现标题乱码的问题。于是开始从electron-builder入手
使用electron-builder构建出包内容
- 根据electron-builder的使用教程(这里不详细说),获取构建出来的unpacked dir
- 再使用electron-installer-debian把包打成deb安装包 果不其然,这样子就不会有中文乱码了
原因
请教过我们公司负责wps统信系统兼容的同事,可能是electron这里默认没有对字符串编码进行转码设置。
猜测(个人猜测,没经过验证),electron-builder进行打包的时候,有字符串编码转码这一步,unpack里面的包内容经过了转码。
综上,在electron的打包工具来说,electron-builder还是比较强大的。
生成桌面快捷方式
在这里,需要在postinst脚本里面进行设置,但是有注意的点:
- 快捷方式是需要把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文件复制过去。
- 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作为复制对象
开机自启动适配
我们的应用是可以动态设置是否开机启动:
按照网上的教程和uos的说法,应该是复制一个desktop文件到/etc/xdg/autostart/,这种方式并不支持动态通过脚本去设置的。
大概研究了两天,去electron的issue上查找有无类似的问题。 发现了可以通过在/home/${process.env.USER}/.config/autostart/里面的desktop文件的状态,是判断开机启动的状态。 如果desktop里面的Hidden=false,则代表开机自启动,其他情况都代表不开机启动
那么,应用内部的开机启动配置,通过去读写这个文件里面的Hidden的值即可
总结
以上4个问题是我遇到过解决起来比较棘手和耗时的问题,其实本质还是对linux的应用开发不熟悉,毕竟本职是做前端开发的。希望这篇文章可以帮助到大家!
📣📣号外
金山文档客户端在统信UOS和麒麟系统已经上架,希望大家可以多多支持~~