# Retention Messaging API：用户取消订阅前的挽留消息

> Apple 的 Retention Messaging API 会在订阅者点按 Cancel Subscription 时显示你的消息。本文讲格式、条件、权限和配置。

原始页面：[Retention Messaging API：用户取消订阅前的挽留消息](https://devoria.fr/zh-hans/blog/apple-retention-messaging-api-cancel-subscription)
作者：[Mehdi Azizi](https://devoria.fr/zh-hans/mehdi-azizi)
发布：2026-11-04
内容最后修订：2026-11-04


Retention Messaging API 是 Apple 提供的一项服务器到服务器服务。订阅者点按 Cancel Subscription 时，它会把你的消息显示给对方。消息出现在确认页面上，这时取消还没有生效。**消息可以提醒用户订阅的价值，推荐另一个方案或促销优惠，但取消按钮始终都在。**这个 API 从 2025 年 7 月起处于预览阶段，需要申请权限。Apple 还宣布，2026 年秋季会在 App Store Connect 中推出一个更简单的版本。

这篇指南讲这个 API 显示什么、从什么时候开始有、谁能用、有哪些条件，以及怎么配置。所有内容都来自 Apple 的文档和 WWDC26 的专题讲座，我在 2026 年 11 月 3 日重新核对过。

我的几款 iOS 应用都在卖订阅：Solys 是社交网络拦截器，TradaZen 是交易模拟器，Nolera 是 AI 试衣应用，还有 Vigie。2026 年 10 月 25 日，我为这四款应用申请了 API 权限，并用它们支持的所有语言准备好了消息。到 10 月 28 日，Apple 还没有批准，所以这篇指南写的是规则和我的准备工作，还没有实际结果。

## Retention Messaging API 做什么

根据 [Apple 的文档](https://developer.apple.com/documentation/retentionmessaging)，当用户查看某个订阅的详情页、可能准备取消时，系统会显示一条消息，这个 API 让你来决定显示哪一条。消息要提前准备好，每个产品、每种语言各一份。

流程始终如下：

1. 订阅者打开自己的订阅，比如在 Apple Account 的 Subscriptions 里，或者从 App Store 进入。
2. 点按 Cancel Subscription。
3. 系统显示确认页面（Confirm Cancellation），上面有你的消息。
4. 他可以照样取消，可以保留订阅，也可以接受你的消息里提供的内容。

消息在 iOS 15.1 和 iPadOS 15.1 及以上版本、visionOS 1，以及 macOS 14 及以上版本中可见。

## 从什么时候开始，面向谁

| 日期               | Apple 公布的变化                          |
| ------------------ | ----------------------------------------- |
| 2025 年 7 月 16 日 | 1.0 版：API 首个预览版                    |
| 2025 年 12 月 9 日 | 实时服务器性能测试                        |
| 2026 年 3 月 31 日 | 消息支持要点列表，可通过 API 设置实时地址 |
| 2026 年 4 月 27 日 | 支持承诺 12 个月的月度订阅                |
| 2026 年 6 月       | WWDC26：宣布 App Store Connect 中的模块   |

日期来自 [API 版本日志](https://developer.apple.com/documentation/retentionmessaging/retention-messaging-changelog)，最后一条除外，它来自 WWDC26 讲座。这个 API 仍是预览版：文档指向一个[权限申请表](https://developer.apple.com/contact/request/retention-messaging-api/)，需要登录你的开发者账号。

在 WWDC26 上，讲座 [Explore Retention Messaging in App Store Connect](https://developer.apple.com/videos/play/wwdc2026/309/) 介绍了 App Store Connect 中一个无需代码就能设置的模块。Apple 称它“向所有人开放”。实时版本则仍需申请。[App Store 新功能页面](https://developer.apple.com/app-store/whats-new/)宣布这个模块“今年秋季”推出。**截至 2026 年 11 月 3 日，App Store Connect 帮助文档里还没有关于它的页面，10 月 28 日我的账号里也没有出现这个模块。**

这个 API 适用于销售自动续期订阅的应用。它不是大厂专属：RevenueCat 在一份[基于 2200 万条消息的研究](https://www.revenuecat.com/blog/growth/apple-retention-messaging-benchmarks)中指出，小应用也可以申请权限。

## 4 种消息类型

| 类型     | 订阅者看到的内容                     | 默认消息 | 实时 |
| -------- | ------------------------------------ | -------- | ---- |
| 文本     | 标题、正文，最多五个要点             | 是       | 是   |
| 带图文本 | 同上，外加一张图片                   | 是       | 是   |
| 更换方案 | 一段文字和同一订阅群组中的另一个订阅 | 否       | 是   |
| 促销优惠 | 一段文字和一个以优惠价继续订阅的优惠 | 否       | 是   |

根据[消息准备](https://developer.apple.com/documentation/retentionmessaging/setting-up-retention-messages)页面，默认消息只能是文本，可带图也可不带图。**用 API 的话，提供优惠或其他方案必须走实时响应。**而 App Store Connect 中即将推出的模块，可以不用服务器就显示带优惠的消息。

促销优惠就是你在 App Store Connect 里创建的那种。根据[促销优惠帮助文档](https://developer.apple.com/help/app-store-connect/manage-subscriptions/set-up-promotional-offers-for-auto-renewable-subscriptions)，它面向现有订阅者和以前的订阅者。根据消息准备页面，在挽留消息中，优惠由你的服务器签名。更换方案则推荐同一群组里的订阅。如果你刚接触这些优惠，先看我写的[优惠代码和促销优惠](https://devoria.fr/zh-hans/blog/app-store-connect-offer-codes)指南。

## 能显示什么：准确的限制

| 元素             | Apple 的限制                               |
| ---------------- | ------------------------------------------ |
| 标题             | 最多 66 个字符                             |
| 正文             | 最多 144 个字符                            |
| 要点             | 最多 5 个                                  |
| 全宽图片         | 无透明度的 PNG，宽 3840 px，高 160 到 2160 |
| 要点图片         | 1024 × 1024 px                             |
| 每个应用的图片数 | 最多 2000 张                               |

长度限制来自[发送消息的请求体](https://developer.apple.com/documentation/retentionmessaging/uploadmessagerequestbody)说明，格式来自[上传图片](https://developer.apple.com/documentation/retentionmessaging/upload-image)页面。Apple 还要求图片在浅色和深色模式下都能正常显示。

每条消息、每张图片都要经过 Apple 审核。状态从 `PENDING` 变成 `APPROVED`，系统只显示已批准的内容。在 sandbox 中会自动批准。文档的内容规则很明确：不得发送误导性或不准确的内容。

## 需要满足的条件

- **每个产品、每种语言都要有一条默认消息。**没有它，该语言下什么都不显示。你的服务器没响应时，它也是备用方案。
- **消息和图片要先获批**，才能上线。
- **实时模式需要一台快速的服务器。**[实时地址配置](https://developer.apple.com/documentation/retentionmessaging/setting-up-retention-messaging-endpoint)页面要求有效的 SSL 证书、TLS 1.2，生产环境中响应时间低于 700 ms。超时则请求失败，显示默认消息。
- **在 sandbox 中通过性能测试**，然后才能登记生产地址。
- **校验应用。**Apple 的每个请求都带有应用标识 `appAppleId`。如果它和你的不一致，Apple 要求你不要响应。

实时请求会给你原始交易 ID、产品和设备语言。选哪条消息，由你按自己的规则决定。

## 配置 Retention Messaging：三种途径

| 途径                   | 适合谁                     | 需要什么                         |
| ---------------------- | -------------------------- | -------------------------------- |
| App Store Connect 模块 | 所有人，上线后可用         | 无需代码；文本、图片或优惠       |
| API，自建服务器        | 有后端的开发者             | Apple 权限、HTTPS 地址、性能测试 |
| API，通过 RevenueCat   | 已经在用 RevenueCat 的应用 | Apple 权限、在控制台中设置       |

多种设置同时存在时，Apple 在 WWDC26 讲座中说明了优先顺序：先看实时响应。如果没有响应或格式错误，就用 App Store Connect 中的设置。如果也没有，就用通过 API 配置的默认消息。

### 用你自己的服务器

1. 通过 Apple 的表单申请权限。
2. 先上传图片，再上传消息，每条都要有标题和正文。
3. 等待审核通过，然后为每个订阅、每种语言登记一条默认消息。
4. 实时模式：在服务器上创建 `Get Retention Message` 地址，并在 sandbox 中登记。
5. 在 sandbox 中用一笔测试交易运行[性能测试](https://developer.apple.com/documentation/retentionmessaging/initiate-performance-test)。
6. 测试通过后，登记生产地址。

### 用 RevenueCat

这是我选的方式：不用写服务器，而且我的应用本来就接入了 RevenueCat，具体见 [RevenueCat 与 iOS 应用内订阅](https://devoria.fr/zh-hans/blog/revenuecat-ios-in-app-subscription-setup)。根据 [RevenueCat 的文档](https://www.revenuecat.com/docs/platform-resources/apple-platform-resources/apple-retention-messaging-api)：

1. 在 Apple 的表单里，填写 RevenueCat 在你的 App Store 应用设置中显示的地址。
2. 获批后，打开 Lifecycle，再进入 Retention，接入 sandbox 地址。
3. 用一个有效的 sandbox 或 TestFlight 订阅运行性能测试。测试最长可能需要一小时。
4. 先逐个语言创建默认消息。
5. 再添加带规则的实时消息。其中一条规则“Is in free trial”针对正在免费试用的用户。
6. 切换到生产环境：sandbox 的设置不会沿用，消息需要重新创建。

## 写一条能留住人、但不设陷阱的消息

文本是固定的，显示前要经过 Apple 审核。所以它不能提到正在看它的人，也不能提到对方看到它的那一天。下面是我为 TradaZen 准备的默认消息（原文为法语，这里是中文译文）：

```text
标题（14 个字符）：
你想学会交易，却要盲目离开？

正文（48 个字符）：
没有练习，你的真金白银要为每个错误买单。在这里，错误不花一分钱。你的连续记录、联赛和课程都会停止。
```

我给四款应用定的规则：

- **标题把用户拉回到自己的目标**，用问句的形式。不让对方感到羞愧。
- **正文准确说明什么会停止。**我写的是访问权限“被锁定”，因为数据还在，绝不写数据会被“删除”。
- **不用任何时间词**，比如“明天”或“今天”：同一段文字会在周期内任何时候显示。
- **不承诺收益**，不制造虚假紧迫感。一个承诺靠交易改变人生的初版标题，在提交前就被我放弃了。[guideline 5.6](https://developer.apple.com/app-store/review/guidelines/#5.6) 禁止任何操纵性做法，TradaZen 的付费墙就曾因此被拒，我在 [guideline 5.6 与付费墙](https://devoria.fr/zh-hans/blog/guideline-5-6-paywall-app-store-rejection)里讲过这件事。
- **每种语言都有自己的文本**，用该语言版本应用里的词汇，字符数逐个核对。

对 TradaZen，我还计划为正在试用年度订阅的用户准备一条实时消息。它会推荐同一群组里更便宜的年度方案，因为我的数据显示，这些人用应用的频率和付费用户一样多：他们拒绝的是价格。这项设置还在等 Apple 批准。

## 能期待什么效果

别指望奇迹。Apple 把订阅者到达确认页面后仍保留订阅的比例称为挽回率。在 WWDC26 讲座中，Apple 表示，采用 Retention Messaging 的订阅，这一比率平均提高 1.4 个百分点。带促销优惠的消息提升最大，达到 5.5 个百分点，不同开发者的结果也有差异。另一方面，RevenueCat 的研究发现，订阅者只接受约 1.1% 的促销优惠和 0.6% 的方案更换。

所以这条消息替代不了前期的工作。免费试用一开始就被取消，问题出在付费墙和最初几次使用上：原因和对策见我的[免费试用被取消](https://devoria.fr/zh-hans/blog/ios-free-trial-cancelled-immediately)指南，试用的创建见[推介促销优惠](https://devoria.fr/zh-hans/blog/introductory-offer-app-store-connect-ios-free-trial)。

## 先准备好订阅，再写消息

[iOS & Android Kit](https://devoria.fr/zh-hans/kits/ios) 基于我自己应用的起步代码：引导流程、付费墙和订阅都已写好，四步流程带你按自己的节奏一路上架 App Store。从 App Store Connect 中的产品到付费墙，整条链路都写在 [iOS 应用内订阅](https://devoria.fr/zh-hans/expertise/ios-in-app-subscription)页面里。

如果你在准备第一次上架，[做一次免费诊断](https://devoria.fr/zh-hans/diagnostic)：它会告诉你项目真正卡在哪里，并发给你我的 Apple 防拒审清单。

## 常见问题

### Apple 的 Retention Messaging API 是什么？

这是一项服务器到服务器的服务，在订阅者点按 Cancel Subscription 时决定显示哪条消息。消息显示在确认页面上，在取消生效之前。它可以提醒订阅的价值，推荐另一个方案或促销优惠。

### Retention Messaging 对所有开发者开放吗？

API 是预览版，需要向 Apple 申请权限。在 WWDC26 上，Apple 宣布 App Store Connect 中会有一个向所有人开放的模块，计划 2026 年秋季推出。截至 2026 年 11 月 3 日，App Store Connect 帮助文档还没有介绍它。

### 消息在哪些 iOS 版本上显示？

iOS 15.1 和 iPadOS 15.1 及以上、visionOS 1，以及 macOS 14 及以上。在更旧的设备上，取消时不显示消息。

### 这条消息会阻止订阅者取消吗？

不会。确认页面上始终有取消按钮。订阅者也可以保留订阅，或接受推荐的优惠或方案。

### 能在取消时提供折扣吗？

能。用 API 的话，就是一条促销优惠消息，只能走实时模式：优惠在 App Store Connect 中创建，由你的服务器签名。App Store Connect 中即将推出的模块也支持带优惠的消息。更换方案则是推荐同一群组里的另一个订阅。

### 挽留消息可以写多少字符？

标题最多 66 个字符，正文最多 144 个。你可以加最多五个要点和一张无透明度的 PNG 图片。每种语言都需要自己的默认消息。

### 使用 Retention Messaging 需要服务器吗？

默认消息不需要托管地址：只要调用 API 上传并登记即可。用 RevenueCat 的话，它来充当服务器。实时模式需要一个在 700 ms 内响应的 HTTPS 地址。App Store Connect 中即将推出的模块无需代码即可设置。


## 你的项目

[iOS & Android Kit](https://devoria.fr/zh-hans/kits/ios)：用 Claude Code 打造你的 iPhone 和 Android 应用：我自己应用的起步代码、上架商店的完整流程，以及全部工具包。¥739。

[诊断：你离自己的 iPhone 应用还差什么](https://devoria.fr/zh-hans/diagnostic)：7 个问题，60 秒：看清真正阻碍你发布 iPhone 应用的原因，拿到你的 4 步路线和适合你的套件。
