Files
TPSchedule/docs/tpschedule-0.7.8-notification-permissions.md
T

33 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TPSchedule 0.7.8+28:通知权限排查与通道初始化
日期2026-10-27。用户反馈vivo X200 Pro(V2405A)、Android16上后台没有课前通知,先前已允许精确闹钟及后台运行。本次先收集设备状态并用正式APK验证,未凭手机品牌归因。
## 已确认的直接原因及恢复
用户0.7.8+27首份诊断返回notifications=false、permissionDenied、scheduledCount=0和pendingCount=0;exactAlarm=true,backgroundRestricted=false,batteryOptimizationsIgnored=true、powerSaveMode=false、勿扰过滤正常。此时程序因为通知未获允许而没有安排课程提醒,不能归因精确闹钟或省电限制。
用户进入APP“通知设置”检查后,第二份诊断为notifications=true、exact、scheduledCount=23及pendingCount=23。随后重测“10秒后台测试”,用户明确确认“这次收到了”。因此现有构建27已经在用户手机恢复后台通知,本次没有证据认定Android16/厂商固件或Gson/R8本身存在故障。
同签名正式构建27也在独立Android16/API36测试设备完成原生验证:dumpsys alarm显示RTC_WAKEUP精确任务、约10秒后的请求时间、ScheduledNotificationReceiver;返回桌面12秒后dumpsys notification包含id=-1002、tag=hepan-test的通知记录。立即通知id=-1001也存在,未见接收器异常。测试设备使用软件渲染启动参数,不涉及真实学校帐号。
## 本次小修补
- 通知初始化成功后就创建hepan_lessons“课前提醒”类别,再查询权限/登记任务;此前仅在首次实际发出通知时才创建,诊断和设置中可能看不到类别。
- 使用原类别ID、原重要级别和配置,Android保留用户对已有类别的选择,不自动开启用户关闭的通知。
- 手动诊断增加appNotificationsEnabled、channelExists和courseChannelEnabled,分别显示通知总开关与提醒类别。导出的诊断使用相同显式字段白名单,不含课程、帐号或认证信息。
- 权限不足的提示明确说明当前没有安排课前提醒、应检查总开关与类别后重新检查。结构化日志记录允许/应用通知关闭/类别关闭三类结果。
- 原pendingNotificationRequests读取的是插件本机缓存,单凭pendingCount不能证明系统到点派发。本次以真实系统闹钟/通知记录和用户复测作为恢复证据;登记校验提示不再称为系统保存证明。
- 调度模式、课程时间、提醒多选、原receiver和权限清单不变,未引入系统闹钟兼容模式、常驻服务或新增省电豁免请求。
## 验证与交付
新增“首次检查之前已有类别”和“总开关/类别分别显示”回归,修改前均观察到失败;修改后通过,原拒绝类别、初始化重试及后台测试隔离等测试继续执行。独立检查发现Android7没有类别却显示缺失提示的问题,追加API24回归先失败后通过,旧系统不再显示该提示。
最终306项Flutter测试通过、静态分析无问题,正式APK构建成功。独立Android16/API36测试设备上安装构建28、清空该专用测试APP的数据并重新授予测试权限,首次进入APP即查到hepan_lessons类别、importance4、默认声音及振动,未先发送通知。随后精确登记后台测试并收到通知。
另一次正式包测试登记后回桌面,以测试设备root权限向已核对包名的APP进程发SIGKILL(不执行force-stop):原进程4158退出,10秒后系统创建接收器进程4461,通知记录出现id=-1002/tag=hepan-test,未见AndroidRuntime致命错误。证明该环境不依赖Flutter进程常驻即可投递;不是对所有厂商限制的无条件保证。测试设备使用软件渲染,通知触发仍为真实AlarmManager/receiver/native notify。
apksigner验证构建28签名有效,证书与构建27逐字节一致;MD5为78DE9119AD14727FA1C5E5E4E68145EE,RSA公钥与用户提供值一致。密钥、旧APK及0.5.4登记冻结材料保持。
版本名0.7.8、构建号28,com.tpschedule.app;原证书MD5、公钥、私钥和备案号保持。旧构建27保留。未改服务器或SMTP,未访问或修改用户手机配置,手机系统设置由用户自行操作完成。