Skip to content

bug: 彩云“有降水”被识别为 CLEAR,轻雨缩放导致 forecastNextHour 隐藏 #82

Description

@s3qazx

环境

问题描述

在确实正在降雨、且彩云分钟级接口未来 60 分钟全部返回非零降水的情况下,Apple 天气仍不显示 forecastNextHour(未来一小时降水强度)卡片。

进一步检查发现,问题并非彩云没有分钟数据,而是 ForecastNextHour 的降水类型识别和轻雨强度缩放会把有效微雨转换为 Apple 天气不可见的数据。

可复现数据

测试位置:山西省大同市原南郊区附近(约 40.00347, 113.14041

测试时间:2026-08-02 00:08(UTC+8)

彩云返回的关键数据:

{
  "realtime": {
    "temperature": 23.65,
    "skycon": "LIGHT_RAIN"
  },
  "minutely": {
    "status": "ok",
    "description": "未来2小时有降水",
    "probability": [30, 30, 30, 30],
    "count": 120,
    "nonzero_first_60": 60,
    "max_first_60": 0.3869
  }
}

Apple 天气页面同时显示“23°、微雨”,但没有未来一小时降水卡片。

原因一:通用“降水”描述被识别成 CLEAR

当前 ForecastNextHour.PrecipitationType() 只匹配 rain / 雨 / snow / 雪 / 冰雹 等关键词:

https://github.com/NSRingo/WeatherKit/blob/main/src/class/ForecastNextHour.mjs

彩云本次描述为:

未来2小时有降水

其中不包含“雨”或“雪”,因此当前实现会回退为:

CLEAR

随后非零分钟数据的 summaryCondition 也会成为 CLEAR;部分路径还可能产生 POSSIBLE_CLEAR。这会让有效降水被编码成晴朗/未知条件,最终被 Apple 天气隐藏。

原因二:有效轻雨被缩放到 Apple 的不可见区间

当前 mmph 轻雨换算近似为:

perceived = (intensity - 0.08) / (3.44 - 0.08)

并截断到三位小数。当前最大雨强 0.3869 mm/h 被转换为:

(0.3869 - 0.08) / 3.36 = 0.091...
=> 0.091

源码注释说明 Apple Weather 在 perceivedPrecipitationIntensity < 0.1 时显示为无降水,但当前实现仍会把 0.08~约 0.419 mm/h 的有效轻雨压到该不可见区间。

由于判断使用严格的 > 0.1 且结果截断三位小数,实际约需达到:

0.08 + 0.101 × 3.36 = 0.41936 mm/h

才进入可见轻雨分支。

复现步骤

  1. 安装当前 Shadowrocket Rewrite 模块。
  2. 使用 ColorfulClouds 作为 NextHour.Provider
  3. 打开未来一小时存在持续微雨、且彩云描述为“未来2小时有降水”的城市。
  4. 当前天气和小时预报显示降雨。
  5. forecastNextHour 卡片不显示。

期望行为

  • 当分钟数组包含非零降水时,无法从描述确定雨/雪类型不应默认回退为 CLEAR
  • 可以根据更可靠的类型字段、当前天气条件,或显式 fallback 推导降水类型。
  • 有效轻雨应至少映射到 Apple 可显示的 0.1 档位。
  • 可见轻雨分支建议使用 >= 0.1,并避免截断使边界值再次跌出显示范围。

一种可参考的缩放方式:

perceivedPrecipitationIntensity =
    0.1 + Math.min(0.9, lightProgress * 0.9);

实际行为

彩云分钟数据有效且未来 60 分钟持续非零,但经过类型识别与强度转换后被表示为 CLEAR / 低于 0.1,Apple 天气不显示 forecastNextHour 卡片。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions