> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 提示推送权限

> 通过策略性时机、应用内软提示以及 iOS 临时通知，提高 iOS、Android 和华为设备上的推送通知选择加入率。

推送权限提示是操作系统弹出的对话框，用于询问用户是否允许您的应用发送推送通知。用户的回答决定了您能否向他们发送以横幅形式展示、显示在锁屏上并播放声音的通知。

<Frame caption="显示系统权限提示的 iOS 和 Android 设备。">
  <img src="https://mintcdn.com/onesignal/jBdBk5XvQR5eKOks/images/docs/7ace2bd5abf90a044c363ec9acb227467b62a7f49fdf0dd2922280dc188f4973-a90c2cc443f5fe9e7c80368c680a16cf1ca6203f7b28a0a6eec212add8510f80-Untitled_design_11.png?fit=max&auto=format&n=jBdBk5XvQR5eKOks&q=85&s=381c6c0ecf9c24cda0e9153fc582e319" alt="并排显示的 iOS 与 Android 系统权限提示" width="1920" height="1080" data-path="images/docs/7ace2bd5abf90a044c363ec9acb227467b62a7f49fdf0dd2922280dc188f4973-a90c2cc443f5fe9e7c80368c680a16cf1ca6203f7b28a0a6eec212add8510f80-Untitled_design_11.png" />
</Frame>

请把提示当作一项策略来对待。系统提示只能显示有限次数：**iOS 上仅一次**，**Android 上（Google 与华为）两次**。如果用户拒绝了每一次请求，就必须在系统设置中手动重新启用通知。一次时机不佳的提示可能会永久让您失去一位订阅者，而可触达受众规模是决定每一次推送营销活动 ROI 的最大杠杆。

[Apple](https://developer.apple.com/design/human-interface-guidelines/managing-notifications) 与 [Google](https://developer.android.com/training/permissions/requesting) 都建议在请求权限之前先向用户说明通知的价值。缺少上下文时，用户更容易拒绝；而在 iOS 上，被拒绝后的提示无法再次显示。

本指南针对移动应用推送。有关网页推送，请参阅[网页推送权限提示](./permission-requests)。

## 提高选择加入率的策略

推送选择加入率更多取决于*何时*以及*如何*询问，而不是系统提示本身说了什么。把提示作为策略来运营的应用，其表现始终优于在首次启动时就直接弹出提示的应用。下面的原则是各个构建单元，随后的[示例策略](#example-onboarding-opt-in-strategy)展示了如何把它们组合成一份具体的方案。

### 核心原则

* **在价值时刻之后再询问。** 等到用户刚刚经历了一件值得收到通知的事情：完成入门引导、收藏内容、关注话题、下单，或结束首次会话。在用户还没弄清楚应用能做什么的首次启动时提示，是低选择加入率最主要的原因。
* **在 iOS 上从临时通知开始。** [临时通知](#use-ios-provisional-notifications)会静默送达通知中心而无需任何提示，让用户基于真实的内容决定是否保留，而不是依据一个假设性的说明。这在 iOS 上通常是转化率最高的路径，应作为默认起点。
* **用应用内软提示说明价值。** 软提示是一条 OneSignal 应用内消息，告知用户您会发送什么类型的通知以及它们为何重要。关闭软提示不会消耗系统提示的次数，因此您可以稍后再向尚未准备好的用户重新询问。
* **重新询问关闭了软提示的用户，而不是系统提示。** 将软提示配置为按一定节奏（例如每 `2 weeks`）重新出现。尚未准备好的用户会获得再次决定的机会，同时不会耗尽系统提示的次数。
* **持续迭代文案与时机。** 上线软提示后，观察消息报表中的转化率，然后调整触发器、文案与频率。对时机与文案的小幅调整常常能把选择加入率提升几十个百分点。

### 示例：新用户引导选择加入策略

本示例把用于在 iOS 上快速获得触达的临时通知，与在价值时刻出现、用于完整选择加入的软提示结合起来。请将其作为起点，并根据自己的应用调整通知类型与价值时刻。对于 Android 与华为应用，请跳过阶段 1，直接从阶段 2 开始。

**阶段 1：iOS 静默触达**

1. 在 OneSignal 仪表板中前往 **Settings > Apple iOS > Advanced Configuration > Enable iOS 12 direct to history**，开启临时授权。
2. 在用户使用应用的第一周内发送 2 到 3 条高质量通知。请选择能够证明订阅价值的内容：个性化推荐、突发新闻提醒或每周摘要。用户会在通知中心静默收到它们，无需任何提示。

**阶段 2：在价值时刻实现转化**

1. 在 **Messages > In-App** 中创建一条软提示，引用用户已经体验到的价值。示例标题："在锁屏上获取突发新闻提醒。"
2. 将受众设置为 **Show to all users**。**Push Permission Prompt** 点击操作会自动过滤为仅面向未订阅用户。
3. 在高信号事件上触发消息：打开或与一条临时通知交互、关注某个话题、将商品加入购物车，或 5 分钟的会话时长。
4. 在 CTA 按钮上添加 **Push Permission Prompt** 点击操作。
5. 将计划设置为 **Multiple times**，每用户最多 `20` 次，两次显示之间间隔 `2 weeks`（大约 10 个月的重复提示周期）。

**阶段 3：衡量与迭代**

1. 在 1 到 2 周之后，查看消息报表中"提示到选择加入"的转化率。
2. 使用 [SDK 监听器](#track-push-permissions-and-prompt-results)对完整漏斗进行埋点：软提示点击、关闭以及系统提示的最终结果。将这些事件转发到您的分析工具。
3. 依据数据每次只调整一个变量（触发事件、标题、CTA 文案，或两次展示之间的间隔）。

<Tip>
  在用户刚刚打开或与一条临时通知交互后立即触发软提示。他们已经从您的通知中体验到了价值，这会显著提升系统提示上"Allow"的比率。
</Tip>

***

## 选择合适的方式

您有三种方式可以借助 OneSignal 增长推送订阅者规模。大多数 iOS 应用应把临时通知与应用内软提示结合使用；大多数 Android 应用应从软提示入手。

| 方式                                             | 平台             | 工作原理                                                                                                                                                                     | 使用场景                                          |
| ---------------------------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------- |
| **应用内软提示（推荐）**                                 | iOS、Android、华为 | 配置一条带有 **Push Permission Prompt** 点击操作的 OneSignal 应用内消息。点击按钮会弹出系统提示，而关闭应用内消息不会消耗任何次数，因此稍后可以再次询问。                                                                         | 默认选择。无需发布新版本即可设计、排期、定向以及重新展示提示。               |
| **编程式提示**                                      | iOS、Android、华为 | 在应用代码中调用 [`requestPermission()`](./mobile-sdk-reference#requestpermission-fallbacktosettings-push) 或 [`optIn()`](./mobile-sdk-reference#optout-optin-optedin)，系统提示会立即出现。 | 由应用自身控制触发时机的自定义流程：偏好中心、个人资料页，或触发提示时机合适的应用内事件。 |
| **[临时通知](#use-ios-provisional-notifications)** | iOS            | 在 OneSignal 仪表板中开启。用户会在通知中心静默收到通知，无需任何提示，并可通过点击 **Keep** 转化为完整订阅者。                                                                                                       | iOS 用户引导以及低摩擦触达。与软提示搭配可将静默订阅者转化为完整推送订阅者。      |

三种方式可以组合使用。iOS 上一种常见的高效组合是：开启临时通知以立即获得静默触达，在价值时刻展示软提示，同时在偏好中心暴露一个编程式提示供想要主动订阅的用户使用。

<Frame caption="应用内软提示，随后是系统权限提示。">
  <img src="https://mintcdn.com/onesignal/RWtLFPeffHrC81wI/images/docs/a6d382ca2711ba0e9f013bebe5c420d129fbfbc5ef0b2fbd9cb4bef78c7e9480-mobile-push-optimize-reach.webp?fit=max&auto=format&n=RWtLFPeffHrC81wI&q=85&s=bfbc66b313bd85f944476e8363f1d093" alt="应用内消息引导用户看到系统推送权限提示" width="1600" height="1058" data-path="images/docs/a6d382ca2711ba0e9f013bebe5c420d129fbfbc5ef0b2fbd9cb4bef78c7e9480-mobile-push-optimize-reach.webp" />
</Frame>

***

## 前提条件

* 一个 [OneSignal 账户](https://dashboard.onesignal.com)。
* 一个已[安装 OneSignal SDK](./mobile-sdk-setup) 并启用了 `OneSignalInAppMessages` 包的移动应用。

***

## 设置应用内推送权限提示

<Steps>
  <Step title="移除任何自动权限提示">
    在开始之前，请确保您的应用没有在自动触发系统权限提示：

    * 移除应用启动时调用的 `requestPermission()` 或 `optIn()`。
    * 移除对 `requestAuthorizationWithOptions` 的原生 iOS 调用，以及任何直接生成推送令牌的代码。
    * 移除对 `requestPermissions` 的 Android 调用，以及任何直接生成推送令牌的代码。
  </Step>

  <Step title="创建或编辑应用内消息">
    前往 **Messages > In-App**，然后执行以下任一操作：

    * 编辑默认的 **Push Permission Prompt** 模板，或
    * 点击 **New Message** 创建您自己的消息。

    <Frame caption="编辑默认的 Push Permission Prompt 模板或创建您自己的模板。">
      <img src="https://mintcdn.com/onesignal/l4Z9oMlZl9nJOS_T/images/push/prompt-for-push-set-up-an-in-app-push-permission-prompt.jpg?fit=max&auto=format&n=l4Z9oMlZl9nJOS_T&q=85&s=80dd758e2587507b2052b2e20df0409e" alt="OneSignal 应用内消息列表，展示 Push Permission Prompt 模板" width="2616" height="1356" data-path="images/push/prompt-for-push-set-up-an-in-app-push-permission-prompt.jpg" />
    </Frame>

    将受众设置为 **Show to all users**。OneSignal 会根据 **Push Permission Prompt** 点击操作自动过滤这条消息，仅向未订阅推送的用户显示。

    <Frame caption="将受众设置为 Show to all users。Push Permission Prompt 点击操作会自动过滤为仅面向未订阅用户。">
      <img src="https://mintcdn.com/onesignal/l4Z9oMlZl9nJOS_T/images/push/prompt-for-push-set-up-an-in-app-push-permission-prompt-show-to-all-users.jpg?fit=max&auto=format&n=l4Z9oMlZl9nJOS_T&q=85&s=e9b2b23e4e7663ee7799fd4a92dbe473" alt="受众设置配置为向所有用户显示" width="1766" height="678" data-path="images/push/prompt-for-push-set-up-an-in-app-push-permission-prompt-show-to-all-users.jpg" />
    </Frame>
  </Step>

  <Step title="自定义消息设计">
    个性化外观、感觉和文案，使其贴合您的应用。告诉用户他们会收到什么类型的通知，以及这些通知的价值。

    有关详情，请参阅[使用拖放设计应用内消息](./design-your-in-app-message)或[使用 HTML 设计应用内消息](./design-your-in-app-message-with-html)。

    <Frame caption="用于创建推送选择加入消息的应用内消息块编辑器。">
      <img src="https://mintcdn.com/onesignal/l4Z9oMlZl9nJOS_T/images/push/push-customize-the-message-design.jpg?fit=max&auto=format&n=l4Z9oMlZl9nJOS_T&q=85&s=df030196ba721eedfd4c1ad5af0fa3cd" alt="带有推送选择加入提示的应用内消息块编辑器" width="2604" height="1770" data-path="images/push/push-customize-the-message-design.jpg" />
    </Frame>
  </Step>

  <Step title="添加 Push Permission Prompt 点击操作">
    向消息中的任意按钮或图像添加 **Push Permission Prompt** 点击操作。点击时会显示系统权限提示。

    <Frame caption="向按钮添加 Push Permission Prompt 点击操作。">
      <img src="https://mintcdn.com/onesignal/l4Z9oMlZl9nJOS_T/images/push/push-add-the-push-permission-prompt-click-action.jpg?fit=max&auto=format&n=l4Z9oMlZl9nJOS_T&q=85&s=8ed4971452754851f4ff064121bcb900" alt="点击操作下拉菜单，已选中 Push Permission Prompt" width="2604" height="1770" data-path="images/push/push-add-the-push-permission-prompt-click-action.jpg" />
    </Frame>

    <Frame caption="由点击操作在 iOS 上触发的系统权限提示。">
      <img src="https://mintcdn.com/onesignal/Z6xkXGfmy814If53/images/docs/e18f7f87a5efaaa5284cf19be8de863c3833379d37b095aef9d015835a694485-prompt-2.webp?fit=max&auto=format&n=Z6xkXGfmy814If53&q=85&s=a484b1c75320beefb83bde20c443f789" alt="iOS 原生推送通知权限提示" width="1560" height="804" data-path="images/docs/e18f7f87a5efaaa5284cf19be8de863c3833379d37b095aef9d015835a694485-prompt-2.webp" />
    </Frame>

    如果用户已经达到系统权限提示的最大拒绝次数（iOS 上一次，Android 上两次），点击操作会改为将他们引导到您应用的通知设置。这等同于在 SDK 中调用 `requestPermission(fallbackToSettings: true)`。

    <Info>
      带有 **Push Permission Prompt** 点击操作的应用内消息不会向已经允许通知的用户显示。
    </Info>
  </Step>

  <Step title="选择触发器">
    受众控制*谁*有资格看到消息，触发器控制它*何时*出现。目标是把提示触发在**价值时刻**：用户刚刚经历了值得收到通知的事情的那一刻。

    <Frame caption="用于控制消息何时显示的触发器选项。">
      <img src="https://mintcdn.com/onesignal/jFWn5xzleD8du3j6/images/docs/52f0d8bef7cac18c1d791ec229d2bd86e995a8e01401c7559e2476fcfecddc6d-Screenshot_2024-10-29_at_2.18.33_PM.png?fit=max&auto=format&n=jFWn5xzleD8du3j6&q=85&s=1b55a4815213ddf3f77db8041e143aa2" alt="应用内消息触发器配置面板" width="1792" height="514" data-path="images/docs/52f0d8bef7cac18c1d791ec229d2bd86e995a8e01401c7559e2476fcfecddc6d-Screenshot_2024-10-29_at_2.18.33_PM.png" />
    </Frame>

    触发器选项，大致按转化率从低到高排列：

    * **应用打开时。** 简单，但通常并非最佳。仅在应用价值可以在几秒内清晰展现时使用。
    * **在设定的会话时长之后。** 一个不错的默认选项。等用户探索过应用之后再询问。
    * **在特定用户事件上。** 转化率最佳。在高信号动作后触发，例如完成入门引导、收藏内容、关注话题或完成首次购买。
    * **以编程方式**，使用[应用内消息触发器 SDK 方法](./mobile-sdk-reference#addtrigger-addtriggers)。可完全控制时机与上下文，包括在提示前综合多个信号。

    例如，等到用户在应用中至少停留 5 分钟：

    <Frame caption="触发器配置为在会话时长达到 5 分钟后显示消息。">
      <img src="https://mintcdn.com/onesignal/0qspEXXeJ8zJbkJ-/images/docs/81f8cca652667ae5920dbc8b73cca1b297d9e5f35d5ed4dc23d05640a4c838ae-Screenshot_2024-10-29_at_2.25.25_PM.png?fit=max&auto=format&n=0qspEXXeJ8zJbkJ-&q=85&s=311ed96b93b789bb652cc365b5708d7a" alt="会话时长触发器设置为 5 分钟" width="1792" height="624" data-path="images/docs/81f8cca652667ae5920dbc8b73cca1b297d9e5f35d5ed4dc23d05640a4c838ae-Screenshot_2024-10-29_at_2.25.25_PM.png" />
    </Frame>
  </Step>

  <Step title="计划与频率">
    控制消息出现的频率：

    * **Only once.** 对当次未准备好的用户来说，转化机会较低。
    * **Every time conditions are met.** 过于激进，可能会打扰用户。
    * **Multiple times（推荐）。** 设置每用户最大次数以及两次显示之间的间隔。例如，`20` 次显示配合 `2 weeks` 的间隔，可以以较高的频率对未订阅用户重复提示约 10 个月。对于低粘性或工具类应用，如果两周的节奏显得过于紧迫，可以放宽间隔（例如 `30 days` 或 `60 days`）。

    <Frame caption="应用内消息的计划与频率设置。">
      <img src="https://mintcdn.com/onesignal/Xl2NHJvxakrK4JbL/images/docs/eb61a38c8908fbeba60833eecc357d720e747c37abacffdfe246dbd7758bbaf4-Screenshot_2024-10-29_at_2.28.20_PM.png?fit=max&auto=format&n=Xl2NHJvxakrK4JbL&q=85&s=7a49b641bdeb959dde6edad5ef7de9dc" alt="计划配置，显示最大展示次数与展示间隔" width="1792" height="910" data-path="images/docs/eb61a38c8908fbeba60833eecc357d720e747c37abacffdfe246dbd7758bbaf4-Screenshot_2024-10-29_at_2.28.20_PM.png" />
    </Frame>
  </Step>
</Steps>

***

## 以编程方式显示权限提示

您可以使用 [`requestPermission()`](./mobile-sdk-reference#requestpermission-fallbacktosettings-push) 或 [`optIn()`](./mobile-sdk-reference#optout-optin-optedin) SDK 方法手动触发系统权限提示。这在以下自定义流程中非常有用：

* [偏好中心](./preference-center)。
* 用户资料屏幕。
* 特定的应用内事件。

向 `requestPermission()` 传入 `fallbackToSettings: true`，这样已经拒绝过的用户会被重定向到应用的通知设置，而不是静默地什么都不做。

<Note>
  如果一个订阅已经在 SDK 层面通过 `optOut()` 退订（在订阅记录中显示为 `notification_types: -2`），仅调用 `requestPermission()` 不会改变订阅状态。请改用 `optIn()`，它会请求权限**并**清除退订状态。
</Note>

***

## 使用 iOS 临时通知

临时推送通知在 iOS 12 中引入。它们允许您在不显示权限提示的情况下将通知送达通知中心。用户会看到您应用发出的真实内容，并基于这一体验决定是保留、静音，还是关闭通知。

**为什么它作为策略有效：**

* 没有会失败的系统提示。您可以在用户的第一次会话就开始触达他们，无需任何前置的选择加入决定。
* 用户基于真实价值而非假设性说明做决定。
* 之后您仍可以展示软提示，把临时用户转化为拥有横幅、声音以及锁屏提醒的完整推送订阅者。

**取舍。** 临时通知的可见度较低。它们仅静默送达通知中心：没有横幅、没有声音、也没有锁屏提醒，直到用户升级为完整权限。

<Frame caption="临时通知提示用户保留或关闭通知。">
  <img src="https://mintcdn.com/onesignal/l4Z9oMlZl9nJOS_T/images/push/ios-provisional-push-notifications.jpg?fit=max&auto=format&n=l4Z9oMlZl9nJOS_T&q=85&s=7c07a624b367b7c4cbf0572a7464311c" alt="带有 Keep 与 Turn Off 选项的 iOS 临时推送通知" width="1062" height="585" data-path="images/push/ios-provisional-push-notifications.jpg" />
</Frame>

要开启临时授权，请在 OneSignal 仪表板中前往 **Settings > Apple iOS > Advanced Configuration**，勾选 **Enable iOS 12 direct to history**。有关完整流程，包括用户如何与临时通知交互，以及它们如何与标准提示组合使用，请参阅 [iOS 临时推送通知](./ios-provisional-push-notifications)。

<Tip>
  如需将临时通知与在价值时刻出现的软提示结合的具体方案，请参阅[示例：新用户引导选择加入策略](#example-onboarding-opt-in-strategy)。
</Tip>

***

## 跟踪推送权限和提示结果

* 使用[应用内消息点击监听器](./mobile-sdk-reference#addclicklistener-in-app)跟踪用户在软提示中点击了哪个按钮。
* 使用[应用内消息生命周期监听器](./mobile-sdk-reference#addlifecyclelistener)跟踪展示次数与关闭（即用户看到但未点击软提示的情况）。
* 使用[推送权限观察者](./mobile-sdk-reference#addpermissionobserver-push)跟踪系统权限提示本身的结果。

<Info>
  您可以将这些 SDK 事件转发到您选择的后端或分析工具。
</Info>

***

## 常见问题

### 如果用户拒绝系统权限提示会发生什么？

在 iOS 上，拒绝系统权限提示会永久禁用您应用的推送通知，且提示无法再次显示。在 Android 上，用户还有一次机会（合计两次）。所有机会用完之后，用户必须在其设备的**设置 > 通知**中手动重新启用通知。**Push Permission Prompt** 点击操作以及 [`requestPermission(fallbackToSettings: true)`](./mobile-sdk-reference#requestpermission-fallbacktosettings-push) 都会通过将用户直接引导到通知设置来处理这种情况。

### 我可以自定义原生系统权限提示吗？

不可以。iOS 和 Android 上的系统权限提示由操作系统控制，无法自定义。您只能自定义软提示（在其之前显示的应用内消息）。使用软提示来说明通知的价值、设定预期，并提升在系统提示上获得"Allow"的可能性。

### 我还能向使用临时通知的用户显示提示吗？

可以，而且您应当这样做。临时通知用户是软提示的最佳候选对象，因为他们已经真实地看到过您应用的通知。推荐的模式请参阅[使用 iOS 临时通知](#use-ios-provisional-notifications)。将软提示的时机安排在用户刚打开或与临时通知交互之后。

### 如何重新提示之前拒绝了推送的用户？

一旦系统权限提示已用尽（iOS 上一次，Android 上两次），您就无法再次显示它。请改用 [`requestPermission(fallbackToSettings: true)`](./mobile-sdk-reference#requestpermission-fallbacktosettings-push) SDK 方法，或在应用内消息上使用 **Push Permission Prompt** 点击操作。两者都会打开您应用的通知设置，让用户可以手动启用通知。请搭配一条说明通知价值的应用内消息一起使用。

### 所有 Android 版本都需要系统权限提示吗？

不需要。仅 Android 13（API 级别 33）及以上版本需要。Android 13 引入了运行时通知权限，要求用户对推送通知给出明确同意。

* **发布时间：** 2022 年 8 月（Pixel 设备）。
* **目标 SDK 要求：** 自 2023 年 8 月 31 日起，Google Play 上的所有新应用和更新必须以 API 级别 33 或更高版本为目标。
* **来源：** [Google 的通知权限开发者指南](https://developer.android.com/develop/ui/views/notifications/notification-permission)。

在 Android 12 及更低版本上，应用在安装时会自动被授予通知权限。

***

<Columns cols={2}>
  <Card title="iOS 临时推送通知" icon="apple" href="./ios-provisional-push-notifications">
    在 iOS 12+ 上无需事先弹出权限提示即可将通知发送到通知中心。
  </Card>

  <Card title="移动 SDK 参考" icon="code" href="./mobile-sdk-reference#requestpermission-fallbacktosettings-push">
    `requestPermission`、`optIn`、权限观察者以及应用内消息点击监听器 API。
  </Card>

  <Card title="网页推送权限提示" icon="globe" href="./permission-requests">
    配置软提示、下拉式提示以及原生网页推送权限请求。
  </Card>

  <Card title="应用内消息设置" icon="message" href="./in-app-messages-setup">
    在应用中启用应用内消息，以便运行软提示。
  </Card>
</Columns>
