缘起
周末想给博客配个手机端。调研发现 emlog Pro 2.6.25 内置了官方 REST API(?rest-api=…),输出统一 JSON 外壳,于是决定不装任何服务端插件,直接让 App 对接官方接口——「島上隨筆」客户端就这样开工了。
从搭工程到端到端跑通,一天完成:阅读、搜索、评论、点赞、收藏、写作全部可用;顺手还加了一组图片工具。
功能一览
- 文章流:分页、下拉刷新、分类筛选、最新/最热/热议排序、置顶标识
- 详情:服务端渲染 HTML 原生排版(与网页一致),深浅色自动适配,密码文章弹窗
- 发现:分类总览、标签聚合、标题搜索、评论列表
- 互动:点赞、收藏、我的收藏(登录后)
- 写作:作者可写文章(Markdown)、存草稿、草稿箱再编辑
- 网络日志(调试版):每条请求的请求/响应/头信息/IP 一目了然,通知栏常驻入口实时计数
- 工具 Tab:二维码扫描、二维码生成、二维码替换(自定义内容 / 截取另一图)、图片压缩(含 16:9)、长图拼接
技术栈与架构
Kotlin 2.0 · Jetpack Compose (Material3) · Retrofit + OkHttp · kotlinx.serialization · DataStore · Coil · ZXing · CameraX。单 Activity + Navigation Compose,无 Hilt(轻量手动 DI)。
网络层几个值得说的设计:
- 统一
{code,msg,data}外壳解包,连接/HTTP/业务三层异常收敛成可读提示 - 会话走自研 CookieJar(OkHttp 托管),登录一年有效、重启自动恢复
- 认证三级回退:Cookie → API Key 签名(md5 时间戳)→ 匿名
- 自定义 DNS 映射:模拟器/内网/公网随意切换域名解析,不用改 hosts
- Debug 专属网络日志:敏感字段(密码/API Key/Cookie)自动脱敏
发布的坑(节选)
- OkHttp 会把 Set-Cookie 从应用层响应剥掉 → 会话改由 CookieJar 层托管
- 模拟器 google_apis 镜像锁 bootloader,/etc/hosts 不可写 → 应用内自定义 DNS 映射解决
- 16:9 裁剪首版对窄图算超界闪退 → 改「最大内接窗口」公式
- 数据流还原自线上、App 直连本机 VM 联调:ssh 隧道 + adb reverse 一条龙
下载
👉 Android 客户端下载页(含功能截图与二维码,iOS/鸿蒙/小程序版本规划中)
| 版本 | 说明 |
|---|---|
| 正式版 | 正式签名,日常使用 |
| 调试版 | 含网络日志调试入口 |
后续
- iOS / 鸿蒙 / 小程序版本规划中(下载页已预留位置)
- 应用市场发布材料整理中:图标、截图、隐私说明
这篇文章本身也是用这套链路「跑」出来的:客户端发布 → 下载页 → 记录成文。
文章导出
生成预览中...