说真的,蘑菇视频 iOS 的通知权限问题我终于定位到原因了——也算是让人松了口气,顺便把整个排查过程和最终修复写下来,方便遇到同样问题的朋友少走弯路。

先说结论(先把最关键的交代清楚): 经过排查和多次复现,根因是服务端在向 Apple Push Notification service(APNs)发送推送时,没有为“告警类”通知正确设置 HTTP/2 header(尤其是缺失或错误地设置了 apns-push-type 与 apns-priority),导致 iOS 在新版本策略下把这些推送当成低优先级或不予投递。换句话说,APP 并没有“没权限”,而是推送没按 iOS 要求发到位,设备端自然收不到弹窗/声音提醒。
下面把排查过程、通俗解释、开发端的解决方案和用户端的临时应对措施分开说清楚。
一、症状表现(用户常描述的情况)
- 很多用户反映:设置里显示“允许通知”,但收不到蘑菇视频的播放/消息推送;
- 有的用户能收到 Badge(角标),但没有横幅或声音;
- 有的用户在某些设备或某个 iOS 版本上根本不触发通知;
- 服务器日志显示已经发出推送,但 APNs 返回成功且设备上没有提醒。
二、我是怎么一步步定位的(可复现的排查思路)
- 排除客户端设置类问题:先让测试机检查 Settings → 通知 → 蘑菇视频(Allow Notifications、Banners、Sounds、Lock Screen 等是否打开);确认不是用户误关掉或 Focus/勿扰类功能影响。
- 客户端日志:确认应用注册了远程推送(didRegisterForRemoteNotifications),并上报了 device token。
- 服务器日志与 APNs 返回值:查看服务器发包历史,确认 APNs 并没有明确报错(没有 410/400 类错误),但也注意到我们用的是 HTTP/2 接口且 header 不一致。
- 使用抓包+APNs 测试工具复现:用自建脚本和 Apple 的 HTTP/2 接口反复发送不同 header 的请求,发现当缺失 apns-push-type 或设置 apns-priority 为 5(低优先级)时,通知有时会被延后或不显示为 alert(尤其在 iOS 15+)。
- 进一步对比:对比能够正常推送的其他应用请求,发现它们在 header 中明确写了 apns-push-type: alert 与 apns-priority: 10。
四、开发端的修复步骤(如果你是开发/运维)
- 确认使用的是 APNs HTTP/2 接口(推荐用 token-based authentication),不要混用过时的二进制接口。
- 发推送时必须在 HTTP/2 header 中带上:
- apns-push-type: alert (用于有 alert 的推送)
- apns-priority: 10 (即时提醒用 10;后台静默一般用 5)
- apns-topic: com.yourcompany.yourapp (bundle id,若有 Notification Service Extension,topic 可能需要带上 extension)
- 检查 payload:
- alert 字段是否存在,content-available 与 mutable-content 的组合是否合理;
- 如果用了 Notification Service Extension,确认 mutable-content: 1 且扩展没有奔溃(扩展跑飞会导致通知无法展示)。
- 验证证书/Key:
- 如果用证书,确认没有过期;
- 推荐用 APNs Auth Key(.p8),更稳定、避免证书到期问题。
- 在测试环境复现:把相同 payload 分别用带/不带 apns-push-type 的请求发往 APNs,观察设备端行为确认差异。
- 监控与回滚策略:上线后加强监控(推送成功率、用户反馈),必要时可以回滚到已验证的推送逻辑或临时把某类消息改为 app 内显式提醒(比如打开 App 时展示)。
五、普通用户可以做的自检与临时解决方案 如果你不是开发者但遇到蘑菇视频通知问题,可以先按这几步自检:
- 设置 → 通知 → 蘑菇视频:确保允许通知、横幅、声音等都打开;
- 检查 Focus/勿扰/专注模式:确认没有对蘑菇视频单独静音或把通知摘要归到“推送摘要”里;
- 检查“通知摘要”设置(iOS 15+):把蘑菇视频从“按计划摘要”里移出,确保能立刻弹窗;
- 确认 Background App Refresh 已开启(有些静默/内容更新类通知会依赖);
- 如果问题持续:尝试重启手机、登出再登录蘑菇视频账号或删除重装应用(重装会重新触发注册推送流程,能解决 token 不匹配的问题)。
六、我在蘑菇视频那边做了什么(落地的改动)
- 在服务端统一规范推送 header:对所有“告警/消息”类推送统一添加 apns-push-type: alert 与 apns-priority: 10;
- 修复了一个 Notification Service Extension 在特定 payload 下崩溃的 bug(扩展奔溃会直接造成通知无法展示);
- 把过期证书替换为 apns auth key,并增加了自动报警(证书/Key 到期预警);
- 上线后进行分批灰度监控,用户反馈回归正常,推送到达率恢复。
七、最后几句总结(以及如果你需要帮助) 如果你也遇到“明明允许了通知却收不到”的情况,先按上面用户自检流程试一遍;对于开发团队,检查 APNs header 与通知扩展的稳定性会是最直接的突破口。蘑菇视频这次的问题主要是服务端发包细节与扩展稳定性两个地方同时影响了投递,修好了就恢复了正常。
要是你想把我这套排查流程直接套到你的 APP 上,或者需要我帮忙做一次推送诊断,我可以把具体测试脚本、示例 header、以及一份可复用的检查清单发给你——在文末留言或者私信我,我们可以继续跟进。