夜雨聆风学习资料网

ARTICLE · 1158217

打包成 App 后登录老是丢?我一天发了 13 个版本,把坑填完了

打包成 App 后登录老是丢?我一天发了 13 个版本,把坑填完了

先说一个很容易破防的场景。

辛辛苦苦把网页项目打包成 App。

装到手机上,能打开,能登录。

然后用户刷新了一下页面——

"您还没有登录,请登录。"

登录一次,掉一次。

App 还没上线,先被登录页劝退了。

这不是段子,是我这次真遇到的问题。

所以我花了一天,把 Front2APK 从头到尾捋了一遍。

一天,13 个版本。

新能力有,修复更多。

下面这 6 个坑,如果你也在做网页转 App,早晚都会撞上。

坑一:登录一次,刷新就丢(v0.5.10)

这是最先暴露、也最要命的一个。

排查下来,原因有两个:

一是 WebView 默认没有开启第三方 Cookie,登录接口下发的 Cookie 根本存不下来。

二是 App 退到后台时,Cookie 还留在内存里,进程被系统回收后,就跟着一起没了。

两个小问题叠在一起,结果只有一个:登录状态永远留不住。

现在的处理是:

  • • 显式开启 Cookie 和第三方 Cookie
  • • App 退到后台时,主动把 Cookie 落盘

登录一次,就能一直用。

坑二:端口一变,本地数据就"没了"(v0.5.7)

这个坑非常隐蔽,一开始我完全没往这个方向想。

Cookie 本身不区分端口,但 localStorage、sessionStorage 和 IndexedDB 是区分端口的。

也就是说:

同一个应用,如果每次启动的端口都不一样,网页存在 localStorage 里的登录信息,也会跟着"消失"。

它的表现是——"有时候登录状态会丢"。

时好时坏的问题,最难查。

现在:

  • • 每个应用的端口,按包名自动生成,固定不变
  • • 同一个应用每次启动,地址都一样
  • • 只有端口真的被占用,才临时顺延到下一个空闲端口

localStorage 里的数据,终于能稳定留下来。

坑三:包名打架,两个 App 只能活一个(v0.5.1 / v0.5.4 / v0.5.5 / v0.5.8)

这个坑最直接:装第二个 App,把第一个覆盖了。

原因很简单:多个项目共用了同一个默认包名。

更麻烦的是后面这半段:

如果哪天改了应用名称,包名也跟着变,那这个 App 在系统眼里就成了"另一个新应用",没法覆盖升级,只能卸载重装。

现在规则统一了:

  • • 不同项目自动生成不同包名,安装不再互相覆盖
  • • 包名跟随项目(目录名 / ZIP 名),改应用名称也不会变
  • • 每个项目的包名会被记住,下次选同一个项目,还是原来的包名
  • • 手动改过的包名,一直保留

一句话:同一个应用,可以一直覆盖升级。

坑四:两个 App 一起开,直接连错服务(v0.5.3 / v0.5.6)

做本地服务的 App,多半会踩这个坑。

以前多个 Node.js / Python 应用同时打开,会共用同一个固定端口。

结果是:

轻则第二个启动失败,重则它连上了第一个 App 的服务,页面显示的内容完全不对。

现在的处理:

  • • 端口按包名自动分配,不同 App 互不干扰
  • • 端口被占用时,自动改用下一个空闲端口,而不是启动失败
  • • 主程序端口从 3210 改成不常用的 47321
  • • start.bat 遇到端口被占用,会先结束占用进程再启动

不会再出现"连上了别的 App 的服务"这种诡异情况。

坑五:想打包 Python 项目?不好意思,不支持(v0.5.0)

前四个坑都是修问题,这个坑是补能力。

之前 Front2APK 支持静态前端和 Node.js,Python 项目是打包不了的。

现在新增了 Python 项目模式,使用 Chaquopy 17 在 APK 内嵌 Python 运行时。

支持:

  • • Python 入口文件识别
  • • requirements.txt 依赖安装
  • • 多 ABI(arm64-v8a、armeabi-v7a、x86_64)
  • • 手机内自动启动本地 Python 服务,WebView 加载

到这里,Front2APK 能打包三种项目了:

  • • 纯静态前端
  • • Node.js 服务
  • • Python 服务

坑六:改了路径,应用名和包名不跟着变(v0.5.9)

这个算小坑,但很影响手感。

在"本机路径"输入框里改路径,应用名和包名不会立刻更新,必须先在别的地方点一下(让输入框失焦),才会刷新。

现在输入路径时,应用名和包名会实时跟着更新。

改完路径,结果立刻就在眼前。

顺手修的细节

除了上面 6 个坑,这次还补了一些环境相关的小问题:

  • • 环境检测新增 Node.js 版本和 npm 检测(v0.4.5)
  • • 支持手动选择 Node.js 安装目录(v0.4.6)
  • • 环境检测新增 Python 版本和 pip 检测(v0.5.0)
  • • start.bat 窗口不再一闪而过,启动失败会保留窗口显示原因(v0.5.2)

说点实在的

一天 13 个版本,听起来挺多。

但真正有价值的不是版本号,是搞清楚了一件事:

网页转 App,最难的不是"能不能打出 APK",而是"打出来的 App 能不能一直好好用"。

前者是一次性的,后者才是长期的。

打包成功  ->  登录能记住          ->  本地数据不丢          ->  多个 App 不打架          ->  升级能覆盖          ->  三种项目都能装

现在,Front2APK 能做什么

说了这么多"修了什么",那它现在到底能做什么?

一、三种项目类型都能打包

  • • 静态前端:纯 HTML / CSS / JS 构建产物
  • • Node.js 服务:内嵌 nodejs-mobile 运行时,手机内启动本地 HTTP 服务
  • • Python 服务:Chaquopy 内嵌 Python,支持 requirements.txt 与多 ABI

二、三种项目来源

  • • 上传前端构建目录
  • • 上传 ZIP 压缩包
  • • 直接填写或选择本机路径

三、应用配置

  • • 应用名称、包名、版本号、版本名称
  • • 应用图标(PNG / JPG / JPEG / WebP)
  • • 横屏 / 竖屏 / 全屏、保持屏幕常亮
  • • WebView 背景色、状态栏颜色
  • • 开启 HTTP 明文请求
  • • SPA history 路由回退

四、网页与手机打通

  • • 支持 Android 返回键
  • • 支持 WebView 文件选择器
  • • 外部网页使用系统浏览器打开
  • • 网页生成的 PDF、HTML 保存到公共下载目录(Download/Front2APK/)
  • • Cookie / 登录态持久化,刷新不掉线

五、构建与出包

  • • 自动识别 JDK、Android SDK、Gradle
  • • 自动检测 Node.js / npm、Python / pip,并可手动指定安装目录
  • • 多 ABI:arm64-v8a、armeabi-v7a、x86_64
  • • APK 生成列表、项目快照、一键再次生成
  • • 实时查看 Gradle 构建日志
  • • 默认输出到项目 output/ 目录

一句话:从"选项目 → 配应用 → 出 APK → 重复升级",整套流程已经可以在本机完成。

项目地址

项目名称:

Front2APK

Gitee:

https://gitee.com/XUJINPENGSIR/front2-apk

本次版本:

v0.5.10

最新提交:

3d5f1dc fix: enable webview cookies so login sessions persist

如果你也遇到过:

  • • 打包后登录态老是丢
  • • 多个 App 端口冲突
  • • 包名打架,安装互相覆盖
  • • 想给 Python 项目打包

可以更新到最新版试试。

相关学习资料