Skip to content

Releases: lingion/sleepy-ios

Sleepy iOS a.v.1.0.42 — 节假日课程灰显 + Android 对齐三处

Choose a tag to compare

@lingion lingion released this 29 Aug 16:30

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 触摸热区修复

Choose a tag to compare

@lingion lingion released this 29 Aug 07:11

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 用例全绿)

Choose a tag to compare

@lingion lingion released this 29 Aug 03:08

Sleepy iOS a.v.1.0.40 — QA 缺口全面闭环(264 用例全绿)

真实 QA 抓出并修复的 bug

sleepy URL scheme 从未注册(深链 -10814 根因)

  • Info.plist 缺 CFBundleURLTypes,sleepy:// 深链在真机/模拟器上直接报 -10814(无法打开)。已注册 sleepy scheme。

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 齿轮修复 + 表切换/删除全链路测试

Choose a tag to compare

@lingion lingion released this 29 Aug 03:08

v1.0.39 — AllTables 齿轮修复 + 表切换/删除全链路测试

真实 QA 抓出的 bug(已修复)

非当前表的齿轮编辑入口完全失效(AllTablesScreen)

  • 症状:All Schedules 列表里,点非当前表行的齿轮 → 不进编辑页,反而直接切到那张表并回 Mine 页。表改名、表删除的唯一入口报废。
  • 根因:Android 原版行是 Row + noRippleClickable、齿轮是独立 IconButton,事件互不干扰;iOS 移植时行误用 SwiftUI Button 包裹,齿轮成了嵌套 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 归档验证闭环

Choose a tag to compare

@lingion lingion released this 29 Aug 03:08

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

Choose a tag to compare

@lingion lingion released this 28 Aug 13:47

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

Choose a tag to compare

@lingion lingion released this 25 Aug 10:10

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 签名安装。

Android 原版

https://github.com/lingion/sleepy