Seetong · Report
🎯 Seetong 问题雷达 09:00 第245期
时间窗口:2026-10-20 17:06:35~2026-10-21 09:00:26(Asia/Shanghai)
TL;DR 核心要点
- 🔴 iOS 8.4.1.6 进入通道灯光或布防时间设置链路时,ChannelLightDefendenceViewController 的表格数据源在请求第 7 行时返回空 Cell,触发 NSInternalInconsistencyException 并直接闪退。反馈 258654 与同账号、广东地区的 4 次同栈崩溃完全对应,严重度 70 / 100,现象置信度强,根因置信度强。
- 🟠 本期没有第二个达到 60 分门槛且不重复的新问题。回放、录像、离线和设置类线索均为单点、同一用户重复提交或 24 小时同域重复,继续按任务账本观察。
- 258654:iOS 8.4.1.6、iPhone、广东惠州,08:43:52 反馈“闪退”,并提供 Logan 与 OBS 日志附件。
最近一个月 Top 问题
按严重度与复发期数排序,已把跨期同类反馈归集;负责人由问题代码锚点对应的 Git 提交历史(blame / 近期主要提交者)反查;数据窗口:最近 30 天(截至 2026-10-21)。
| # | 问题(严重度降序) | 严重度 | 平台 | 版本 | 负责人 | 问题原因 |
|---|---|---|---|---|---|---|
| 1 | Android 8.4.1.6 及 HarmonyOS 1.1.1.11 单设备随机离线、P2P 恢复失败 18 期 · 157 条反馈 | 100 | Android · HarmonyOS | 1.1.1.11 / 8.4.1.6 / 1.1.1 | 陈宝旺、冉博麟、唐胜、李国涛 | 257582、257639 已确认是服务端心跳长期停更并伴随 P2P 离线,App 只是按离线状态展示;问题更可能在设备端、设备网关/P2P 服务或固件恢复机制,而不是 Android 播放器单点故障。 |
| 2 | Android 与 iOS 8.4.1.6 报警功能突然失效与通知不达 1 期 · 3 条反馈 | 90 | Android · iOS | 8.4.1.6 | 陈宝旺、许源 | 现有客户端样本表明 Android 通知权限与 token 注册均成功,故障更接近“服务端未生成报警或推送任务未送达”,但神策缺少报警生成与推送到达事件,iOS 样本又混合了通知权限关闭,当前不能完成单点定因。 |
| 3 | HarmonyOS 画中画状态导致切换设备后仍显示前一路画面 1 期 · 3 条反馈 | 90 | HarmonyOS | 1.1.1.11 / 1.1.2.3 | 张跃译 | 多个 HarmonyOS 画面共享一个无代次、无串行化、无旧控制器清理的 PipManager,切换设备时旧创建任务和新选择竞争,最终把第一路 XComponent、savId 或恢复状态保留下来。 |
| 4 | 升级后回放体验整体退化 4 期 · 18 条反馈 | 85 | Android · iOS | 8.4.1.6 / 8.3.14.2 | 唐胜、许源、欧阳荣、谭伟 | 8.4.1.6 对回放链路做了多处改动(时间条 UI、通道切换进度对齐、报警-录像联动),导致回放体验多点退化;Logan 显示取流层无崩溃,问题在"UI/状态对齐 + 报警录像关联"而非连接失败。 |
| 5 | KMP 回放页未申请屏幕常亮,回放中手机自动息屏 11 期 · 29 条反馈 | 84 | Android · HarmonyOS | 8.4.1.6 / 8.4.1 / 8.4.2 | 唐胜、陈宝旺、许源、谭伟 | KMP 回放页的屏幕常亮能力已在代码中完整实现(KMP 公共层 → 桥接层 → Android 宿主层齐备),但承载该实现的提交只落在 feature_v8.4.2 一条分支上,feature_v8.4.4、master、hotfix_v1.1.1 全部不含,因此所有已发布版本(Android 8.4.1.6 / HarmonyOS 1.1.1.11)在运行时都走不到 FLAG_KEEP_SCREEN_ON,回放过程中发生系统级息屏。 |
| 6 | SD 卡跌至不可读写或反复未初始化,录像回放被直接阻断 3 期 · 9 条反馈 | 80 | Android · HarmonyOS · iOS | 8.4.1.6 / 1.1.1.11 | 唐胜、张威、陈宝旺 | 设备上报的 SD 卡状态在 258245 中持续处于未初始化/格式化中,在 258173 中由正常可读写跌至不可读写;App 按协议正确展示异常,根因更可能在 SD 卡、卡槽/供电、设备存储控制器或固件挂载逻辑,而不是 KMP 页面误报。 |
| 7 | iOS `8.4.1.6` 云回放卡顿,首帧与失败状态可能被提前结算 2 期 · 8 条反馈 | 80 | Android · iOS | 8.4.1.6 / 8.3.11.3 / 8.4.106 | 陈宝旺、欧阳荣、谭伟 | iOS 云回放容器允许解析完成后在 1.2 秒无首帧时提前向 KMP 返回成功,同时把 IJK 播放错误与正常结束合并处理,导致页面对真实卡顿、缓冲超时或解码失败缺少准确状态和可回溯证据;这是高度可疑的共同客户端缺陷,但仍需复现确认其是否为 3 名用户的直接主因。 |
| 8 | iOS 8.1.2.4 微信登录授权码重复提交触发 30100225 1 期 · 3 条反馈 | 80 | iOS | 8.1.2.4 / 8.1.204 / 8.4.106 | 待定 | 微信回调与恢复登录没有一次性 state、幂等锁和授权码消费机制,重复回跳或重试会把同一个单次授权码再次发给服务端,服务端以 30100225 拒绝后客户端仍保留旧状态。 |
| 9 | iOS 老版本微信登录空授权码触发 30100222 1 期 · 1 条反馈 | 80 | iOS | 8.1.3.5 / 8.1.305 / 8.1.503 | 位冬 | 微信授权回跳在当前旧版 iOS 上返回了空 code,客户端没有把它视为失败边界,仍向服务端提交空授权码,最终稳定触发 30100222。 |
| 10 | iOS 8.4.1.6 冷启动点击离线报警推送后未进入回放 1 期 · 2 条反馈 | 70 | iOS | 8.4.1.6 / 8.4.106 | 欧阳荣、谭伟、陈宝旺 | 当前冷启动没有留下通知响应回调或 KMP 回放路由证据,用户实际停留在普通启动链路;最可能的缺口是冷启动通知回调 / 参数分支未被当前处理逻辑承接或没有兜底,但尚不能确认是 APNs payload 缺 content、回调未到、视图条件拦截还是路由失败。 |
🔴 问题 1:iOS 通道灯光或布防时间页表格数据源返回空 Cell,导致确定性闪退 | 负责人:谭伟、欧阳荣
现象与覆盖范围
- 258654:iOS
8.4.1.6、iPhone、广东惠州,08:43:52 反馈“闪退”,并提供 Logan 与 OBS 日志附件。 - 神策
AppCrashed中,同一匿名用户于 08:28:28、08:29:39、08:30:14、08:43:15 共上报 4 次同一异常栈,覆盖iPhone11,8与iPhone16,2两个设备型号。最后一次发生时间与反馈提交时间相隔约 37 秒。 - OBS 日志显示,崩溃前用户进入“报警类型 → 人形报警 → SmartDetectionController”和灵敏度设置链路;表格的 dataSource 仍是
ChannelLightDefendenceViewController。当前证据能够确认崩溃页面与异常类型,不能据此判定灵敏度保存本身是触发条件。 - 严重度评分:70 / 100。反馈量 10(1 条反馈,但同一用户共 4 次线上崩溃);共性广度 30(iOS、两个 iPhone 型号、同一
8.4.1.6版本、广东地区四个维度);业务关键度 30(报警与布防设置属于监控配置主链路)。 - 去重判定:账本中没有“UITableView 第 7 行返回空 Cell”任务。258473 属于另一个 iOS 进程恢复样本,不包含本报告中的异常栈;本期新建独立任务跟踪本崩溃。
神策证据
- 2026-10-21 的
AppCrashed中,筛选$os=iOS、$app_version=8.4.106、$app_crashed_reason LIKE '%nil cell%',共 4 次 / 1 名用户。 - 四条记录的用户、地区和异常内容一致,设备型号分别为
iPhone11,8、iPhone16,2、iPhone16,2、iPhone11,8,时间分别为 08:28:28.547、08:29:39.481、08:30:14.167、08:43:15.462。 - 异常原文均为
UITableView dataSource returned a nil cell for row at index path ... {length = 2, path = 0 - 7}。最新一条的 TableView 尺寸为414 × 804,与 OBS 日志中的414 × 804完全一致。 - 同日 iOS
8.4.106全部AppCrashed为 282 次 / 187 人,异常原因字段存在多行或重复上报,不能把 282 直接解释为 187 个独立故障场景。上述 4 次 / 1 人同栈样本才用于本问题的精确归因。
Logan 关键日志
- 反馈 ID:258654。Logan 共 208,655 行、1,366,063 字节;OBS 附件包含
Log0.txt3,440 行和Log1.txt。 Log0.txt:2088:你的 NSArray数组已经越界了 但是已经帮你处理好了 7 7。Log0.txt:2089:*** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:], UITableView.m:16586。Log0.txt:2090:*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource returned a nil cell for row at index path ... path = 0 - 7'。Log0.txt:2093-2094:UncaughtExceptionHandler再次记录同一NSInternalInconsistencyException,说明 Catch 层只是在异常抛出后记录,空 Cell 已先触发 UIKit 致命断言。Log0.txt:2130-2131:libc++abi: terminating due to uncaught exception of type NSException,随后进程由 26747 切换为 26748 重新启动,构成完整“闪退 → 自动拉起”证据链。
代码定位
- 涉及模块:iOS 报警设置,
Seetong-App-iOS/Seetong5.0_ios/Seetong_tps/Classes/TPS/UIVC/VCSet/IOTAlarmSetViewController/。 ChannelLightDefendenceViewController.m:91:cellArray固定包含 7 个 Cell,即全天、夜间、自定义和 4 个时间段。ChannelLightDefendenceViewController.m:923-932:当currentEditableScheduleMode == 2时返回cellArray.count + 1,即 8 行;第 7 行本应走重置按钮 Cell。ChannelLightDefendenceViewController.m:867-876:cellForRowAtIndexPath再次实时读取currentEditableScheduleMode判断第 7 行是否为重置行;判断为否后直接执行cellArray[7]。ChannelLightDefendenceViewController.m:1141-1145:isResetTimeIndexPath依赖可变的currentEditableScheduleMode,而当前模式来自ChannelHumanAlarmSetViewController.lightAlarmScheduleMode或IPCAlarmSetViewController.trackAlarmScheduleMode,可在页面刷新、返回或异步状态更新期间改变。NSArray+ErrorHandle.m:47-53:数组越界方法被交换后只打印日志并返回nil,没有阻止UITableView接收空 Cell。日志中的7 7正是索引 7、数组长度 7。- 调用链:进入报警或人形设置 → 表格询问
numberOfRowsInSection得到 8 行 → 模式状态变化或表格仍请求旧第 7 行 →cellForRowAtIndexPath重新判断为非重置行 →cellArray[7]越界返回nil→ UIKit 断言并终止进程。 - 关键缺陷是同一表格的“行数”和“每行 Cell 类型”分别实时读取可变状态,同时没有对越界结果做兜底。直接把数组越界改成返回空 Cell 并不够,因为 UITableView 仍会因空 Cell 崩溃。
友盟证据
- iOS
8.4.106今日 08:00 小时段崩溃 113 次、影响用户 110 人、崩溃率 0.02%;09:00 已有 4 次、影响 4 人。该量级与当前早高峰编辑窗口相符。 - 近 7 天该版本每日崩溃为 1,840~2,094 次,影响用户 1,753~1,997 人,崩溃率稳定在 0.02%。本期异常不是平台级崩溃尖峰,而是特定设置页面上的确定性数据源错误。
- 友盟是聚合数据,不能按反馈用户一一关联;用户级精确归因以神策
AppCrashed和 OBS/Logan 为准。
根因结论
- 置信度:现象 🟢 强;根因 🟢 强。
- 一句话根因:
ChannelLightDefendenceViewController用可变布防模式动态计算 8 行,却在创建 Cell 时再次读取该可变状态;当状态变化或表格请求旧第 7 行时,重置行判断失效并执行cellArray[7],越界保护返回nil,最终由 UIKit 致命断言终止应用。 - 关键证据链:用户反馈“闪退” → 神策同账号、同地区 4 次
path = 0 - 7崩溃 → OBS 同一时间、同一 TableView 尺寸记录数组越界7 / 7→ UIKit 明示 dataSource 返回空 Cell → 进程 PID 从 26747 切换为 26748 → 代码中第 7 行仅由可变模式判断且无兜底。 - 明确不下的结论:不把问题归因于网络、NVR、固件或设备离线;不把灵敏度设置操作直接认定为根因,当前只确认崩溃发生在报警设置导航链路的表格刷新过程中。
建议下一步
- 分配给:iOS 主程欧阳荣;任务
T-20261021-090614-6b37,状态P1 / captured。 - 第一优先:在
reloadData前冻结一份不可变的可见行快照,让numberOfRowsInSection、cellForRowAtIndexPath、高度和重置行判断共同使用该快照,禁止在不同回调中反复读取可变模式。 - 第二优先:在
cellForRowAtIndexPath增加行类型集中映射和最终兜底。索引超界时返回明确的占位 Cell,同时记录设备 ID、当前模式、快照行数、索引和页面生命周期;不得依赖NSArray越界分类返回nil。 - 所有模式切换和
reloadData必须保证主线程、单次状态提交和同一刷新批次一致。若使用动画更新,改用performBatchUpdates或reloadSections,避免旧行索引在新数据源下继续请求。 - 回归路径覆盖全天、夜间、自定义三种模式连续切换,4 个时间段编辑、跨天拆分、重置按钮、返回上级页面、前后台切换和弱网下配置回包延迟;每种路径连续执行 20 次,不得出现越界日志、空 Cell 或进程 PID 变化。
- 验收同时观察
AppCrashed中path = 0 - 7 + nil cell的同栈数量归零,并保留修复前后同版本灰度对照。
本期扫描全量
| 分类与处置 | 反馈数 | 反馈 ID |
|---|---|---|
| 🔴 iOS 表格空 Cell 闪退,进入问题 1 | 1 | 258654 |
| 🟡 回放、录像或存储异常单点,未形成同条件共性 | 8 | 258650、258619、258616、258588、258583、258582、258562、258560 |
| 🟡 设备离线、无法查看或连接单点,需设备侧补证 | 6 | 258648、258645、258636、258631、258630、258563 |
| 🟤 设备设置、账号咨询、初始化失败或语义不足,转单点观察 | 9 | 258651、258626、258606、258587、258580、258578、258567、258554、258551 |
已折叠 1 条普遍性网络问题(含-102/-101/-1002与中/英/俄/法/西/葡/土/阿/日多语言网络提示模板,如Проверьте телефонную сеть、Please check your mobile network);全量明细见同名 Markdown 知识库。
反馈接口返回 total=112 / fetched=112 / complete=true,按 2026-10-20 17:06:35~2026-10-21 09:00:26 精确纳入。上表按主问题唯一归类,合计 112 条。258560 与 258562 为同一 HarmonyOS 用户连续提交,不按提交次数放大严重度。
心愿单、数据源与待补证
心愿单亮点
| 心愿单 ID | 平台与版本 | 诉求 | 价值判断 |
|---|---|---|---|
| 5416 | Android / 8.4.1.6 | 修复从相册上传二维码后无法扫描添加设备 | ⭐⭐⭐ 直接阻断添加设备,且已有图片证据,应按缺陷路径核查 |
| 5419 | Android / 8.4.1.6 | App 退到后台后仍弹出人形检测报警 | ⭐⭐ 与告警触达体验相关,需产品明确后台弹窗合规与系统限制 |
| 5411 | Android / 8.4.1.6 | 红外模式支持定时切换 | ⭐⭐ 可降低夜间配置成本,适合纳入设备能力与套餐评估 |
数据源状态
- 反馈平台:✅ 正常。
total=112 / fetched=112 / complete=true,窗口内 112 条全部纳入扫描。 - 心愿单:✅ 正常。
total=11 / fetched=11 / complete=true。 - 神策:✅ 正常。
AppCrashed精确筛出同一用户的 4 次UITableView nil cell异常,并提供时间、设备型号、地区和异常栈;$os与$app_version可用,$app_version在 iOS 实际值为8.4.106。 - Logan 与 OBS:✅ 核心证据完整。Logan、
Log0.txt和神策异常栈在时间、TableView 尺寸、异常原因和重启 PID 上互相印证。 - 代码仓:✅ 正常。已在
feature_v8.4.1中定位行数计算、Cell 创建、重置行判断与数组越界分类。 - 友盟:✅ 正常。补充 iOS
8.4.106崩溃总量与近 7 天趋势;版本筛选必须使用8.4.106,使用8.4.1.6会返回空数据。 - TAPD:⏭️ 未调用。当前有精确用户级崩溃栈与代码锚点,先用任务账本推进修复,不以历史 Bug 搜索干扰根因。
待补证
- 258654 崩溃前从报警设置返回或切换模式的具体用户操作序列,需回访并按 08:28 至 08:43 的时间线复现。
lightAlarmScheduleMode或trackAlarmScheduleMode在 08:43:15 的实际值及变化来源,需要在reloadData前后同时记录模式值、行数快照和当前导航栈。- 为什么同一账号在两台 iPhone 型号上连续触发同一行越界,需确认是否为共享账号切换设备后缓存配置不一致,还是表格刷新批次固定复现。
- 其他 7 条回放或录像反馈缺少 Logan,当前不能把 iOS 回放卡、Android 时间轴延迟和 HarmonyOS 看不到回放合并为同一根因;后续同类反馈应优先补日志和发生时间。
下一期 = 第246期 = 2026-10-21-H17.md(今天下午 17:00;窗口 今日 09:00:26~17:00)