{
  "_description": "本文件由 data/ 生成：请改动来源文件，不要改这里。各字段的证据边界见接入指南。",
  "schemaVersion": "1.0.0",
  "kind": "entry",
  "locale": "zh-CN",
  "id": "push-notification",
  "name": {
    "zh": "推送通知",
    "en": "Push Notification"
  },
  "page": "https://designvocabulary.com/zh/entries/push-notification/",
  "self": "https://designvocabulary.com/zh/entries/push-notification.json",
  "alternates": {
    "zh-CN": "https://designvocabulary.com/zh/entries/push-notification.json",
    "en": "https://designvocabulary.com/en/entries/push-notification.json"
  },
  "site": {
    "catalogSchemaVersion": "0.1.0",
    "entries": 158,
    "index": "https://designvocabulary.com/zh/entries/index.json",
    "query": "https://designvocabulary.com/api/query?lang=zh",
    "guide": "https://designvocabulary.com/zh/agents/",
    "llms": "https://designvocabulary.com/llms.txt"
  },
  "provenance": {
    "sourceBacked": [
      "entry.definition"
    ],
    "editorial": [
      "entry.boundary",
      "entry.signature",
      "entry.when",
      "entry.when_not",
      "entry.tradeoff",
      "entry.comparison",
      "entry.rules",
      "entry.relations",
      "entry.implementationNote",
      "entry.behavior"
    ],
    "scope": "定义参考以上来源；数字界面示例、选择建议、条件关系及配方由本样例编辑，尚未经用户研究验证。",
    "editorialStatus": "drafted",
    "specimenData": "fictional",
    "specimenNote": "示例为原创虚构界面；定义附来源，用法与配方为编辑建议。",
    "sources": [
      {
        "id": "pushnotification-apple-hig",
        "url": "https://developer.apple.com/design/human-interface-guidelines/notifications",
        "title": "Apple Human Interface Guidelines · Notifications",
        "checkedAt": "2026-10-20",
        "archive": {
          "status": "unconfirmed",
          "confirmed": false,
          "url": null,
          "capturedAt": null,
          "lookupUrl": "https://web.archive.org/web/20261020*/https://developer.apple.com/design/human-interface-guidelines/notifications"
        }
      },
      {
        "id": "pushnotification-android-permission",
        "url": "https://developer.android.com/develop/ui/views/notifications/notification-permission",
        "title": "Android Developers · Notification runtime permission",
        "checkedAt": "2026-10-20",
        "archive": {
          "status": "unconfirmed",
          "confirmed": false,
          "url": null,
          "capturedAt": null,
          "lookupUrl": "https://web.archive.org/web/20261020*/https://developer.android.com/develop/ui/views/notifications/notification-permission"
        }
      }
    ],
    "lists": [],
    "ordered": false,
    "listDisclaimer": "席位号是编辑位置，不是评分、排名或人气统计；清单未收满时保持原样，不补足。"
  },
  "entry": {
    "id": "push-notification",
    "type": "interaction",
    "name": {
      "zh": "推送通知",
      "en": "Push Notification"
    },
    "aliases": [
      "Push Message",
      "System Notification",
      "Remote Notification",
      "推送消息",
      "系统通知"
    ],
    "granularity": "experience",
    "intents": [
      "inform",
      "audit-consent"
    ],
    "tags": [
      "通知",
      "推送",
      "授权",
      "打扰",
      "系统级提醒"
    ],
    "definition": "应用在用户没有打开它时，经由操作系统向用户发出的一条简短消息，以横幅、锁屏条目、声音或角标等形式出现；发送前必须先取得用户的授权。",
    "boundary": "推送通知是\"送达那一刻\"的事件：它从应用外部出现，打断用户正在做的事。它不是通知中心——通知中心是已送达通知事后可回看的去处，决定的是\"还找不找得到\"，推送通知决定的是\"当时要不要打扰\"。它也不是通知红点：红点只是附着在入口上的被动标记，不呈现内容、不发出声音，等用户自己发现；推送通知主动把内容带到用户面前。应用打开时在界面内显示的提示条也不属于本词条，那是应用内消息，不经过系统、不需要通知授权。判定标准是\"经由系统、在应用之外、需要用户事先同意\"。",
    "signature": [
      "在应用未打开时由系统呈现，出现在应用之外",
      "发送前需要用户授权，用户随时可以在系统设置中关闭",
      "内容简短，点按后带用户进入应用中的相关位置"
    ],
    "when": [
      "信息有时效性，用户不及时知道会错过，如订单状态变化或有人发来消息",
      "用户主动表达过想被提醒，例如点了提醒按钮或订阅了某项更新",
      "一条通知本身就足以让用户判断是否需要处理"
    ],
    "when_not": [
      "首次启动就弹出授权请求，用户还不知道这些通知有什么用",
      "同一件事在用户未回应时反复推送",
      "用推送报告应用内的错误，或指示用户回到应用里去完成某项操作",
      "通知正文包含他人可能在锁屏上看到的敏感或私人信息"
    ],
    "tradeoff": "推送通知是应用在后台唯一能主动触达用户的渠道，及时性无可替代；代价是每一条都是一次打扰，而用户只需要一次关闭就能永久收回授权。发得越多、越无关，这条渠道就越快失效。",
    "comparison": {
      "focus": "在应用之外及时告知有时效的信息",
      "mechanism": "经用户授权后由系统以横幅、声音或角标呈现",
      "cost": "每条都是打扰，滥用会让用户撤回授权"
    },
    "sources": [
      {
        "id": "pushnotification-apple-hig",
        "title": "Apple Human Interface Guidelines · Notifications",
        "url": "https://developer.apple.com/design/human-interface-guidelines/notifications",
        "claim": "该指南开篇说明，在向用户发送任何通知之前必须先取得其同意；通知可呈现为锁屏或桌面横幅、应用图标上的角标以及通知中心里的条目。最佳实践包括：通知要简洁且有信息量；即使用户没有回应，也不要为同一件事发送多条通知，否则会塞满通知中心并可能让用户关闭该应用的全部通知；不要用通知指示用户回到应用里执行操作；显示错误应使用警告框而不是通知；不要在通知中包含敏感、私人或机密信息。本词条的定义与多条\"不适用\"情形据此转述。",
        "checkedAt": "2026-10-20",
        "archive": {
          "lookupUrl": "https://web.archive.org/web/20261020*/https://developer.apple.com/design/human-interface-guidelines/notifications",
          "status": "unconfirmed",
          "checkedAt": "2026-10-20T07:58:36.336Z",
          "error": "save-request-failed"
        }
      },
      {
        "id": "pushnotification-android-permission",
        "title": "Android Developers · Notification runtime permission",
        "url": "https://developer.android.com/develop/ui/views/notifications/notification-permission",
        "claim": "该文档说明 Android 13（API 级别 33）起引入 POST_NOTIFICATIONS 运行时权限，新安装的应用通知默认关闭，须在请求权限并获用户同意后才能发送；建议先让用户熟悉应用再请求，并在明确的情境中请求，例如用户点了提醒铃铛按钮或刚提交了一个外卖订单，使通知用途与开启理由一目了然；还说明用户可以随时撤回该权限，发送前应检查通知是否仍被允许。本词条关于授权时机的规则据此转述。",
        "checkedAt": "2026-10-20",
        "archive": {
          "lookupUrl": "https://web.archive.org/web/20261020*/https://developer.android.com/develop/ui/views/notifications/notification-permission",
          "status": "unconfirmed",
          "checkedAt": "2026-10-20T07:58:38.442Z",
          "error": "save-request-failed"
        }
      }
    ],
    "relations": [
      {
        "target": "notification-center",
        "kind": "composes_with",
        "condition": "用户错过了推送当时的横幅或声音",
        "reason": "推送决定送达那一刻要不要打扰，通知中心让已送达的通知事后仍可回看；两者一起才不会让错过等于丢失。",
        "basis": "editorial"
      },
      {
        "target": "notification-dot",
        "kind": "alternative",
        "condition": "信息只需要让用户知道\"有新东西\"，并不紧急",
        "reason": "红点被动等待用户发现、不打断当前任务；只有确实有时效的信息才值得用推送主动打扰。",
        "basis": "editorial"
      },
      {
        "target": "do-not-disturb",
        "kind": "composes_with",
        "condition": "用户在某段时间内不想被提醒",
        "reason": "勿扰模式静音推送的呈现而不丢弃通知，应用应把通知按紧急程度如实分级，而不是设法绕过它。",
        "basis": "editorial"
      },
      {
        "target": "nagging",
        "kind": "misused_as",
        "condition": "推送被用来反复催促用户回到应用，或推广与用户订阅无关的内容",
        "reason": "授权是为了接收有用的信息，借这条渠道反复催促就成了骚扰式提醒。",
        "basis": "editorial"
      },
      {
        "target": "calm-technology",
        "kind": "informs",
        "condition": "决定一条信息应该以多强的方式送达",
        "reason": "冷静技术主张信息尽量留在注意力边缘，提示团队只为真正需要立即关注的事使用推送。",
        "basis": "editorial"
      }
    ],
    "rules": [
      {
        "when": "准备请求通知授权",
        "instruction": "在用户做出与通知相关的动作时请求，并先说明会收到什么；不要在首次启动时就弹出系统授权框。",
        "strength": "recommend",
        "basis": "editorial"
      },
      {
        "when": "用户没有授权或撤回了授权",
        "instruction": "不要反复弹出请求，也不要用界面内模仿系统通知的样式绕过授权；让应用的核心功能在没有推送时仍然可用。",
        "strength": "recommend",
        "basis": "editorial"
      },
      {
        "when": "通知内容可能显示在锁屏上",
        "instruction": "不要在标题或正文中放入敏感、私人或机密信息，用笼统的描述代替具体内容。",
        "strength": "recommend",
        "basis": "editorial"
      }
    ],
    "behavior": {
      "states": [
        "not-requested",
        "permission-denied",
        "permission-granted",
        "delivered",
        "opened",
        "dismissed"
      ],
      "a11y": [
        "通知内容不只依赖声音或振动传达，文字本身完整可读",
        "点按通知后把用户带到对应内容，并让焦点落在该内容上",
        "隐藏预览时仍有能说明通知类别的笼统文字"
      ],
      "motion": "由系统决定横幅的出现方式，应用不另加动画"
    },
    "demo": null,
    "version": "0.1.0",
    "editorialStatus": "drafted",
    "requirements": [],
    "demoCapabilities": [],
    "implementationNote": "本词条尚无可操作示例；插画为编辑示意，展示锁屏上的推送横幅与授权请求的先后关系，不代表已验证的实现。各平台的授权流程与可用的通知级别不同，应用到产品前须以目标平台的当前文档为准并实测拒绝授权后的行为。",
    "image": {
      "src": "/images/push-notification.webp",
      "alt": "一张名为 FIELDNOTES 的虚构手机示意：左边一台手机显示应用内的说明卡片和一个铃铛按钮，旁边是带两个选项的系统授权对话框；右边一台锁屏的手机顶部出现一条圆角通知横幅，横幅内是应用图标和几条灰色占位文字。"
    },
    "searchTerms": [
      "notification",
      "push",
      "permission",
      "interruption",
      "system-level alert"
    ]
  }
}
