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)。

#问题(严重度降序)严重度平台版本负责人问题原因
1Android 8.4.1.6 及 HarmonyOS 1.1.1.11 单设备随机离线、P2P 恢复失败
18 期 · 157 条反馈
100Android · HarmonyOS1.1.1.11 / 8.4.1.6 / 1.1.1陈宝旺、冉博麟、唐胜、李国涛257582、257639 已确认是服务端心跳长期停更并伴随 P2P 离线,App 只是按离线状态展示;问题更可能在设备端、设备网关/P2P 服务或固件恢复机制,而不是 Android 播放器单点故障。
2Android 与 iOS 8.4.1.6 报警功能突然失效与通知不达
1 期 · 3 条反馈
90Android · iOS8.4.1.6陈宝旺、许源现有客户端样本表明 Android 通知权限与 token 注册均成功,故障更接近“服务端未生成报警或推送任务未送达”,但神策缺少报警生成与推送到达事件,iOS 样本又混合了通知权限关闭,当前不能完成单点定因。
3HarmonyOS 画中画状态导致切换设备后仍显示前一路画面
1 期 · 3 条反馈
90HarmonyOS1.1.1.11 / 1.1.2.3张跃译多个 HarmonyOS 画面共享一个无代次、无串行化、无旧控制器清理的 PipManager,切换设备时旧创建任务和新选择竞争,最终把第一路 XComponent、savId 或恢复状态保留下来。
4升级后回放体验整体退化
4 期 · 18 条反馈
85Android · iOS8.4.1.6 / 8.3.14.2唐胜、许源、欧阳荣、谭伟8.4.1.6 对回放链路做了多处改动(时间条 UI、通道切换进度对齐、报警-录像联动),导致回放体验多点退化;Logan 显示取流层无崩溃,问题在"UI/状态对齐 + 报警录像关联"而非连接失败。
5KMP 回放页未申请屏幕常亮,回放中手机自动息屏
11 期 · 29 条反馈
84Android · HarmonyOS8.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,回放过程中发生系统级息屏。
6SD 卡跌至不可读写或反复未初始化,录像回放被直接阻断
3 期 · 9 条反馈
80Android · HarmonyOS · iOS8.4.1.6 / 1.1.1.11唐胜、张威、陈宝旺设备上报的 SD 卡状态在 258245 中持续处于未初始化/格式化中,在 258173 中由正常可读写跌至不可读写;App 按协议正确展示异常,根因更可能在 SD 卡、卡槽/供电、设备存储控制器或固件挂载逻辑,而不是 KMP 页面误报。
7iOS `8.4.1.6` 云回放卡顿,首帧与失败状态可能被提前结算
2 期 · 8 条反馈
80Android · iOS8.4.1.6 / 8.3.11.3 / 8.4.106陈宝旺、欧阳荣、谭伟iOS 云回放容器允许解析完成后在 1.2 秒无首帧时提前向 KMP 返回成功,同时把 IJK 播放错误与正常结束合并处理,导致页面对真实卡顿、缓冲超时或解码失败缺少准确状态和可回溯证据;这是高度可疑的共同客户端缺陷,但仍需复现确认其是否为 3 名用户的直接主因。
8iOS 8.1.2.4 微信登录授权码重复提交触发 30100225
1 期 · 3 条反馈
80iOS8.1.2.4 / 8.1.204 / 8.4.106待定微信回调与恢复登录没有一次性 state、幂等锁和授权码消费机制,重复回跳或重试会把同一个单次授权码再次发给服务端,服务端以 30100225 拒绝后客户端仍保留旧状态。
9iOS 老版本微信登录空授权码触发 30100222
1 期 · 1 条反馈
80iOS8.1.3.5 / 8.1.305 / 8.1.503位冬微信授权回跳在当前旧版 iOS 上返回了空 code,客户端没有把它视为失败边界,仍向服务端提交空授权码,最终稳定触发 30100222。
10iOS 8.4.1.6 冷启动点击离线报警推送后未进入回放
1 期 · 2 条反馈
70iOS8.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.txt 3,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 闪退,进入问题 11258654
🟡 回放、录像或存储异常单点,未形成同条件共性8258650、258619、258616、258588、258583、258582、258562、258560
🟡 设备离线、无法查看或连接单点,需设备侧补证6258648、258645、258636、258631、258630、258563
🟤 设备设置、账号咨询、初始化失败或语义不足,转单点观察9258651、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平台与版本诉求价值判断
5416Android / 8.4.1.6修复从相册上传二维码后无法扫描添加设备⭐⭐⭐ 直接阻断添加设备,且已有图片证据,应按缺陷路径核查
5419Android / 8.4.1.6App 退到后台后仍弹出人形检测报警⭐⭐ 与告警触达体验相关,需产品明确后台弹窗合规与系统限制
5411Android / 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)

🗂️历史期次

查看全部历史期次(近 90 天)→