docs:CHANGELOG 补 2026-06-18 推送通知(Web Push + 桌面原生)

- 网页 / PWA Web Push(VAPID)+ 桌面原生通知一条;HTML 与 md twin 同步,build.sh 重建
  CHANGELOG.html
This commit is contained in:
2026-06-18 17:01:41 +08:00
parent b414c57b6a
commit c306daff92
2 changed files with 57 additions and 3 deletions
+35 -3
View File
@@ -1,4 +1,4 @@
<!-- built with theme=dracula, mode=report, at=2026-06-15T17:11:18Z -->
<!-- built with theme=dracula, mode=report, at=2026-06-18T08:58:10Z -->
<!DOCTYPE html>
<html lang="zh-Hans">
<head>
@@ -706,6 +706,14 @@ hr.line
}
hr.line::before { content: none; }
.lede
{
/* 首字下沉為 float,本段行數不足以填滿下沉字高度時,浮標會探出段底,
令次段首數行繞排、向右擠貼下沉字。將本段下沿托至下沉字下沿(高度=
4.2em × line-height 0.85 頂距 8px,與下方 ::first-letter 同步),
使次段恆起於下沉字之下。本段自然行高足夠時 min-height 不生效,無副作用。 */
min-height: calc(4.2em * 0.85 + 8px);
}
.lede::first-letter
{
font-family: var(--font-serif);
@@ -2537,6 +2545,18 @@ main > *:nth-child(n+6) { animation-delay: 0.46s; }
<p class="lede">本 Changelog 自 2026-05-22 起以 HTML 格式维护。此前之变更可从 main 分支 <code>git log</code> 取得;下表为近期较显著之 commit。</p>
<h2>2026-06-18 — 推送通知:网页 / PWA Web Push + 桌面原生通知</h2>
<p>页面 / PWA 关闭、或桌面窗口非前台时也能收到系统通知;判定统一为「页面打开走应用内提示,关闭则系统通知」,三端各自落地。</p>
<ul>
<li><strong>网页 / PWAWeb Push, VAPID</strong>:服务端在事件未经 SSE 投递到设备时(即该设备页面已关)发 Web Push —— 收到文件、消息、传输完成 / 失败均可。新增 <code>push_subscriptions</code> 表(含 <code>locale</code>,主键为 endpoint 的 SHA-256 以幂等 upsert+ <code>/api/push/{vapid-key, subscribe}</code> 端点 + <code>internal/push</code> 发送器(404 / 410 自动清理死订阅)。文案按订阅设备语言在服务端渲染(中简 / 中繁 / 英)。覆盖浏览器 / Android / iOS 16.4+ 已安装 PWA</li>
<li><strong>桌面客户端原生通知</strong>:仅窗口非前台时弹原生系统通知(前台仍走应用内提示),复用 WebView 事件分发 + 客户端本地化。macOS 走 <code>UNUserNotificationCenter</code>(未签名时安全空操作,待签名 / 公证后显示)、Windows 走原生 toast</li>
<li><strong>判定复用既有信号</strong>:网页端「页面是否打开」直接取 <code>Hub.SendTo</code> 的投递结果,零额外状态;离线消息改返 202,文本随推送送达</li>
<li><strong>开关与配置</strong>:设置页新增「推送通知」面板(仅浏览器 / PWA),登录后自动把既有订阅重新登记到当前用户;prod 可选设 <code>CDROP_VAPID_PUBLIC_KEY</code> + <code>CDROP_VAPID_PRIVATE_KEY</code><code>just vapid-keygen</code> 生成一对,二者须同时设置,都留空则推送惰性关闭)</li>
<li>commit <code>92a03ae</code></li>
</ul>
<h2>2026-06-16 — 浏览器免重登 + 设备名持久化</h2>
<p>浏览器端不再每次重启都要重新登录;长寿命 refresh_token 从此完全不进 JS,改由服务端 HttpOnly cookie 会话持有。对长寿命凭据而言比原先(refresh_token 在 JS 内存、开页期 XSS 可读)严格更安全。</p>
@@ -2652,6 +2672,16 @@ main > *:nth-child(n+6) { animation-delay: 0.46s; }
时间倒序。细粒度迭代见 git 历史;本档只记录结构性 / 行为性变更与重要 fix。
## 2026-06-18 — 推送通知:网页 / PWA Web Push + 桌面原生通知
页面 / PWA 关闭、或桌面窗口非前台时也能收到系统通知;判定统一为「页面打开走应用内提示,关闭则系统通知」。
- 网页 / PWAWeb Push, VAPID):服务端在事件未经 SSE 投递到设备时发 Web Push(收到文件 / 消息 / 传输完成 / 失败)。新增 push_subscriptions 表(含 locale,主键为 endpoint 的 SHA-256+ /api/push/{vapid-key, subscribe} + internal/push 发送器(404 / 410 自动清理死订阅)。文案按设备语言服务端渲染(中简 / 中繁 / 英)。覆盖浏览器 / Android / iOS 16.4+ 已安装 PWA
- 桌面客户端原生通知:仅窗口非前台时弹(前台走应用内)。macOS UNUserNotificationCenter(未签名时安全空操作,待签名后显示)、Windows 原生 toast
- 判定复用 Hub.SendTo 的投递结果,零额外状态;离线消息改返 202,文本随推送送达
- 设置页新增「推送通知」面板(仅浏览器 / PWA);prod 可选设 CDROP_VAPID_PUBLIC_KEY + CDROP_VAPID_PRIVATE_KEYjust vapid-keygen 生成;都留空则惰性关闭)
- commit 92a03ae
## 2026-06-16 — 浏览器免重登 + 设备名持久化
浏览器端不再每次重启都要重新登录;长寿命 refresh_token 完全不进 JS,改由服务端 HttpOnly cookie 会话持有(比原先 refresh_token 在 JS 内存严格更安全)。
@@ -5019,7 +5049,9 @@ window.__JUZHEN_PUNCT__="quanjiao";window.__JUZHEN_JUSTIFY_ATOMS__=true;window._
.lede.marginalia.references.appendix……)不命中、維持全功能。最近祖先勝,
故標題與 chrome 容器一旦命中,其後代(如 .slide-title 內的 .section-name
.slide-dot、.title-page 內的作者欄)一併降級。選擇器涵蓋三模式;某模式不存在之
class 自然不命中。 */
class 自然不命中。**切記只列「非段落 chrome 本身」,切勿納入包裹正文的容器**
(如 .deck-stage.deck.cols-2)——否則「最近祖先勝」會把整個子樹正文一併降級、
喪失禁則/垂懸/長詞(曾誤納 .deck-stage 致 slides 全 deck 正文無禁則、標點落行首)。 */
level: {
text: [
"h1, h2, h3, h4, h5, h6", // 全部標題(含 deck-section-slide-tp-toc-title
@@ -5027,7 +5059,7 @@ window.__JUZHEN_PUNCT__="quanjiao";window.__JUZHEN_JUSTIFY_ATOMS__=true;window._
".subtitle, .section-subtitle, .deck-subtitle", // 副標題
".meta, .timestamp, .actions, .page", // report chrome
".cover-block, .slide-foot, .toc-list", // slides 封面/頁尾/目錄條目
".deck-nav, .deck-counter, .deck-author, .deck-institute, .deck-date, .deck-actions, .deck-stage",
".deck-nav, .deck-counter, .deck-author, .deck-institute, .deck-date, .deck-actions",
".title-page, .toc-page, .simple-title", // academic 前置 chrome(含 tp-st- 欄位)
].join(", "),
},
+22
View File
@@ -25,6 +25,18 @@
<p class="lede">本 Changelog 自 2026-05-22 起以 HTML 格式维护。此前之变更可从 main 分支 <code>git log</code> 取得;下表为近期较显著之 commit。</p>
<h2>2026-06-18 — 推送通知:网页 / PWA Web Push + 桌面原生通知</h2>
<p>页面 / PWA 关闭、或桌面窗口非前台时也能收到系统通知;判定统一为「页面打开走应用内提示,关闭则系统通知」,三端各自落地。</p>
<ul>
<li><strong>网页 / PWAWeb Push, VAPID</strong>:服务端在事件未经 SSE 投递到设备时(即该设备页面已关)发 Web Push —— 收到文件、消息、传输完成 / 失败均可。新增 <code>push_subscriptions</code> 表(含 <code>locale</code>,主键为 endpoint 的 SHA-256 以幂等 upsert+ <code>/api/push/{vapid-key, subscribe}</code> 端点 + <code>internal/push</code> 发送器(404 / 410 自动清理死订阅)。文案按订阅设备语言在服务端渲染(中简 / 中繁 / 英)。覆盖浏览器 / Android / iOS 16.4+ 已安装 PWA</li>
<li><strong>桌面客户端原生通知</strong>:仅窗口非前台时弹原生系统通知(前台仍走应用内提示),复用 WebView 事件分发 + 客户端本地化。macOS 走 <code>UNUserNotificationCenter</code>(未签名时安全空操作,待签名 / 公证后显示)、Windows 走原生 toast</li>
<li><strong>判定复用既有信号</strong>:网页端「页面是否打开」直接取 <code>Hub.SendTo</code> 的投递结果,零额外状态;离线消息改返 202,文本随推送送达</li>
<li><strong>开关与配置</strong>:设置页新增「推送通知」面板(仅浏览器 / PWA),登录后自动把既有订阅重新登记到当前用户;prod 可选设 <code>CDROP_VAPID_PUBLIC_KEY</code> + <code>CDROP_VAPID_PRIVATE_KEY</code><code>just vapid-keygen</code> 生成一对,二者须同时设置,都留空则推送惰性关闭)</li>
<li>commit <code>92a03ae</code></li>
</ul>
<h2>2026-06-16 — 浏览器免重登 + 设备名持久化</h2>
<p>浏览器端不再每次重启都要重新登录;长寿命 refresh_token 从此完全不进 JS,改由服务端 HttpOnly cookie 会话持有。对长寿命凭据而言比原先(refresh_token 在 JS 内存、开页期 XSS 可读)严格更安全。</p>
@@ -124,6 +136,16 @@
时间倒序细粒度迭代见 git 历史本档只记录结构性 / 行为性变更与重要 fix
## 2026-06-18 推送通知网页 / PWA Web Push + 桌面原生通知
页面 / PWA 关闭或桌面窗口非前台时也能收到系统通知判定统一为页面打开走应用内提示关闭则系统通知
- 网页 / PWAWeb Push, VAPID服务端在事件未经 SSE 投递到设备时发 Web Push收到文件 / 消息 / 传输完成 / 失败新增 push_subscriptions locale主键为 endpoint SHA-256+ /api/push/{vapid-key, subscribe} + internal/push 404 / 410 / / / Android / iOS 16.4+ PWA
- 桌面客户端原生通知仅窗口非前台时弹前台走应用内macOS UNUserNotificationCenter未签名时安全空操作待签名后显示Windows 原生 toast
- 判定复用 Hub.SendTo 的投递结果零额外状态离线消息改返 202文本随推送送达
- 设置页新增推送通知面板仅浏览器 / PWAprod 可选设 CDROP_VAPID_PUBLIC_KEY + CDROP_VAPID_PRIVATE_KEYjust vapid-keygen 生成都留空则惰性关闭
- commit 92a03ae
## 2026-06-16 浏览器免重登 + 设备名持久化
浏览器端不再每次重启都要重新登录长寿命 refresh_token 完全不进 JS改由服务端 HttpOnly cookie 会话持有比原先 refresh_token JS 内存严格更安全