Skip to content

Releases: pekinlcc/TernDays

TernDays v0.8

Choose a tag to compare

@github-actions github-actions released this 02 Sep 10:43
2fa06b6

桌面小组件重做:2×2、一城一数、苹果自家小组件的做法。

为什么重做

上一版三座城市等字号排成一列,没有视觉锚点;左上角还放着「TernDays」字样,底面叠了高光和描边。这一版按苹果自家小组件(屏幕使用时间、天气、股票)的骨架重来。

现在长什么样

  • 只有一个锚点:今年待得最久的城市名(17pt)+ 它的天数(44pt),第 2、3 名退成两行 13pt 脚注;字号比 44 : 17 : 13
  • 去掉一切装饰:不放应用名、不画高光/描边/阴影/水印,一层实心底面(浅色白 / 深色 #1C1C1E),圆角由系统裁切
  • 只有一处品牌色:大数字用品牌青,其余文字只用系统的 primary / secondary 两级
  • 字体、边距交给系统:iOS 用 SF Pro / 苹方与系统内容边距(修掉此前 14pt 再叠系统边距导致的局促);Android 用 Roboto / 思源黑体,16dp 边距,圆角跟 Android 12+ 的系统小组件圆角同心
  • 尺寸统一 2×2:Android 由 3×2 改为 2×2;iOS 只保留小号(systemSmall),中号本次移出
  • 空态、单城、双城、长城市名(缩小后截断)、最宽数值(降一档字号)都有明确处理;整块朗读一句「2026 年,深圳 156 天,上海 38.5 天,香港 12 天」
  • iOS 18 着色模式下大数字随用户主题色、其余变白;StandBy / 锁屏由系统自动去底

升级注意

  • Android 上已放置的旧 3×2 小组件不会自动缩小,请删掉后重新添加 2×2
  • iOS 上已放置的中号小组件会失效,请改用小号
  • 「系统材质」「品牌渐变」两种备选底面在预览页可选,当前发布为默认的「素面」

已知边界

  • Android 小组件是静态快照,做不出真正的模糊材质;国产 ROM 启动器若忽略系统圆角,会用 20dp 兜底
  • iOS 仍未经真机验证(iPhone SE 148pt 规格的竖向余量最紧,需要实机核对)

TernDays v0.7

Choose a tag to compare

@github-actions github-actions released this 01 Sep 15:53
febb836

体验与一致性版本——全面体检 76 条发现的第二批(体验批)全部落地。

深色模式 🌙

双端跟随系统自动切换,浅色/深色两套完整色板,小组件同步适配。此前 iOS 在深色模式下「更正城市」的文字对比度只有 1.03:1(几乎看不见),现已彻底解决;Android 也关闭了 OEM 的「强制深色」,不会再被第三方反色破坏配色。

半天粒度更正

跨城出行日终于能只改错的那半天:当天有早/晚两个样本时,更正对话框多出「整天 / 只改上半天 / 只改下半天」选择。选半天后另一半天仍按打卡判定,保住正确的 0.5 + 0.5 拆分,不再被迫把一整天归给一个城市。整天更正与半天更正互斥,随时可恢复自动判定。

城市搜索

  • 拼音可搜:beijing / shenzhen / shanghai 都能搜到
  • 结果按 全等 > 前缀 > 包含 排序,中国城市优先——搜「伦敦」不再先跳出加拿大的那个
  • 重名城市带国家/地区标注(英国·ENG / 加拿大·08),一眼分得清
  • iOS 搜索移到后台线程,3.4 万行全表扫描不再卡输入

双端一致性

  • iOS 补齐:回到前台自动刷新数据、拿不到定位时发打卡失败提醒、城市库重解析完成后有提示条(此前静默)、导出加「首点」列与明细预览卡、生成中有进度、失败明确报错(此前失败也弹分享面板)
  • 「延迟」判定双端统一到秒级;导出表头、标签文案(「手动」)、「另有 N 天可补记」的可点样式两端一致

无障碍与工程

  • 图标按钮补上朗读描述,触摸目标放大到 48dp 最小标准,复选框有勾选状态语义
  • 新增 MIT LICENSE,并明确 GeoNames(CC BY 4.0)与行政区划数据的署名条款
  • CI 加固:发版前校验 RELEASE_VERSION 与应用 versionName 一致、发布说明存在、版本号格式合法;远端 tag 查询失败不再被误当作「可以发版」
  • README 补充隐私说明(系统云备份的行为)与已知限制

覆盖安装即可,数据与小组件保留。

TernDays v0.6.1

Choose a tag to compare

@github-actions github-actions released this 01 Sep 14:36
9df5bbf

缺陷修复版本——来自一次 90 个审查代理的全面体检(76 条经对抗验证的发现),本版集中修掉其中的高危与数据正确性问题。

高危修复

  • Android 14+ 定位权限被收回后每天两次后台崩溃:闹钟触发的前台服务会因系统限制直接抛异常,且用户毫无感知。现在会前置检查并发提醒通知,绝不崩溃
  • 历史重解析会"打脸"交叉验证(双端):城市库升级/迁移导入后的重解析此前用裸最近邻,会把此前依据行程连续性正确改判的边界记录批量改回错城市。现在改为按时间重放——每条历史记录都走与实时打卡完全相同的交叉验证
  • iOS 打卡回调竞态:后台刷新与开屏打卡同时发生时回调被覆盖,后台任务永远以失败收场、系统持续降低后台配额。改为主线程回调队列 + 代次标记,并发安全
  • 环核心城市卫星城整片误判(城市库 v3):燕郊/三河/大厂/香河→此前判北京(实属廊坊)、昆山花桥→判上海(实属苏州)、佛山南海黄岐/大沥/里水→判广州(实属佛山)。逐点补锚修正,覆盖安装后历史记录自动重解析改回

数据与算法

  • 粘滞链不再无限自续期:被行程连续性"粘住"的打卡不再作为下一次的参照锚点,36 小时上限真正约束整条链;参照锚点还会尊重你手动更正过的城市
  • 城市库 v3 一并修正:8 组重名 key 把两座不同城市并成一行(如日本士别/标津)、新加坡被拆成 7 个"城市"(现整体记一城)、旧金山显示"三藩"、25 个城市显示日文名、泽西城被并进纽约、莫斯科重复行
  • 城市搜索支持拼音(beijing/shenzhen 可搜),结果按 全等 > 前缀 > 包含 排序、中国城市优先,重名城市带国家标注(加拿大伦敦 vs 英国伦敦)
  • 城市库单行损坏只跳过该行,不再让整库加载失败
  • iOS 数据文件解码失败时改名保留原件,绝不再静默清空全部历史

体验修复

  • 后台补打/重解析/迁移导入完成后,打开着的页面即时刷新(此前 Toast 说修正了 N 条、页面还是旧数据)
  • 「无记录」天数从首条记录之日起算:新装用户不再一上来就看到"另有 240+ 天无记录"
  • 手动更正过的日子:标签改为「手动」,并保留显示当天真实打卡明细;更正走最后一天后城市详情页自动返回,不再停在空页
  • 引导页权限被永久拒绝后,按钮变为「去系统设置开启」并附路径说明(Android 与 iOS「始终允许」一步同理),不再是点了没反应的死按钮
  • Android 12+「闹钟和提醒」权限恢复后自动重排打卡闹钟;OEM 强制反色已禁用;导出页年份可横向滚动、旋转屏幕不再卡在「正在生成…」;通知有声音(iOS)

覆盖安装即可,数据与小组件保留;首次打开会自动按新城市库修正历史记录并提示条数。

TernDays v0.6

Choose a tag to compare

@github-actions github-actions released this 01 Sep 12:05
b515a37

换手机数据迁移版本。

换手机,数据跟着走 📲

两台手机连同一个 Wi-Fi(或旧手机开热点、新手机连上),三步完成:

  1. 旧手机:设置 →「迁移到新手机」,屏幕出现二维码
  2. 新手机:装好 TernDays → 设置 →「从旧手机导入」,扫旧手机上的码
  3. 数据经加密局域网直传瞬间到达,完成后两边都会提示

设计要点:

  • 不经过任何服务器,也不用登录任何账号——与「数据只存本机」的承诺一致。
    网络与相机权限只在迁移页面使用,平时应用照旧零联网
  • Android ↔ iPhone 互通:两端用同一套加密交换格式,安卓换苹果、苹果换安卓都行
  • 安全:每次迁移生成一次性 AES-256 密钥,只藏在二维码里(扫码即线下传递);
    拿不出正确密钥指纹的连接直接断开;离开页面二维码立即失效,传完服务自动关闭
  • 合并不覆盖:新手机上已有的记录一律保留,重复的自动跳过并告知条数;
    导入后还会按本机城市库把导入记录的城市判定重新解析一遍

连不上时请确认:两台手机在同一个 Wi-Fi、旧手机的迁移页面还开着,然后重新扫码即可。

迁移协议(交换格式 / AES-GCM / 二维码链接)进入 :core 并新增 6 个单元测试,共 52 个全绿。
iOS 端依旧待真机验证。

TernDays v0.5

Choose a tag to compare

@github-actions github-actions released this 01 Sep 11:09
f0725fb

定位准确度与手动更正版本——起因是一个真实误判:人在深圳,打卡却记成了香港

为什么会错

排查内置城市库后确认了两个根因:

  1. 锚点密度失衡:GeoNames 给香港的每个街区都建了点(146 个),而深圳作为单一行政市只有市中心附近 14 个点、珠海仅 1 个。最近邻匹配的分界线因此深深压进深圳一侧——蛇口、前海、深圳湾口岸、罗湖口岸都会被判成香港,拱北、横琴会被判成澳门。
  2. 港澳救援框吞点:旧版用矩形框把标错国别的港澳点归还,但框的北界压到深圳南山陆地,把 4 个深圳点错标成了香港。

修了什么

  • 重建城市库:深港/珠澳边界两侧逐点补密锚点(口岸、边界街区),救援判定改为「距原生港澳点 vs 距内地锚点谁近」;32 个边界探针 + 12 个全国回归点全部通过后才发布
  • 打卡时交叉验证(双端,全离线):
    • 前两个候选城市距离差小(含定位误差放宽)→ 判为边界模糊区
    • 模糊区内沿用 ≤36 小时内上一次打卡的城市(行程连续性)——真正跨城后深入新城市,该规则自动失效
    • 定位误差达公里级(典型为口岸带基站漂移)时,误差圈内沿用上次城市
    • 防错误传播:距最近候选 <0.8km 视为明确证据,不受上次误判影响
  • 任何一天都可手动更正:首页「今日打卡」新增纠正按钮;城市详情的月历/明细里点任意一天即可改城市。手动更正优先于自动判定,标「手动」,可随时恢复自动
  • 历史自动修复:打卡一直保留原始坐标,本版起城市库带版本号——覆盖安装后应用自动按新库重解析全部历史记录(手动更正不动),完成后提示修正了几条。之前被误判成香港的深圳记录会自动改回,无需手改

覆盖安装即可,数据与小组件保留。

:core 单元测试 34 → 46 个(交叉验证 10 个场景 + 候选去重 + 15 个边界坐标断言)。

TernDays v0.4

Choose a tag to compare

@github-actions github-actions released this 01 Sep 03:43

品牌与信息完善版本。

正式应用图标:燕鸥 🐦

从四个候选方向中选定 A · 燕鸥(TernDays 的本名——一只飞翔的候鸟,白标 + 品牌青底):

  • Android:自适应启动图标(适配圆形/圆角等各种蒙版)、通知栏小图标、首页品牌位同步更换
  • iOS:AppIcon(1024px)已生成进资源目录,构建即生效

修复与完善

  • 修复:设置 → 关于中的版本号此前写死为 0.1(v0.2/v0.3 未跟随),现改为动态读取构建版本,之后永不漂移(Android 读 PackageInfo,iOS 读 Bundle)
  • 关于页新增开源地址(github.com/pekinlcc/TernDays,点击直达)

覆盖安装即可,数据与小组件保留;安装后桌面图标即更换为燕鸥。

TernDays v0.3

Choose a tag to compare

@github-actions github-actions released this 01 Sep 03:17

新功能版本:首点——首次安装立即打一个点,并定义了它参与计天的规则。

首点(Android + iOS)

装完 App、完成权限引导后立即记录一次当前位置(无论几点),首页今日卡会显示
「首点 HH:mm · 城市 ✓(已记录当前位置)」——不用等到 7 点/17 点才看到第一条数据。

计天规则(一天永远最多 1 天)

一天 = 上半天样本(早点)+ 下半天样本(晚点)。首点不占早/晚槽,只做兜底

  • 凌晨装机(早于 7 点):当天打 3 个点;早晚正式点优先,首点只在早点没打成时顶替(凌晨位置≈早上城市)
  • 下午装机(12–17 点):当天打 2 个点;首点与晚点同属下半天,不会拆出两个半天
    按单样本规则整天 +1;若 17 点没打成,首点顶替晚点,装机当天照样计数
  • 半天只产生于「上半天城市 ≠ 下半天城市」:例如凌晨在 A 城装机、早点缺失、晚上到 B 城 → A +0.5、B +0.5
  • 手动补记依旧优先于一切打卡点

明细与导出中首点以「首 HH:mm 城市」显示(导出在备注列)。

质量

  • 新增 8 个首点场景单元测试(三点日、同半天两点、顶替早/晚点、异城各半天、参与年度统计、补记优先等),:core 共 34 个测试全绿
  • Android versionCode 4 / 0.3;iOS 0.3(源码构建,见 ios/README.md

覆盖安装即可,数据保留。老用户(已有记录)不受影响——首点只在「从未有过任何记录」时打一次。

TernDays v0.2.1

Choose a tag to compare

@github-actions github-actions released this 01 Sep 01:57

按反馈精简 v0.2 的桌面小组件。

变化

  • 小组件只显示最关键的信息:今年 Top 3 城市及天数(去掉了大数字统计与今日打卡状态行),加一行小字的年份作为上下文
  • 刷新改为纯打卡驱动
    • Android 取消 30 分钟周期轮询(updatePeriodMillis=0),只在打卡 / 补记 / 开机 / 添加小组件时刷新——正常情况每天随早晚两次打卡各刷新一次
    • iOS 时间线只在每个打卡时间点之后兜底刷一次,应用内打卡 / 补记时主动刷新
  • 摘要口径同步精简,单元测试更新(:core 共 26 个测试)

安装:从 Releases 覆盖安装即可,数据与已添加的小组件保留。

TernDays v0.2

Choose a tag to compare

@github-actions github-actions released this 01 Sep 01:54

新功能版本:桌面小组件(Android + iOS)。

桌面小组件

  • 内容:今年已记录天数与城市数、今日早 / 晚打卡状态、去过最久的 Top 3 城市;点击进入应用
  • Android:长按桌面 → 小部件 → TernDays 添加;可横向/纵向调整大小,适配系统深色模式;
    每次打卡、补记、开机后即时刷新,平时每 30 分钟兜底刷新一次
  • iOS:提供 small / medium 两种规格(长按桌面 → 添加小组件)。通过 App Group(group.app.terndays
    与主应用共享数据,旧版本数据自动迁移;打卡与补记后即时刷新(源码构建,见 ios/README.md,仍未真机验证)

其他

  • 摘要口径(天数 / 城市数 / 今日状态 / Top 城市)抽为共用纯函数并新增单元测试(:core 共 27 个测试)
  • Android versionCode 2 / versionName 0.2;iOS MARKETING_VERSION 0.2

安装方式与已知限制同 v0.1;从 v0.1/v0.1.1 覆盖安装即可,数据保留。

TernDays v0.1.1

Choose a tag to compare

@github-actions github-actions released this 01 Sep 01:24

v0.1 发布后的首个体验与质量补丁。

变化

  • 首页权限警示(Android + iOS):跳过引导或权限被收回时,首页顶部会出现「自动打卡还没就绪」的警示条,点击直达设置——避免以为在自动统计、实际权限没给全的情况
  • 修正城市详情页在数据未加载时可能显示异常占位文本的问题
  • 发布流程修正:从本版起 Release 的 tag 正确指向实际构建提交(v0.1 的 tag 因发布动作默认行为误指向仓库初始提交,且受 GitHub 权限限制无法由 CI 自动改正,详见 v0.1 发布说明的注记)

质量

  • 新增内置离线城市库的集成测试:文件格式合法性、3.4 万点规模校验、10 组关键城市坐标(杭州/北京/深圳/昆山→苏州/廊坊/港澳/东京/大阪/新加坡)解析断言
  • 导出文件经外部工具实测:openpyxl 正常打开 xlsx 双分表、数值单元格类型正确;CSV 带 BOM + CRLF,Excel 打开无乱码

安装方式与已知限制同 v0.1