# iOS 免費試用：App Store Connect 推出優惠

> 推出優惠是 iOS 訂閱開頭的免費試用或折扣價，每個 Apple 帳號在每個訂閱群組只能用一次。本文說明建立與顯示方式。

原始頁面：[iOS 免費試用：App Store Connect 推出優惠](https://devoria.fr/zh-hant/blog/ios-free-trial-introductory-offer-app-store-connect)
作者：[Mehdi Azizi](https://devoria.fr/zh-hant/mehdi-azizi)
發布日期：2026-11-04
內容最後修訂：2026-11-04


推出優惠（introductory offer）是自動續訂型訂閱的起始價格，有三種：免費試用、預先付款，或隨用隨付。**每位顧客在每個訂閱群組只能享有一次**，所以你的 app 在寫出「免費試用」之前，必須先確認對方的資格。你在訂閱的價格頁面建立它，而你的付費牆必須清楚顯示優惠期間，以及之後要收取的價格。

在 Solys 和 TradaZen 上，7 天免費試用是掛在年訂方案上。週訂方案沒有試用。以下是三種優惠類型、誰有資格、怎麼建立，還有我在顯示上犯過的兩個錯誤。「上市優惠」這個說法通常指的是同一件事，我那篇[付費牆錯誤](https://devoria.fr/zh-hant/blog/ios-paywall-beginner-mistakes)指南裡也是這樣用。

## 什麼是推出優惠（introductory offer）？

[App Store Connect 說明文件](https://developer.apple.com/help/app-store-connect/manage-subscriptions/set-up-introductory-offers-for-auto-renewable-subscriptions/)把它定義為：訂閱第一個期間的限時折扣價或免費試用。它只適用於自動續訂型訂閱。優惠結束後，訂閱會以正常價格續訂，除非對方在那之前取消。

符合資格的人會在你的 App Store 頁面上看到這個優惠。購買時，**只要對方有資格，Apple 會自動套用**。你的工作，是不要在畫面上承諾一個 Apple 不會給的優惠。

## 三種推出優惠類型

[StoreKit 文件](https://developer.apple.com/documentation/storekit/implementing-introductory-offers-in-your-app)描述了三種付款模式。下面每一種都附一個虛構範例：年訂 39.99 歐元、月訂 6.99 歐元，這不是我任何一個 app 的價格。

| 類型     | 虛構範例                  | 一開始支付       | 之後            |
| -------- | ------------------------- | ---------------- | --------------- |
| 免費試用 | 免費 7 天                 | 0 歐元           | 每年 39.99 歐元 |
| 預先付款 | 3 個月 9.99 歐元          | 一次付 9.99 歐元 | 每年 39.99 歐元 |
| 隨用隨付 | 每月 2.99 歐元，共 3 個月 | 每月 2.99 歐元   | 每月 6.99 歐元  |

以下是每一種在畫面上該怎麼寫，一樣用這些虛構價格：

- **免費試用**：「免費 7 天，之後每年 39.99 歐元。」試用期間訂閱其實已經開始，但結束前不會扣款。
- **預先付款**：「前 3 個月 9.99 歐元，之後每年 39.99 歐元。」對方為整個折扣期間只付一次。
- **隨用隨付**：「每月 2.99 歐元，持續 3 個月，之後每月 6.99 歐元。」折扣價在每個期間都會收一次。

**三種情況下，這句話都要包含優惠結束後會收取的價格。**

## 誰有資格享有推出優惠？

Apple 的說明很清楚：每個訂閱可以設一個優惠，但每個人在每個訂閱群組只能享有一次推出優惠。StoreKit 文件把三種情況講得更細：

- **新訂閱者**一定有資格；
- **回流的舊訂閱者**，如果從沒在這個群組用過推出優惠，就有資格；
- **目前的訂閱者**沒有資格，即使他在同一個群組裡換方案也一樣。

資格跟著付款的 Apple 帳號走，不是跟著 iPhone，也不是跟著你 app 裡建立的帳號。試用過、取消、再重新安裝 app 的人，就沒有資格了。可是商品還是繼續宣告它的優惠：誤導性的顯示就是這樣產生的。

直接的後果是：**在週訂方案上試用，會用掉年訂方案的試用資格**，因為兩者在同一個群組裡。所以我的試用只放在年訂上。

另一個限制：每個國家可以有一個進行中的推出優惠，加上一個未來的優惠。如果兩個優惠時間重疊，最後建立的那個會取代另一個。2026 年 7 月，我在 TradaZen 的年訂上同時想要折扣價和免費試用。一次只能有一個優惠：只能二選一。最後我另外建了第二個比較便宜的年訂方案，用來掛試用。

## 在 App Store Connect 建立優惠

你需要 Account Holder、Admin、App Manager 或 Marketing 角色。以下介面名稱取自 Apple 的說明文件：

1. 在 Apps 裡打開你的 app，然後點側邊欄的 Subscriptions。
2. 選擇群組，再選擇訂閱。
3. 在 Subscription Prices 區塊，點 View all Subscription Pricing，再點 Set up Introductory Offer。
4. 選擇國家或地區，然後設定開始和結束日期。如果從今天開始，優惠會立刻生效。
5. 選擇 Free、Pay up front 或 Pay as you go，再設定期間和價格。
6. App Store Connect 會為 175 個國家提供對應價格。需要的話調整一下，然後確認。

**優惠建立後就不能再修改**：要改期間或價格，就到 Introductory Offers 分頁刪掉再重建。修改可能要最多一小時才會反映到 sandbox。[RevenueCat 文件](https://www.revenuecat.com/docs/subscription-guidance/subscription-offers)也建議，最多等 24 小時再判斷優惠沒有被套用。

## 可設定的期間

免費試用可以是 3 天、1 或 2 週、1、2、3 或 6 個月，或 1 年，不論訂閱週期多長都一樣。預先付款可涵蓋 1、2、3 或 6 個月，或 1 年。隨用隨付則依訂閱週期而定：

| 訂閱週期 | 隨用隨付                  |
| -------- | ------------------------- |
| 1 週     | 1 到 12 週                |
| 1 個月   | 1 到 12 個月              |
| 2 個月   | 2 到 12 個月，以 2 為單位 |
| 3 個月   | 3、6、9 或 12 個月        |
| 6 個月   | 6 或 12 個月              |
| 1 年     | 1 年                      |

在我的 app 上，我選了 7 天，放在年訂上。這不是 Apple 的規定，而是產品決策，請用你自己的數據重新評估。

## 只對有資格的人顯示試用

Apple 在同一頁說明裡寫得很明白：如果你在 app 裡顯示優惠，要確認對方真的能享有。**讓你的程式碼回答兩個問題**：這個商品有沒有免費試用？這個人還有沒有資格？

第一個問題從商品本身讀取。注意，推出優惠不一定是免費的。在 TradaZen 上，標準年訂掛的是預先付款，也就是比較便宜的第一年，而試用放在另一個年訂上。兩者回傳時都是「推出優惠」。所以我的程式碼會讀優惠的價格：零就是試用；大於零就是付費優惠。

第二個問題要問商店。在 Swift 裡，StoreKit 2 從 iOS 15 起提供 [isEligibleForIntroOffer](https://developer.apple.com/documentation/storekit/product/subscriptioninfo/iseligibleforintrooffer)。Apple 特別說明，即使沒有設定任何優惠，這個值也可能是 true：所以才需要第一個問題。在 Expo app 裡用 RevenueCat 的話，對應的是 `checkTrialOrIntroductoryPriceEligibility`，會回傳有資格、沒資格、沒有優惠，或未知。以下是 TypeScript 的基本做法：

```ts
import Purchases, {
  INTRO_ELIGIBILITY_STATUS as S,
  type PurchasesStoreProduct,
} from "react-native-purchases";

type Essai = "oui" | "non" | "doute";

export async function essaiGratuit(p: PurchasesStoreProduct): Promise<Essai> {
  if (!p.introPrice || p.introPrice.price > 0) return "non";
  try {
    const r = await Purchases.checkTrialOrIntroductoryPriceEligibility([
      p.identifier,
    ]);
    const statut = r[p.identifier]?.status;
    if (statut === S.INTRO_ELIGIBILITY_STATUS_ELIGIBLE) return "oui";
    if (statut === S.INTRO_ELIGIBILITY_STATUS_INELIGIBLE) return "non";
    if (statut === S.INTRO_ELIGIBILITY_STATUS_NO_INTRO_OFFER_EXISTS)
      return "non";
    return "doute";
  } catch {
    return "doute";
  }
}
```

「doute」（不確定）這種情況才是真正的重點。RevenueCat 把它的檢查描述為盡力而為的估計，而 Apple 的付款表單無論如何都會在確認前顯示真正的條件。對於未知狀態，RevenueCat 建議顯示正常價格，以免誤導任何人。

我在 TradaZen 上學到了問題的另一面。第一版把讀取錯誤當成拒絕：有資格試用的人看不到試用。現在，我的 app 只有在商店明確拒絕時，也就是沒資格或沒有優惠，才會拿掉試用。不確定時，保留商品原本的顯示。**這是取捨，不是 RevenueCat 的建議**：如果你偏好保守，就照他們的做。不管哪種做法，都絕對不要把「我不知道」當成「不行」。

如果你用 RevenueCat 的付費牆，根據他們的[優惠說明頁](https://www.revenuecat.com/docs/tools/paywalls/creating-paywalls/supporting-offers)，每段文字都可以為有優惠資格的人準備另一個版本。其他設定請看我的指南：[用 RevenueCat 做 iOS 訂閱](https://devoria.fr/zh-hant/blog/revenuecat-ios-in-app-subscription-setup)。

## 3.1.2 要求畫面上寫什麼

[Guideline 3.1.2(a)](https://developer.apple.com/app-store/review/guidelines/#3.1.2a) 允許訂閱提供免費試用，前提是要提供 App Store Connect 規定的資訊。[Apple 的訂閱說明頁](https://developer.apple.com/app-store/subscriptions/)寫得更具體：在試用的購買流程中，要清楚標示試用期間，以及結束時會收取的價格。實際收取的金額也必須是畫面上最顯眼的價格元素。

Solys 在 2026 年 10 月 10 日收到的退件就是這麼說的：免費試用、上市價格和換算後的價格，都必須從屬於實際收取的金額。**可以宣傳試用，但之後收取的價格必須是畫面上最清楚易讀的價格。**這兩次退件和修正方式都在我的 [guideline 3.1.2](https://devoria.fr/zh-hant/blog/guideline-3-1-2-app-subscription-rejected) 指南裡。

相反的錯誤也存在：提供了試用卻沒說。有一陣子，我付費牆上的按鈕只寫「繼續」。在 Solys 上，「免費 7 天」甚至只存在於 VoiceOver 標籤裡，畫面上根本看不到。

## 在 sandbox 測試優惠

用 sandbox 帳號購買訂閱：試用應該出現在 Apple 的付款表單上。要重跑新訂閱者的流程，在 iPhone 上的 sandbox 帳號設定裡選 Clear Purchase History。根據 [Apple 的 sandbox 文件](https://developer.apple.com/documentation/storekit/testing-in-app-purchases-with-sandbox)，這樣帳號就會重新具備推出優惠資格。

也要測試已經試用過的帳號：你的付費牆不應該再宣傳任何免費內容。如果商品完全載入不出來，請看我關於 [Missing Metadata](https://devoria.fr/zh-hant/blog/app-store-connect-missing-metadata-subscription) 狀態的指南。

## 正確串接你的免費試用

[iOS & Android Kit](https://devoria.fr/zh-hant/kits/ios) 以我 app 的起始程式碼為基礎：onboarding、付費牆和訂閱都已經寫好，第三步「串接金流」會帶你設定商品和試用。整條流程都寫在 [iOS app 內訂閱](https://devoria.fr/zh-hant/expertise/ios-in-app-subscription)頁面上。如果你還在猶豫商業模式，先看[訂閱還是一次性購買](https://devoria.fr/zh-hant/blog/ios-app-subscription-vs-one-time-purchase)。

如果你正在準備第一次上架，[做一下免費診斷](https://devoria.fr/zh-hant/diagnostic)：它會幫你把步驟排好順序，並寄給你我的 Apple 防退件檢查清單。想送人一個月或挽回舊訂閱者，接下來請看我的[優惠代碼](https://devoria.fr/zh-hant/blog/app-store-connect-offer-codes-promo-code)指南。

## 常見問題

### App Store 的推出優惠（introductory offer）是什麼？

它是自動續訂型訂閱的起始價格：免費試用、預先付款或隨用隨付。它在 App Store Connect 建立，購買時 Apple 會自動套用給有資格的人。之後，訂閱會改為正常價格。

### 使用者可以免費試用兩次嗎？

在同一個訂閱群組裡不行：每個 Apple 帳號在每個群組只能享有一次推出優惠。重新安裝 app 也不會恢復資格。不過，如果他訂閱了你 app 裡另一個群組，就可以享有那個群組的優惠。

### 免費試用和折扣可以同時使用嗎？

同一個訂閱在同一時間不行：每個國家只能有一個進行中的推出優惠。你可以另外建立第二個訂閱來掛另一個優惠，或使用優惠代碼，依你的設定，優惠代碼可以接在推出優惠之後。

### 加入試用需要發布新版 app 嗎？

優惠本身不需要：它在 App Store Connect 設定，並在購買時套用。但如果你的付費牆在程式碼裡寫死「7 天」，就得更新。從商店回傳的商品讀取期間，畫面就會跟著變。

### 舊訂閱者可以享有免費試用嗎？

可以，只要他從沒在這個訂閱群組用過推出優惠。如果已經用過，就沒有資格了，即使過了好幾個月也一樣。想讓他回來，Apple 提供了挽回優惠和促銷優惠。


## 你的專案

[iOS & Android Kit](https://devoria.fr/zh-hant/kits/ios)：用 Claude Code 打造你的 iPhone 和 Android App：我自己 App 的起始程式碼、上架商店的完整流程，以及所有套件。$3,599。

[診斷：你離自己的 iPhone App 還差什麼](https://devoria.fr/zh-hant/diagnostic)：7 個問題，60 秒：找出真正卡住你發布 iPhone App 的原因，拿到你的 4 步驟路線，以及最適合你的套件。
