Releases: lingion/sleepy-ios
Releases · lingion/sleepy-ios
Release list
Sleepy iOS a.v.1.0.42 — 节假日课程灰显 + Android 对齐三处
Sleepy iOS a.v.1.0.42 — 节假日课程灰显 + Android 对齐三处
新功能: 节假日课程灰显(从 Android 版完整移植)
法定节假日/调休补班的日期,课表里对应课程自动变灰。设置入口在 我的 → 通用 → Holiday course dimming,里面可以:
- 开关「法定节假日置灰」(默认开):国庆、春节这类假期,当天课程显示为灰色。
- 开关「周末课程置灰」(默认开):周六周日的课自动变灰;补班日不算,照常显示。
- 灰显样式二选一:纯灰色,或灰色加删除线。
- 数据页逐段展示全年假期/补班日,支持翻年份、手动添加/编辑/删除自定义日期段,删掉的自带数据可一键恢复。
- 数据来自 holiday-calendar (unpkg.com),缓存到本地,断网也能用上次的缓存。
修复: 语言切换不生效
通用页切语言后,界面要杀掉重开才变。现在切完立即刷新,不用重启。
修复: 我的页统计排布 + 课程数胶囊(对齐 Android)
- 顶上三段统计(课程数/课表数/当前周)之前挤在一块,现在两边靠边、中间居中,和 Android 一致。
- 首页周视图格子里的课程数胶囊,之前只显示数字,现在显示「N 门」完整字样,格子太窄放不下才退回纯数字。
修复: UI 细节对齐 Android
- 全 app 去掉按钮/卡片描边,统一纯色块(选中级 = 底色 + 对勾)。
- 按钮高度统一对齐 Android 两级:普通 48pt、主操作 56pt。
- 分段选择器(课表页顶部)尺寸修正。
- 今天页课卡点开详情补齐缺失字段。
回归终态
- 全量:单元 172 passed / UI 130 passed / 0 failed / 1 skipped(权限固化用例按设计 skip)。含节假日数据层新单测 19 个、设置页入口 UI 用例 1 个。
已知边界
- 节假日数据源是第三方 (unpkg.com/holiday-calendar),数据错误时可在设置页手动改。
- 灰显在周视图和全周网格生效;今日页课卡不变灰(对齐 Android 行为)。
Sleepy iOS a.v.1.0.41 — 教务 WebView 跳转修复 + 全 app 触摸热区修复
Sleepy iOS a.v.1.0.41 — 教务 WebView 跳转修复 + 全 app 触摸热区修复
教务导入: 中间页卡片点不动(修复)
新窗跳转被静默丢弃(用户报障核心)
- 教务系统(如哈工程金智教务)功能卡片大量使用
target="_blank"/window.open(),多级跳转后停在某页点卡片无反应。根因:WKWebView 没有 WKUIDelegate 时新窗请求被静默丢弃——Android WebView 默认在当前页打开新窗,移植 iOS 时这层语义丢了。 - 修复:挂
NavUIDelegate.createWebViewWith,新窗 URL 一律在当前 WebView 内打开(对齐 Android 行为)。普通链接/重定向不受影响。
重定向链混 http 中间页断掉
- 校园网教务系统的跳转链常夹 http 中间页,WKWebView 默认按 ATS 拦截,表现为跳一半断掉。已在 Info.plist 放开
NSAllowsArbitraryLoadsInWebContent(只作用于 WebView 内网页内容,不影响 app 自身网络请求),等价 Android 的mixedContentMode=ALWAYS_ALLOW。
全 app 触摸热区: 点色块无反应,必须点中图标/文字(修复)
- 全 app 63 处按钮用了
.buttonStyle(.plain),其点击判定只认图标/文字的字形边界,padding+ 色块背景不参与命中——所以点"检查更新"整条色块、我的页"所有课表/导出/提醒"等设置行、各设置卡片行,只有恰好点中图标或文字才触发。 - 新增统一
SleepyButtonStyle:contentShape(Rectangle())让整块色卡任何位置可点,并补了按下的透明度反馈(Material 手感)。63 处全部替换,今后新按钮统一走这个样式。 - 覆盖面:按钮 63 处 +
onTapGesture块 3 处(原本已有 contentShape)全部核查过,无遗漏形态。
回归保护(本轮新增 9 用例)
- WebView 导航策略 4 单测:修复前对照(无 UIDelegate 确证新窗请求被丢)+ 修复后 target=_blank / window.open 在当前页打开 + 普通链接无回归。本地 HTTP server 提供页面,零网络依赖。
- WebView 端到端 3 用例:走真实导入入口(我的 → 教务导入 → 自定义 URL),分别验证 target=_blank / window.open / 普通 href 三类卡片点击后到达第二页。
- 热区回归 3 用例:关于页"检查更新"按钮色块区点击触发;我的页"所有课表"、"导出"行右端空白区点击跳转——锁死"点整块色卡"场景。
回归终态
- 全量:单元 148 passed / UI 127 passed / 0 failed / 1 skipped(权限固化用例按设计 skip)。
已知边界
- 哈工程教务(202.118.176.13)仅校园网可达,本轮用同构行为的本地页面完成端到端验证;真实站点请连校园网点一遍导入流程确认。
- 模拟器 XCUITest 合成点击与真机手指 hit-test 存在机制差异,触摸手感最终以真机验收为准。
Sleepy iOS a.v.1.0.40 — QA 缺口全面闭环(264 用例全绿)
Sleepy iOS a.v.1.0.40 — QA 缺口全面闭环(264 用例全绿)
真实 QA 抓出并修复的 bug
sleepy URL scheme 从未注册(深链 -10814 根因)
- Info.plist 缺 CFBundleURLTypes,
sleepy://深链在真机/模拟器上直接报 -10814(无法打开)。已注册sleepyscheme。
Reminder 时间行点击完全失效(点击区 19pt)
- ReminderScreen 时间行 Button 用了
.buttonStyle(.plain)但没有.contentShape(Rectangle()),a11y/实际可点击区域只有文字那一行(19.3pt)——点行右侧空白处什么都不发生。补 contentShape 后全行可点。与 a.v.1.0.39 修的 AllTables 齿轮是同一类根因(第三次)。
深链链路定位(Xcode 14.3.1 模拟器双重缺陷,产线代码零改动)
XCUIApplication.open(_:)在本 Xcode/iOS16.4 组合上丢 URL:SpringBoard 只收到 launch 请求、收不到 with-url 请求,onOpenURL 永远不触发。双端同步 log stream 取证。- 产线链路用
simctl openurl对照实验证完:onOpenURL → deepLinkCourse → 编辑页预填高等数学,全通。 - UI 测试改用 app 内
SLEEPY_UI_TEST_OPENURL钩子自触发UIApplication.shared.open,走真实 lsd 路由。真实用户路径不受影响。
QA 缺口闭合(本轮新增 15 个 UI 用例 + 2 项断言补强)
- 导出全路径 5 用例:JSON / ICS / 分享文本,snackbar 文案+自动消失,分享面板取消回退。
- Reminder 权限状态机 4+1 用例:master→daily→before-class 幂等开启链;denied 专项批(xcrun uninstall 后单跑)验证拒绝路径。权限弹窗必须经
springboard.alerts.firstMatch.buttons查询。 - 文件导入桥接 1 用例:系统文件面板弹出/取消/不误弹预览。
- Widget 归档矩阵补强到 11 组合:TodayWidgetRV × sm/md/lg + TwoDay/WeekList/WeekView/WeekGridWidgetV19 × md/lg,归档日志逐一断言。
- 深链 4 用例全绿:课程深链开编辑页(预填)、非法 id 停留课表、导入深链弹预览(表名+冲突数)、空文本不崩。
sleepy://open冒烟从空壳改为真实路由验证。
测试基建沉淀
- 种子课程 id 固定 1..4(深链测试确定性定位)。
- ImportPreviewDialog / ManagementPage / ExportScreen / ReminderScreen 补稳定 accessibilityIdentifier(跨 locale 不变)。
- xcresult 解析:
id._value嵌套、-only-testing bundle 缺 case 层节点,均已记档。
回归终态
- 全量 264 passed / 0 failed / 1 skipped(denied 权限用例在权限固化后按设计 skip,uninstall 重演已单独验证为绿)。
Sleepy iOS a.v.1.0.39 — AllTables 齿轮修复 + 表切换/删除全链路测试
v1.0.39 — AllTables 齿轮修复 + 表切换/删除全链路测试
真实 QA 抓出的 bug(已修复)
非当前表的齿轮编辑入口完全失效(AllTablesScreen)
- 症状:All Schedules 列表里,点非当前表行的齿轮 → 不进编辑页,反而直接切到那张表并回 Mine 页。表改名、表删除的唯一入口报废。
- 根因:Android 原版行是
Row + noRippleClickable、齿轮是独立IconButton,事件互不干扰;iOS 移植时行误用 SwiftUIButton包裹,齿轮成了嵌套 Button,点击冒泡给外层行 → 非当前行走selectTable + onBack。 - 修复:行改
contentShape + onTapGesture,与 Kotlin 结构同构;齿轮保持独立 Button。 - 回归:TableSwitchUITests 3 用例 + MineSettingsUITests 13 用例全绿。
新增测试
- TableSwitchUITests(3 用例):按真实导航语义全覆盖 — 新建不保存 = 丢表、建表→切表→当前态迁移(Current · Week 副标题唯一性)、Schedule 页课程数据随表切换联动、齿轮(y 坐标定位 table_edit_)→删除确认→回 Schedule 页→observeAllTables 自动回退默认表。
- AppPrefsTests.testThemeKeyRoundTripAndPublisher 修正:本机 Xcode 14.3.1 + iOS 16.4 模拟器 XCTest 存在 Combine 环境级异常(订阅回放可达、之后任意 subject 的 send 均不投递 sink;8 行最小复现,双模拟器一致,macOS 同工具链正常,dyld 缓存重建无效)。投递式断言改为环境无关契约:订阅回放 + 持久化往返 + 重订阅取最新值。
测试总量
SleepyTests 144/144 + SleepyUITests 106/106 全绿。
Sleepy iOS a.v.1.0.38 — Widget 归档验证闭环
v1.0.38 — Widget 归档验证闭环
修复
- WidgetArchivingUITests 永久误报根除: 原测试依赖宿主机
log stream写/tmp/sleepy_widget.log,实测模拟器上processImagePath谓词收不到 widget 扩展日志,导致每次跑批必失败(误报 widget 缺陷,实为测试基础设施断层)。
新增
- WidgetArchiveLog: 5 个 widget Provider 的 placeholder/getSnapshot/getTimeline 完成时向 App Group
widget_archive.log追加归档记录 — 兼作真机排查 widget 空白/不刷新的离线诊断日志(Android logcat 对等物)。 - Mine 页
-SLEEPY_WIDGET_LOG_HOOK测试钩子: app 进程代读归档日志渲染为 accessibility 元素,供 XCUITest 进程内断言。
验证
- 5 widget kind × 11 family 组合归档全部 success(44 条日志记录)。
- 全量 9 UI 测试套件回归 92/92 全绿。
工程
- project.yml 补录 xcodegen 不自动生成的标准设置(PRODUCT_NAME/TEST_HOST/BUNDLE_LOADER/ENABLE_TESTABILITY/ONLY_ACTIVE_ARCH + runner entitlements),重新生成项目不再丢失。
Full Changelog: https://gh.qdp.qzz.io/lingion/sleepy-ios/compare/v1.0.37...v1.0.38
Sleepy iOS a.v.1.0.36
Sleepy 课程表 iOS,版本号对齐 Android 1.0.36 线。
修复
- JW 教务直连导入 sheet 深色模式失效: sheet 是独立 presentation tree,未继承主题环境,深色下仍显示浅色背景。现在显式注入 SleepyThemeProvider + preferredColorScheme。
- EditTableScreen / ImportSheet 展开按钮点击区域过小,点击无响应。
- Today Widget 桌面归档渲染: ScrollView 在 WidgetKit 归档路径下不渲染,替换为 clipped VStack。
测试与 QA
- UI 测试扩至 230 个用例全绿: 新增 A6 深色像素级回归(11 个子页 CoreGraphics luma 断言)、A1/A2/A3/A5 截屏矩阵(zh-Hans/en/es/ja/zh-Hant)、5 语言 Mine/Schedule 对照。
- JW 全文本导入流程测试改走 UIPasteboard + 长按粘贴菜单。
- 课程解析器(ScheduleParser)对齐 Android ICS / 纯文本行为,新增 23 个审计用例。
数据
- 学期边界状态(未开始/已结束)覆盖 Today / Schedule / 5 个 Widget 表面。
- Mine 统计通过 locale 无关锚点验证。
安装
下载下方 IPA 文件,使用 AltStore 或 SideStore 签名安装。
Android 原版: https://github.com/lingion/sleepy
Sleepy iOS a.v.1.0.34
Sleepy 课程表 iOS a.v.1.0.34
Sleepy 课程表 iOS 移植版,版本号与 Android a.v.1.0.34 对齐。
新增
- 完整课程表管理:导入、手动添加、编辑、删除
- 今日、两天、周视图和课程列表 Widget
- 深色/浅色主题
- GRDB 数据持久化
- JSON 数据导入与导出
- 自适应屏幕布局和中文文本排版
- App Logo、App Icon 和启动画面
技术要求
- iOS 16.0+
- SwiftUI
- WidgetKit
- GRDB 6.29.3
- Xcode 14.3.1
安装
下载下方的 IPA 文件,使用 AltStore 或 SideStore 签名安装。