[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-strapi-article:zh:saas-api-regional-error-reproduction":3,"blog-article:\u002Fblog\u002Fsaas-api-regional-error-reproduction":633,"blog-related:\u002Fblog\u002Fsaas-api-regional-error-reproduction":634,"blog-translations:\u002Fblog\u002Fsaas-api-regional-error-reproduction":635},{"available":4,"article":5,"relatedArticles":152,"translations":536},true,{"source":6,"id":7,"documentId":8,"translationKey":8,"locale":9,"slug":10,"path":11,"_path":11,"title":12,"description":13,"excerpt":13,"image":14,"publishedAt":15,"updatedAt":16,"author":17,"tags":18,"featured":19,"sortOrder":20,"readingTime":21,"bodyType":22,"bodyBlocks":23,"bodyHtml":151},"strapi",3788,"zjlb9qjer2rvrgqtamkv00vx","zh","saas-api-regional-error-reproduction","\u002Fblog\u002Fsaas-api-regional-error-reproduction","SaaS API 地区错误：复现路径与工单证据","SaaS API 只在特定地区报错时，如何区分客户端未收到响应、中间层返回错误或应用层故障？本文介绍出口对照、请求关联字段和日志取证方法。","https:\u002F\u002Fcms.quanqiudaili.com\u002Fuploads\u002Flarge_saas_api_cover_605a8ec982.webp","2026-10-28T01:58:49.939Z","2026-10-28T01:58:49.921Z","Global Proxies Team",[],false,0,2,"blocks",[24,30,34,39,43,47,51,55,59,63,67,71,75,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147],{"type":25,"children":26},"paragraph",[27],{"text":28,"type":29},"“只有某个地区报错”时，先固定构建、请求和账号，再比较出口条件。第一步记录客户端实际收到什么，以及失败发生在解析、连接、TLS 还是收到 HTTP 响应之后。","text",{"type":25,"children":31},[32],{"text":33,"type":29},"代理出口只控制请求发起地区，不会改变服务端路由或账号权限。排查结果应是一份可复现的记录，包含请求关联字段、时间线、出口条件和对照结果；它帮助定位问题，不替代服务端日志。",{"type":35,"level":21,"children":36},"heading",[37],{"text":38,"type":29},"先固定请求条件",{"type":25,"children":40},[41],{"text":42,"type":29},"记录构建号、请求方法与脱敏后的请求体、执行时段和授权测试账号。不同租户可能落在不同数据分片，因此账号也要固定。",{"type":25,"children":44},[45],{"text":46,"type":29},"每轮只改变出口；若账号或请求变化，应另记用例。出口对照出现差异只能说明相关性，不能单独确定根因。",{"type":35,"level":21,"children":48},[49],{"text":50,"type":29},"根据客户端现象排查",{"type":25,"children":52},[53],{"text":54,"type":29},"配置代理接入参数时，可参考[代理设置帮助](https:\u002F\u002Fhelp.quanqiudaili.com\u002Fdocs\u002Fproxy-Settings)。",{"type":25,"children":56},[57],{"text":58,"type":29},"先按观察到的现象分流，而不要从状态码直接推断责任层：",{"type":25,"children":60},[61],{"text":62,"type":29},"客户端解析或连接失败时，记录本地错误、阶段和出口；可能尚无服务端请求 ID。收到 4xx 或 5xx 时，记录状态和响应特征，再查由网关、中间层还是源站生成。502 有网关语义，但不能单凭状态码确定根因。",{"type":25,"children":64},[65],{"text":66,"type":29},"结合访问日志、上游日志和请求关联信息继续核实。",{"type":35,"level":21,"children":68},[69],{"text":70,"type":29},"收集请求关联字段和日志",{"type":25,"children":72},[73],{"text":74,"type":29},"请求 ID 通常是重要关联字段，但解析、建连失败时可能尚未分配 ID，也可能没有响应头。无 ID 时记录本地调用标识、UTC 时间与时钟误差、域名\u002F方法、失败阶段、错误和重试序号；服务端 ID 标为“未收到”，不补猜。跨层 ID 被重写或不透传时，记录可查到的映射。",{"type":25,"children":76},[77],{"text":78,"type":29},"**客户端记录请求与响应**",{"type":25,"children":80},[81],{"text":82,"type":29},"三者要同一次请求、同一时刻取。事后补记的时间戳与服务端日志对不上，是\"明明复现了却查不到\"最常见的原因。没有请求 ID 或响应头时，明确记录“未收到”，同时保留本地错误、解析\u002F连接阶段、耗时与出口。",{"type":25,"children":84},[85],{"text":86,"type":29},"**服务端按关联字段查询日志**",{"type":25,"children":88},[89],{"text":90,"type":29},"重点看上游调用、耗时与异常类型三处，不要整段通读。没有日志权限时，先按\"某个时段、某个请求 ID\"申请最小片段，比要全量日志更容易被批准。",{"type":25,"children":92},[93],{"text":94,"type":29},"**共享前脱敏**",{"type":25,"children":96},[97],{"text":98,"type":29},"去掉令牌、Cookie、签名密钥、手机号、邮箱与真实客户数据；保留请求 ID、时间戳、错误码与边缘服务信息。后者不影响定位，也不会带来合规风险。",{"type":35,"level":21,"children":100},[101],{"text":102,"type":29},"整理研发可复现的记录",{"type":25,"children":104},[105],{"text":106,"type":29},"工单保留环境与构建、脱敏请求、调用标识或服务端 ID、UTC 时间与时钟误差、失败阶段和错误码、出口对照，以及已排除的方向。无 ID 或响应头时明确写“未收到”，不要推测。",{"type":25,"children":108},[109],{"text":110,"type":29},"证据不足时标为“待确认”，并写清还缺的对照或日志。",{"type":25,"children":112},[113],{"text":114,"type":29},"记录时可用两行对照：同一构建、请求和账号下，一行直连、一行目标地区出口。分别填写实际响应；无请求 ID 或响应头时写“未收到”，并记录失败阶段。",{"type":35,"level":21,"children":116},[117],{"text":118,"type":29},"常见问题",{"type":25,"children":120},[121],{"text":122,"type":29},"**为什么本地怎么都复现不了？**",{"type":25,"children":124},[125],{"text":126,"type":29},"本地与客户出口路径可能不同。可使用可确认的目标地区出口对照；如已有真实请求关联 ID，也可从服务端日志开始排查。",{"type":25,"children":128},[129],{"text":130,"type":29},"**没有服务端日志权限怎么办？**",{"type":25,"children":132},[133],{"text":134,"type":29},"先保留客户端状态、响应和时间信息，请有权限的同事按时间窗口与可关联 ID 查询日志。某个日志源查不到，只能说明该来源未检索到；还需核对范围、采样和落盘延迟。",{"type":25,"children":136},[137],{"text":138,"type":29},"**地区是原因还是结果？**",{"type":25,"children":140},[141],{"text":142,"type":29},"地区可能只是与边缘服务、账号归属或数据分片共同变化的条件。工单应写清已排除的变量，而不只写“某地区不行”。",{"type":25,"children":144},[145],{"text":146,"type":29},"**一定要用代理 IP 才能复现吗？**",{"type":25,"children":148},[149],{"text":150,"type":29},"不一定。目标地区测试机或云主机也能提供出口；无论采用何种方式，都应记录目标端实际看到的地区和网络条件。","",[153,273,439],{"source":6,"id":154,"documentId":155,"translationKey":155,"locale":9,"slug":156,"path":157,"_path":157,"title":158,"description":159,"excerpt":159,"image":160,"publishedAt":161,"updatedAt":162,"author":17,"tags":163,"featured":19,"sortOrder":20,"readingTime":21,"bodyType":22,"bodyBlocks":164,"bodyHtml":151},3797,"lw08jq304om4xm0qdbam6996","mobile-app-network-egress-compatibility-testing","\u002Fblog\u002Fmobile-app-network-egress-compatibility-testing","移动 App 网络兼容测试：五个失败阶段定位法","同一个 App 构建，直连正常、换到某地区出口就失败，问题可能落在域名解析、连接建立、证书校验、鉴权或超时任一环。按阶段记录域名、信号和错误码，才能分清兼容缺陷与出口质量。","https:\u002F\u002Fcms.quanqiudaili.com\u002Fuploads\u002Flarge_app_cover_bab910e122.webp","2026-10-28T02:01:27.065Z","2026-10-28T02:01:27.051Z",[],[165,169,173,177,181,185,189,193,198,202,206,210,214,218,222,226,230,234,238,241,245,249,253,257,261,265,269],{"type":25,"children":166},[167],{"text":168,"type":29},"同一个 App 构建，直连时正常，换到某个地区的出口就失败，这种问题最容易被一句\"网络差\"带过去。实际上失败点可能落在五处：域名没解析出来、TCP 连接没建立、TLS 握手被拒、鉴权请求被拦、或者响应超时。",{"type":25,"children":170},[171],{"text":172,"type":29},"对自有或明确授权的 App，先固定构建与设备，再列出实际请求域名。代理出口用于控制请求发起地区，不会替代真实用户网络或服务端数据。",{"type":35,"level":21,"children":174},[175],{"text":176,"type":29},"先把 App 请求的域名列全",{"type":25,"children":178},[179],{"text":180,"type":29},"列出首屏接口、图片 CDN 和第三方 SDK 等实际请求域名，并标明哪些影响核心功能、哪些可以降级。这样可避免主接口正常、某个 SDK 不可达却被误判为整条链路正常。",{"type":25,"children":182},[183],{"text":184,"type":29},"以域名清单作为测试范围，逐项记录请求阶段和结果。",{"type":35,"level":21,"children":186},[187],{"text":188,"type":29},"按请求阶段记录失败",{"type":25,"children":190},[191],{"text":192,"type":29},"请求阶段不同，检查方式也不同：",{"type":194,"children":195},"code",[196],{"text":197,"type":29},"| 阶段 | 可观测信号 | 记录方式 |\n| --- | --- | --- |\n| 域名解析 | NXDOMAIN、解析超时、返回地址与预期不符等 | 记录错误码、解析器、返回地址与耗时；内网地址也可能是合法配置 |\n| TCP 连接 | SYN 无响应、建连超时 | 记录目标端口与建连耗时，区分本地到代理、代理到目标及服务端监听\u002F路由 |\n| TLS 握手 | 证书校验失败、握手重置或超时 | 记录证书链、服务身份、系统时间与握手日志；单一信号不定根因 |\n| 鉴权\u002F拒绝 | 返回 401 或 403 | 识别响应来自目标站、WAF 还是中间层，并记录错误码与响应特征 |\n| 超时 | 解析、建连、TLS 或传输阶段超时 | 记录失败阶段与耗时分布；重复结果用于确认现象，不单独证明根因 |",{"type":25,"children":199},[200],{"text":201,"type":29},"单一信号可能对应多种原因。例如解析失败可能来自解析策略或目标站可达性；TLS 失败可能与客户端校验或链路有关。先记录信号，再结合对照组定位。",{"type":25,"children":203},[204],{"text":205,"type":29},"记录请求停在哪个阶段，以及错误码和耗时。再用相同构建与请求条件比较直连和地区出口；差异只说明相关性，仍需结合服务端或供应商证据。",{"type":35,"level":21,"children":207},[208],{"text":209,"type":29},"对照直连与地区出口",{"type":25,"children":211},[212],{"text":213,"type":29},"对照时固定构建、设备、系统、语言、账号和请求参数，只改变出口。重复运行以观察结果是否稳定，并记录执行时段。",{"type":25,"children":215},[216],{"text":217,"type":29},"记录时间戳、出口地区和实际检测结果。先确认直连基线稳定；否则加入地区出口后难以区分问题来源。",{"type":35,"level":21,"children":219},[220],{"text":221,"type":29},"判断出口相关性与待查项",{"type":25,"children":223},[224],{"text":225,"type":29},"多次结果可帮助判断现象是否稳定，但单一出口失败只能说明与该出口条件相关。要判断责任层，还需补同地区其他出口、不同时间和服务端证据。",{"type":25,"children":227},[228],{"text":229,"type":29},"TLS 失败可能涉及证书链、系统时间、目标站策略或中间链路；多个出口结果随机波动也不能单凭现象确定为网络质量问题。应保留证据继续核对。",{"type":25,"children":231},[232],{"text":233,"type":29},"工单写清已验证的条件、失败阶段和仍缺的证据；证据不足时标为“待确认”，再决定由客户端、服务端或网络人员继续排查。",{"type":25,"children":235},[236],{"text":237,"type":29},"记录时可用简表列出请求域名、失败阶段、直连与地区出口的实际结果、错误码\u002F耗时及仍缺的证据。示例域名和结果不代表真实测试数据。",{"type":35,"level":21,"children":239},[240],{"text":118,"type":29},{"type":25,"children":242},[243],{"text":244,"type":29},"**Android 和 iOS 的网络栈差异会影响结论吗？**",{"type":25,"children":246},[247],{"text":248,"type":29},"会。两端的解析、连接复用和证书校验实现可能不同，应分别执行相同用例。",{"type":25,"children":250},[251],{"text":252,"type":29},"**DNS 解析失败和连接超时怎么区分？**",{"type":25,"children":254},[255],{"text":256,"type":29},"DNS 失败要核对错误码、解析器和策略；TCP 超时还要区分本地到代理、代理到目标及服务端监听\u002F路由。TLS 失败需核证书链、服务身份、系统时间与握手日志；401\u002F403 要识别由目标、WAF 还是中间层返回。每种现象都记录阶段和证据，不仅凭单一信号归因。",{"type":25,"children":258},[259],{"text":260,"type":29},"**启用了证书固定（pinning），还能测试吗？**",{"type":25,"children":262},[263],{"text":264,"type":29},"能做，但要看固定的是哪一层。只固定叶子证书的实现，换出口后证书不变，通常仍能建立连接；固定中间证书或整条链的实现，遇到地区链路上的中间设备改写就容易失败，这本身也是要记录的现象。这里不提供绕过证书校验的方法，测试应在授权的调试构建上进行。",{"type":25,"children":266},[267],{"text":268,"type":29},"**只在某个地区连不上，一定是代理 IP 的问题吗？**",{"type":25,"children":270},[271],{"text":272,"type":29},"单一出口失败不能直接说明是代理问题或 App 缺陷。结合失败阶段，补同地区多出口、供应商、时段、直连与服务端证据；DNS、TLS、401\u002F403 和超时都应先核实具体响应来源与路径，再决定是否换出口复测。",{"source":6,"id":274,"documentId":275,"translationKey":275,"locale":9,"slug":276,"path":277,"_path":277,"title":278,"description":279,"excerpt":279,"image":280,"publishedAt":281,"updatedAt":282,"author":17,"tags":283,"featured":19,"sortOrder":20,"readingTime":21,"bodyType":22,"bodyBlocks":284,"bodyHtml":151},3796,"y64gki0k633wq4rop2v89b94","website-third-party-script-regional-fallback-testing","\u002Fblog\u002Fwebsite-third-party-script-regional-fallback-testing","国际站第三方脚本测试：降级与告警验证","第三方脚本在部分地区加载失败时，如何判断页面降级是否符合设计？本文说明如何盘点页面依赖、在自有测试环境模拟阻断与超时，并检查核心流程、恢复行为和告警。","https:\u002F\u002Fcms.quanqiudaili.com\u002Fuploads\u002Flarge_cover_af12243bd0.webp","2026-10-28T02:01:10.949Z","2026-10-28T02:01:10.933Z",[],[285,289,293,297,301,305,322,326,330,344,348,352,356,360,364,368,372,376,380,384,388,392,396,400,404,407,411,415,419,423,427,431,435],{"type":25,"children":286},[287],{"text":288,"type":29},"第三方脚本在部分地区被阻断或超时，页面往往\"看起来还是正常的\"：布局没塌、图片还在，但表单提交不了、埋点全丢、支付卡在最后一步。这类第三方资源加载失败通常不抛错，因此比白屏更难发现，也更难排查。",{"type":25,"children":290},[291],{"text":292,"type":29},"按依赖影响安排测试：先检查阻断核心流程的脚本，再看非核心组件。地区出口用于观察资源是否可达；降级逻辑则在自有测试环境中通过故障注入验证。",{"type":35,"level":21,"children":294},[295],{"text":296,"type":29},"盘点页面依赖",{"type":25,"children":298},[299],{"text":300,"type":29},"先按页面列出第三方脚本、来源域名、用途和失败影响。同一脚本在不同页面可能有不同优先级；例如验证码脚本可能阻断注册流程，在内容页却只是增强功能。记录来源域名，便于把单个资源不可达与整页故障区分开。",{"type":25,"children":302},[303],{"text":304,"type":29},"可按影响分为三类，具体等级应由产品路径确认：",{"type":306,"format":307,"children":308},"list","unordered",[309,314,318],{"type":310,"children":311},"list-item",[312],{"text":313,"type":29},"阻断：核心动作做不了，比如登录、支付、提交表单，先测。",{"type":310,"children":315},[316],{"text":317,"type":29},"降级：功能变弱但可完成，比如推荐位不显示，其次测。",{"type":310,"children":319},[320],{"text":321,"type":29},"无感：埋点、AB 实验这类，最后测。",{"type":35,"level":21,"children":323},[324],{"text":325,"type":29},"在授权环境模拟常见失败",{"type":25,"children":327},[328],{"text":329,"type":29},"在自有测试环境模拟失败，不针对生产流量或第三方真实服务。可分别测试：",{"type":306,"format":307,"children":331},[332,336,340],{"type":310,"children":333},[334],{"text":335,"type":29},"阻断：在自有测试环境对指定请求做拦截或拒绝连接；不要改生产 DNS。",{"type":310,"children":337},[338],{"text":339,"type":29},"超时：让请求挂起不返回，观察页面的等待上限。",{"type":310,"children":341},[342],{"text":343,"type":29},"错误响应：返回 5xx 或格式错误的脚本内容，看是否抛异常并中断后续脚本。",{"type":25,"children":345},[346],{"text":347,"type":29},"分开测试后，才能看出页面对网络阻断、等待超时和错误响应的处理差异。",{"type":25,"children":349},[350],{"text":351,"type":29},"用出口去复现\"某些地区加载不了\"，拿到的是现象：代理 IP 能证明这个问题在你关注的出口上真实存在，但证明不了你的降级逻辑对不对。两件事要分开做，前者用观测，后者用模拟。若需检查代理连通性，可参考[智能检测助手](https:\u002F\u002Fhelp.quanqiudaili.com\u002Fdocs\u002FSmart-check)，再回到自有环境的故障注入验证。",{"type":35,"level":21,"children":353},[354],{"text":355,"type":29},"检查失败时页面如何响应",{"type":25,"children":357},[358],{"text":359,"type":29},"降级策略按依赖等级、已批准的安全设计与产品契约验收。核心安全依赖失败时，明确提示并受控阻断可能是正确设计；替代验证必须经安全审查且不得降低校验强度。非核心组件是否需要提示，也按产品体验要求判断。",{"type":25,"children":361},[362],{"text":363,"type":29},"**页面布局**",{"type":25,"children":365},[366],{"text":367,"type":29},"检查脚本未加载时布局是否跳动、核心控件是否被遮挡。是否构成缺陷按产品体验要求判断。",{"type":25,"children":369},[370],{"text":371,"type":29},"**核心流程与安全边界**",{"type":25,"children":373},[374],{"text":375,"type":29},"按已批准的产品方案验证主流程。验证码等安全依赖失败时，可能需要安全阻断并明确提示；不要临时接入未经审核的替代验证，也要确认页面不会误报成功或重复提交。",{"type":25,"children":377},[378],{"text":379,"type":29},"**状态提示**",{"type":25,"children":381},[382],{"text":383,"type":29},"检查失败状态是否清楚可见，避免页面无响应或误报操作成功；提示和后续操作按产品设计验收。",{"type":25,"children":385},[386],{"text":387,"type":29},"对于受影响的流程，检查页面表现、操作结果和数据状态是否一致。",{"type":35,"level":21,"children":389},[390],{"text":391,"type":29},"验证恢复和告警",{"type":25,"children":393},[394],{"text":395,"type":29},"网络恢复后，检查脚本是否重复初始化、用户行为是否重复上报，以及告警是否按配置触发。",{"type":25,"children":397},[398],{"text":399,"type":29},"告警这一项最容易漏测。日志断言只能证明应用记录了事件，不能证明告警规则触发或通知送达。已接入测试通道时，验证规则、观察窗口、通知路由、接收与恢复解除；没有通道时明确标注“告警送达未验证”。",{"type":25,"children":401},[402],{"text":403,"type":29},"记录页面、脚本、模拟方式、用户可见结果和告警状态。日志存在不代表告警送达。",{"type":35,"level":21,"children":405},[406],{"text":118,"type":29},{"type":25,"children":408},[409],{"text":410,"type":29},"**模拟失败会不会影响线上真实用户？**",{"type":25,"children":412},[413],{"text":414,"type":29},"若故障注入严格限定在自有测试环境或隔离会话，并确认规则不会影响生产流量，通常不会影响线上用户。测试前先核对拦截范围；不要对第三方真实服务主动探测或施加阻断。",{"type":25,"children":416},[417],{"text":418,"type":29},"**脚本失败但页面看起来正常，还需要处理吗？**",{"type":25,"children":420},[421],{"text":422,"type":29},"视影响等级和安全设计决定。重点确认用户是否能识别失败、核心流程是否按预期处理，以及数据有没有误报成功或重复提交。",{"type":25,"children":424},[425],{"text":426,"type":29},"**降级做到什么程度算通过？**",{"type":25,"children":428},[429],{"text":430,"type":29},"按依赖等级、安全设计和产品约定判断。受控阻断可能是正确结果；替代流程不得绕过安全校验。日志断言通过也不代表告警已经发送或送达。",{"type":25,"children":432},[433],{"text":434,"type":29},"**用代理 IP 复现脚本失败就够了吗？**",{"type":25,"children":436},[437],{"text":438,"type":29},"不够。出口只能证明\"在这个地区确实加载失败\"，证明不了降级逻辑写对了。降级要单独测，出口只是发现问题的入口。本地请求拦截或 mock 可模拟失败，但不能证明目标地区出口或第三方实际故障；地区可达性观察与本地故障注入要分开记录。",{"source":6,"id":440,"documentId":441,"translationKey":441,"locale":9,"slug":442,"path":443,"_path":443,"title":444,"description":445,"excerpt":445,"image":446,"publishedAt":447,"updatedAt":448,"author":17,"tags":449,"featured":19,"sortOrder":20,"readingTime":450,"bodyType":22,"bodyBlocks":451,"bodyHtml":151},3795,"gfk97rtcs8x8vegewhqnyala","mobile-app-push-timezone-network-delivery-testing","\u002Fblog\u002Fmobile-app-push-timezone-network-delivery-testing","App 推送时区测试：三层时间与边界用例","推送\"延迟\"常被当成网络问题，实际是触发时间、到达时间、展示时间三层语义混在一起。固定基准时钟，覆盖 UTC 边界与夏令时切换，分别记录三层时间与点击后的落地状态，才能判断问题在哪一层。","https:\u002F\u002Fcms.quanqiudaili.com\u002Fuploads\u002Flarge_app_cover_2edd2f32cb.webp","2026-10-28T02:00:54.047Z","2026-10-28T02:00:54.036Z",[],1,[452,456,460,464,468,472,476,480,484,488,492,496,500,504,508,512,516,520,524,528,532],{"type":25,"children":453},[454],{"text":455,"type":29},"推送延迟要先分清服务端调度、推送服务状态、设备接收和屏幕展示。用户反馈的“没收到”可能发生在其中任一环节。",{"type":25,"children":457},[458],{"text":459,"type":29},"先统一测试设备与服务端的时钟，再分别记录调度触发、服务端收到的推送状态、设备实际接收和通知展示时间。设备时区与网络出口是不同变量，应分开测试。系统推送和用户点击后加载页面也可能走不同网络路径；只有实际配置走代理的请求才使用该出口。本文聚焦自有 App 的验证。",{"type":35,"level":21,"children":461},[462],{"text":463,"type":29},"分别记录调度、接收与展示",{"type":25,"children":465},[466],{"text":467,"type":29},"这几个时间点由不同环节产生，记录时应使用同一通知 ID，并区分服务端日志与设备侧观测。",{"type":25,"children":469},[470],{"text":471,"type":29},"**调度触发时间**",{"type":25,"children":473},[474],{"text":475,"type":29},"查看计划触发时间与任务实际执行时间，并记录使用的时区。固定偏移可能来自本地时间与 UTC 转换不一致，不应先归因为地区网络。",{"type":25,"children":477},[478],{"text":479,"type":29},"**设备接收时间**",{"type":25,"children":481},[482],{"text":483,"type":29},"推送服务受理或投递状态不等于设备已经收到。优先记录设备侧通知日志；无法观察设备接收时，标为未知。通知类型、优先级、平台规则和系统状态都可能影响结果，应结合通知 ID 和统一时钟分析。",{"type":25,"children":485},[486],{"text":487,"type":29},"**屏幕展示时间**",{"type":25,"children":489},[490],{"text":491,"type":29},"检查通知实际出现的时间、顺序和分组。系统策略可能造成延迟或摘要展示；先记录现象，再按产品预期、平台规则和同类设备结果判断是否异常。字段缺失、落地错误、延迟、丢失或重复都应有记录。",{"type":25,"children":493},[494],{"text":495,"type":29},"分别比较计划触发、实际执行、服务端状态、设备接收和展示。差异能帮助定位环节，但单一时间差不能直接证明根因。",{"type":35,"level":21,"children":497},[498],{"text":499,"type":29},"测试跨日与夏令时边界",{"type":25,"children":501},[502],{"text":503,"type":29},"覆盖 UTC 跨日、跨月与跨年边界。夏令时测试使用 IANA 时区而非固定偏移量，例如 `Europe\u002FBerlin` 的春季跳时与秋季重复时段。测试前先明确不存在或重复的本地时间应跳过、顺延还是执行多次，并记录计划与实际执行时间。",{"type":25,"children":505},[506],{"text":507,"type":29},"尽量在同一批次执行对照，并记录每条用例的计划与实际触发时间。",{"type":35,"level":21,"children":509},[510],{"text":511,"type":29},"分开测试设备时区与网络出口",{"type":25,"children":513},[514],{"text":515,"type":29},"测试时先固定出口，只改设备时区，观察展示时间和日期文案；再固定时区，只改变出口，检查地区化页面或接口响应。不要把出口变化直接当作推送投递差异的原因。",{"type":35,"level":21,"children":517},[518],{"text":519,"type":29},"检查点击后的落地页面",{"type":25,"children":521},[522],{"text":523,"type":29},"点击行为应与推送投递分开验证。记录冷启动、已登录和链接过期等场景下的落地页面、耗时与回退结果，并注明当时的设备时区和实际网络路径。",{"type":25,"children":525},[526],{"text":527,"type":29},"冷启动时记录首屏耗时和目标页面是否保留；已登录时检查页面状态；链接过期时检查提示与回退页面。",{"type":25,"children":529},[530],{"text":531,"type":29},"实际测试可用一行记录计划时刻与 IANA 时区、对应 UTC、调度和设备侧证据、点击结果。春季跳时和秋季重复时段分别建用例；设备接收无法观测时写“未知”，未实际执行时不要填写通过或失败。",{"type":25,"children":533},[534],{"text":535,"type":29},"推送服务到设备的链路与 App 请求可能不同，应根据实际配置分别观察。代理出口可用于测试配置走该出口的地区化请求；目标地区测试机或云主机也可提供对照。",[537],{"source":6,"id":7,"documentId":8,"translationKey":8,"locale":9,"slug":10,"path":11,"_path":11,"title":12,"description":13,"excerpt":13,"image":14,"publishedAt":15,"updatedAt":16,"author":17,"tags":538,"featured":19,"sortOrder":20,"readingTime":21,"bodyType":22,"bodyBlocks":539,"bodyHtml":151},[],[540,543,546,549,552,555,558,561,564,567,570,573,576,579,582,585,588,591,594,597,600,603,606,609,612,615,618,621,624,627,630],{"type":25,"children":541},[542],{"text":28,"type":29},{"type":25,"children":544},[545],{"text":33,"type":29},{"type":35,"level":21,"children":547},[548],{"text":38,"type":29},{"type":25,"children":550},[551],{"text":42,"type":29},{"type":25,"children":553},[554],{"text":46,"type":29},{"type":35,"level":21,"children":556},[557],{"text":50,"type":29},{"type":25,"children":559},[560],{"text":54,"type":29},{"type":25,"children":562},[563],{"text":58,"type":29},{"type":25,"children":565},[566],{"text":62,"type":29},{"type":25,"children":568},[569],{"text":66,"type":29},{"type":35,"level":21,"children":571},[572],{"text":70,"type":29},{"type":25,"children":574},[575],{"text":74,"type":29},{"type":25,"children":577},[578],{"text":78,"type":29},{"type":25,"children":580},[581],{"text":82,"type":29},{"type":25,"children":583},[584],{"text":86,"type":29},{"type":25,"children":586},[587],{"text":90,"type":29},{"type":25,"children":589},[590],{"text":94,"type":29},{"type":25,"children":592},[593],{"text":98,"type":29},{"type":35,"level":21,"children":595},[596],{"text":102,"type":29},{"type":25,"children":598},[599],{"text":106,"type":29},{"type":25,"children":601},[602],{"text":110,"type":29},{"type":25,"children":604},[605],{"text":114,"type":29},{"type":35,"level":21,"children":607},[608],{"text":118,"type":29},{"type":25,"children":610},[611],{"text":122,"type":29},{"type":25,"children":613},[614],{"text":126,"type":29},{"type":25,"children":616},[617],{"text":130,"type":29},{"type":25,"children":619},[620],{"text":134,"type":29},{"type":25,"children":622},[623],{"text":138,"type":29},{"type":25,"children":625},[626],{"text":142,"type":29},{"type":25,"children":628},[629],{"text":146,"type":29},{"type":25,"children":631},[632],{"text":150,"type":29},null,[],[]]