From b19bcd64878518b8617d0e1910f4c6a9f00316a4 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Sun, 28 Jun 2026 10:19:35 +0800
Subject: [PATCH] Document App Store pricing gate for 8.1.6

---
 src/Release/AppStore-8.1.6-20260628.0230/PRO_PRICING_REVIEW_RISK_CHECKLIST.md                                   |   98 ++++++++++++++++++++++++++++++++
 src/Release/AppStore-8.1.6-20260628.0230/Screenshots/AppStore/mac-01-colorful-tips-2880x1800.png                |    0 
 src/Release/AppStore-8.1.6-20260628.0230/Screenshots/IAPReview/iap-review-pro-unlock-about-2880x1800.png        |    0 
 src/Release/AppStore-8.1.6-20260628.0230/Screenshots/AppStore/mac-02-dark-tips-2880x1800.png                    |    0 
 src/Release/AppStore-8.1.6-20260628.0230/Screenshots/IAPReview/iap-review-pro-unlock-about-actual-2092x1436.png |    0 
 src/Release/AppStore-8.1.6-20260628.0230/APP_REVIEW_NOTES.md                                                    |   17 ++++-
 src/Release/AppStore-8.1.6-20260628.0230/APP_STORE_RELEASE_CHECKLIST.md                                         |   19 ++++--
 7 files changed, 123 insertions(+), 11 deletions(-)

diff --git a/src/Release/AppStore-8.1.6-20260628.0230/APP_REVIEW_NOTES.md b/src/Release/AppStore-8.1.6-20260628.0230/APP_REVIEW_NOTES.md
index 9407616..d204c34 100644
--- a/src/Release/AppStore-8.1.6-20260628.0230/APP_REVIEW_NOTES.md
+++ b/src/Release/AppStore-8.1.6-20260628.0230/APP_REVIEW_NOTES.md
@@ -6,6 +6,9 @@
 
 本版本重点:
 
+- 收费模式调整:TagLauncher 从原先的付费下载 App 调整为免费下载,Pro 为 Apple In-App Purchase 的一次性买断解锁;我们目前不提供订阅制收费。
+- 老付费用户权益保护:在首个“免费 + Pro”版本前已经购买 / 拥有 TagLauncher 的用户,会通过 App Store receipt 的 `originalAppVersion` 自动获得终身 Pro,不会被要求再次付费。
+- 免费用户仍可使用核心应用启动、标签整理和搜索功能;Pro 仅解锁高级主题、布局导入导出、无限备注和手动应用排序保存。
 - Pro 主题免费体验新增倒计时。
 - 新增 `taglauncher://show`,可由第三方手势工具唤起 App Grid,不使用私有触控板 API,不新增 Accessibility / Input Monitoring 权限。
 - 智能初始化默认标签精简为 12 个。
@@ -19,8 +22,9 @@
 4. 打开偏好设置,切换到“标签”页,创建 / 编辑标签。
 5. 在 App Grid 标签列表中双击标签,确认会快速打开设置并定位到“标签”页。
 6. 在设置“主题”页点击 Pro 主题,确认免费体验倒计时出现。
-7. 在设置“快捷键”页查看触控板手势说明,可用 `open taglauncher://show` 验证外部唤起。
-8. 在设置“数据”页验证导入 / 导出布局入口。
+7. 在设置“关于”页查看 Pro 状态区域,可看到“解锁 Pro”和“恢复购买”入口;Pro 解锁使用商品 `com.taglauncher.pro.lifetime`。
+8. 在设置“快捷键”页查看触控板手势说明,可用 `open taglauncher://show` 验证外部唤起。
+9. 在设置“数据”页验证导入 / 导出布局入口。
 
 隐私说明:应用数据保存在本机;无账号、无云同步、无分析、无广告、无追踪。
 
@@ -30,6 +34,9 @@
 
 Highlights in this build:
 
+- Pricing model change: TagLauncher is moving from a paid-upfront app to a free download with an optional one-time Pro unlock through Apple In-App Purchase. We do not offer subscriptions.
+- Existing paid users are protected: users who purchased or obtained TagLauncher before the first "Free + Pro" version automatically receive lifetime Pro access using the App Store receipt `originalAppVersion`. They are not asked to pay again.
+- Free users can still use the core app launching, tag organization, and search workflow. Pro only unlocks premium themes, layout import/export, unlimited notes, and saved manual app ordering.
 - Added a visible countdown for free Pro theme previews.
 - Added `taglauncher://show`, allowing third-party gesture tools to open the App Grid without private trackpad APIs or new Accessibility / Input Monitoring permissions.
 - Simplified SmartStart default labels to 12 categories.
@@ -43,8 +50,8 @@
 4. Open Settings, go to Tags, and create or edit a tag.
 5. Double-click a tag in the App Grid tag list and confirm Settings opens directly to the Tags tab.
 6. In Settings > Theme, click a Pro theme and confirm the free preview countdown appears.
-7. In Settings > Keyboard shortcuts, review the trackpad gesture guidance. `open taglauncher://show` can be used to verify the external activation endpoint.
-8. In Settings > Data, verify layout import / export entry points.
+7. In Settings > About, review the Pro status area. It includes Unlock Pro and Restore Purchase actions; the Pro unlock uses product `com.taglauncher.pro.lifetime`.
+8. In Settings > Keyboard shortcuts, review the trackpad gesture guidance. `open taglauncher://show` can be used to verify the external activation endpoint.
+9. In Settings > Data, verify layout import / export entry points.
 
 Privacy: all app data is stored locally. There is no account, no cloud sync, no analytics, no ads, and no tracking.
-
diff --git a/src/Release/AppStore-8.1.6-20260628.0230/APP_STORE_RELEASE_CHECKLIST.md b/src/Release/AppStore-8.1.6-20260628.0230/APP_STORE_RELEASE_CHECKLIST.md
index 3fa960a..5d72d77 100644
--- a/src/Release/AppStore-8.1.6-20260628.0230/APP_STORE_RELEASE_CHECKLIST.md
+++ b/src/Release/AppStore-8.1.6-20260628.0230/APP_STORE_RELEASE_CHECKLIST.md
@@ -31,11 +31,18 @@
 
 - [x] Upload `Upload/TagLauncher-8.1.6-build20260628.0230.pkg` via Transporter / App Store Connect.
 - [x] Transporter delivery completed at `2026-06-28 03:37 CST`; status shown as `APP 可供内部测试`.
-- [ ] Complete Apple ID passkey / Touch ID authentication in Safari for `shanghai3168@gmail.com`.
-- [ ] Confirm ASC processing is visible on the version page.
-- [ ] Select build `8.1.6 (20260628.0230)` on the macOS version page.
-- [ ] If Missing Compliance appears, answer `None of the algorithms mentioned above`.
+- [x] Complete Apple ID passkey / Touch ID authentication for `shanghai3168@gmail.com`.
+- [x] Create ASC IAP `Lifetime Pro Unlock` / `com.taglauncher.pro.lifetime` / Apple ID `6785107181`.
+- [x] Configure IAP as non-consumable, Family Sharing enabled, all countries/regions available, US `$6.99`.
+- [ ] Set or verify the App download price schedule is Free for the free-download + one-time Pro unlock transition. ASC pricing page currently shows `中国大陆 (CNY)` app price `¥18.00`, so this is a release blocker until corrected or explicitly changed.
+- [x] Prepare IAP review screenshot: `Screenshots/IAPReview/iap-review-pro-unlock-about-actual-2092x1436.png`.
+- [ ] Upload IAP review screenshot in ASC `审核信息 > 截屏` and save until IAP status is no longer `元数据丢失`.
+- [x] Confirm ASC processing is visible on the version page.
+- [x] Select build `8.1.6 (20260628.0230)` on the macOS version page. ASC displays `8.1.6 (20260628.230)`.
+- [ ] Attach IAP `Lifetime Pro Unlock` to the 8.1.6 version page.
+- [x] If Missing Compliance appears, answer `None of the algorithms mentioned above`. Current version page no longer shows the missing export compliance warning after build selection.
 - [ ] Confirm App Information subtitle does not use Apple comparison terms.
-- [ ] Fill What's New from `APP_STORE_CONNECT_METADATA.md`.
-- [ ] Use `APP_REVIEW_NOTES.md` for review notes.
+- [ ] Replace ASC product-page screenshots with exactly the two prepared `2880x1800` screenshots in `Screenshots/AppStore/`. User stated screenshots were manually adjusted and should not be handled further in this pass.
+- [x] Fill What's New from `APP_STORE_CONNECT_METADATA.md`. English (US) `whatsNew` was empty and was filled/saved on ASC; `Add for Review` became enabled afterward.
+- [x] Use `APP_REVIEW_NOTES.md` for review notes.
 - [ ] Final action: click `Add for Review` / `Submit for Review`; do not stop after only updating metadata.
diff --git a/src/Release/AppStore-8.1.6-20260628.0230/PRO_PRICING_REVIEW_RISK_CHECKLIST.md b/src/Release/AppStore-8.1.6-20260628.0230/PRO_PRICING_REVIEW_RISK_CHECKLIST.md
new file mode 100644
index 0000000..334478c
--- /dev/null
+++ b/src/Release/AppStore-8.1.6-20260628.0230/PRO_PRICING_REVIEW_RISK_CHECKLIST.md
@@ -0,0 +1,98 @@
+# Pro Pricing Model App Review Risk Checklist - 8.1.6 build 20260628.0230
+
+## Scope
+
+This checklist gates the App Store submission that changes TagLauncher from a paid-upfront macOS app to a free app with an optional one-time Pro unlock.
+
+Submission is **No-Go** until every required item below is `PASS`.
+
+## Apple Rules Referenced
+
+- App Review Guidelines 3.1.1: digital features or full-version unlocks inside the app must use In-App Purchase, and restorable purchases need a restore mechanism.
+- App Review Guidelines 2.3: metadata, screenshots, privacy information, and review notes must accurately describe core experience, pricing, new functionality, and product changes.
+- App Review Guidelines "Before You Submit": App Review notes should include detailed explanations of non-obvious features and in-app purchases.
+
+Official source: https://developer.apple.com/app-store/review/guidelines/
+
+## Gate A - Product And Pricing Model
+
+| ID | Check | Status | Evidence / Required Evidence |
+| --- | --- | --- | --- |
+| A1 | Pro is a one-time unlock, not a subscription. | PASS | PRD states "一次性买断"; code uses one StoreKit product id `com.taglauncher.pro.lifetime`. |
+| A2 | Pro unlock uses Apple In-App Purchase only; no external license key, website payment, QR code, or other unlock mechanism. | PASS | `ProEntitlement.swift` uses StoreKit `Product.products`, `product.purchase`, and `Transaction.currentEntitlements`. No external payment path found in current grep scope. |
+| A3 | The ASC In-App Purchase product exists with product id `com.taglauncher.pro.lifetime`. | PASS | ASC IAP created: `Lifetime Pro Unlock`, Apple ID `6785107181`, product ID `com.taglauncher.pro.lifetime`. |
+| A4 | The ASC product type is Non-Consumable / one-time purchase. | PASS | ASC product was created as `非消耗型项目` / Non-Consumable. |
+| A5 | The Pro price matches the previous paid app price as intended by PRD. | PASS-WITH-NOTE | ASC IAP pricing configured at US `$6.99`; local StoreKit price shown as `¥48.00`, matching the intended previous paid-app price regionally. |
+| A6 | Family Sharing is enabled if available for this non-consumable product. | PASS | ASC shows Family Sharing enabled: family group members can share this IAP. |
+| A7 | App price is set/scheduled to Free only in a way that keeps IAP available for review and sale. | FAIL-ASC | ASC pricing page currently shows `中国大陆 (CNY)` app price `¥18.00`; this conflicts with the intended free-download + one-time Pro unlock model. Do not submit until the App price schedule is changed to Free or the pricing model is explicitly changed. |
+
+## Gate B - Existing Paid Users
+
+| ID | Check | Status | Evidence / Required Evidence |
+| --- | --- | --- | --- |
+| B1 | Existing users who obtained the app before the free + Pro transition automatically receive lifetime Pro. | PASS | `firstFreeProVersion = "8.1.0"` and `AppTransaction.shared` legacy path are implemented. |
+| B2 | Primary legacy rule uses `originalAppVersion` earlier than `8.1.0`. | PASS | `isLegacyPaidUser` compares `appTransaction.originalAppVersion` against `firstFreeProVersion`. |
+| B3 | `originalPurchaseDate` fallback exists for cases where version parsing is unavailable. | PASS-WITH-NOTE | Code supports fallback, but `legacyFallbackOriginalPurchaseDateISO8601` is currently `nil`; acceptable only if `originalAppVersion` is reliable enough for this release. |
+| B4 | Legacy Pro state is cached so offline launch does not immediately lose confirmed Pro status. | PASS | `ProEntitlementCache` persists `accessState`, `originalAppVersion`, and `originalPurchaseDate`. |
+| B5 | Review Notes explicitly state old paid users get lifetime Pro and are not asked to pay again. | PASS | `APP_REVIEW_NOTES.md` now states existing paid users automatically receive lifetime Pro via `originalAppVersion`. |
+
+## Gate C - Purchase / Restore Behavior
+
+| ID | Check | Status | Evidence / Required Evidence |
+| --- | --- | --- | --- |
+| C1 | Purchase flow calls StoreKit purchase. | PASS | `ProEntitlementCenter.purchasePro()` calls `product.purchase()`. |
+| C2 | Restore flow exists and calls App Store sync. | PASS | `restorePurchases()` calls `AppStore.sync()`. |
+| C3 | Current entitlements are checked after purchase/restore/app start. | PASS | `Transaction.currentEntitlements` is used in `hasPurchasedLifetimePro()`. |
+| C4 | Unverified transactions do not unlock Pro. | PASS | Code ignores `.unverified` transactions. |
+| C5 | Product unavailable state is user-visible and does not crash. | PASS | Missing product returns `pro.purchase.unavailable`. |
+| C6 | Restore-with-no-purchase state is user-visible. | PASS | `restoreNotFound` maps to localized user message. |
+| C7 | Sandbox purchase and restore are testable during App Review. | TODO-ASC | IAP product exists and StoreKit product id matches code. Must attach the IAP to the app version before final submit so App Review can test purchase and restore. |
+
+## Gate D - Free App Value And Pro Boundaries
+
+| ID | Check | Status | Evidence / Required Evidence |
+| --- | --- | --- | --- |
+| D1 | Free users can still use the core app launcher and tag workflow. | PASS | Pro gates are limited to premium themes, import/export, unlimited notes, and persistent manual sorting. |
+| D2 | Free users can preview Pro themes without dirtying permanent state. | PASS | Theme preview state is transient and expires; countdown QA passed. |
+| D3 | Free preview clearly shows remaining time and restores the real available theme on expiry. | PASS | `pro_theme_preview_countdown_qa.sh` passed. |
+| D4 | Free users are not misled into thinking Pro-only saved state has been permanently saved. | PASS | Sorting preview toast and feature gates are wired by `pro_feature_gate_qa.sh`. |
+| D5 | Pro prompts appear only when the user actively triggers Pro functionality. | PASS | Static gate QA passed; no always-on paywall detected in checked paths. |
+
+## Gate E - Metadata / Review Notes / Screenshots
+
+| ID | Check | Status | Evidence / Required Evidence |
+| --- | --- | --- | --- |
+| E1 | What’s New accurately describes user-visible Pro changes without over-selling monetization. | PASS | English (US) `whatsNew` was empty on ASC and was filled/saved with user-visible 8.1.6 changes; no external purchase path is mentioned. |
+| E2 | Review Notes include a dedicated pricing model change explanation. | PASS | `APP_REVIEW_NOTES.md` now describes paid-upfront to free + Pro. |
+| E3 | Review Notes explain Pro is one-time non-consumable IAP, not a subscription. | PASS | `APP_REVIEW_NOTES.md` says Pro is a one-time Apple In-App Purchase and not a subscription. |
+| E4 | Review Notes explain old paid users automatically get lifetime Pro. | PASS | `APP_REVIEW_NOTES.md` documents the `originalAppVersion` legacy unlock path. |
+| E5 | Review Notes explain free users keep core functionality. | PASS | `APP_REVIEW_NOTES.md` lists free core launching, tagging, and search workflow. |
+| E6 | Screenshots/metadata do not imply every Pro feature is free. | PASS-WITH-USER-OVERRIDE | User manually adjusted ASC screenshots and instructed Codex not to handle screenshots further in this pass. Current metadata text separates Free core functionality from Pro-only features. |
+| E7 | App description/subtitle does not use risky Apple comparison terms. | PASS | Release metadata already bans Launchpad/Spotlight comparison terms. |
+| E8 | If Pro/IAP appears in screenshots or description, the additional purchase requirement is clear. | PASS | App description keeps core app value separate; review notes explicitly explain optional one-time Pro unlock and old paid-user lifetime Pro protection. |
+| E9 | ASC screenshots use accepted macOS screenshot dimensions. | PASS-WITH-USER-OVERRIDE | User manually adjusted ASC screenshots and instructed Codex not to handle screenshots further in this pass. After English What's New was filled, ASC enabled `添加以供审核`, indicating screenshot metadata is no longer blocking version submission. |
+| E10 | IAP review screenshot clearly shows the Pro unlock entry, price, restore, and unlocked benefits. | PASS-WITH-NOTE | IAP review screenshot was uploaded manually by user. Codex previously prepared stronger Pro-unlock screenshots under `Screenshots/IAPReview/`; user chose to manage screenshots manually. Final submission dialog should still be checked for IAP inclusion. |
+
+## Gate F - Local QA Evidence
+
+| ID | Check | Status | Evidence / Required Evidence |
+| --- | --- | --- | --- |
+| F1 | Pro feature gate static QA passed. | PASS | `bash Scripts/pro_feature_gate_qa.sh` passed. |
+| F2 | Pro localization QA passed for all 29 languages. | PASS | `bash Scripts/pro_localization_qa.sh` passed: 29 languages, 46 keys. |
+| F3 | Pro theme preview countdown QA passed. | PASS | `bash Scripts/pro_theme_preview_countdown_qa.sh` passed. |
+| F4 | macOS 14 build metadata QA passed. | PASS | Recorded in release checklist. |
+| F5 | Signed PKG upload package verified. | PASS | Recorded in release checklist. |
+
+## Current Go / No-Go
+
+**NO-GO**
+
+Reasons:
+
+1. Local code, package, Pro gates, localization, and countdown QA passed.
+2. ASC build is selected on the 8.1.6 version page.
+3. English (US) What's New was filled and saved; `Add for Review` became enabled.
+4. User manually handled screenshots and instructed Codex not to block on screenshot replacement in this pass.
+5. Release-blocking pricing mismatch remains: ASC still shows the app itself as paid in China (`¥18.00`), while this submission is meant to transition to a free app with optional one-time Pro unlock.
+
+Before the final external side-effect, fix or explicitly resolve A7, then open the `Add for Review` flow and confirm the submission summary includes the 8.1.6 build and the intended `Lifetime Pro Unlock` IAP. Do not click final `Submit for Review` without action-time user confirmation.
diff --git a/src/Release/AppStore-8.1.6-20260628.0230/Screenshots/AppStore/mac-01-colorful-tips-2880x1800.png b/src/Release/AppStore-8.1.6-20260628.0230/Screenshots/AppStore/mac-01-colorful-tips-2880x1800.png
new file mode 100644
index 0000000..40620ae
--- /dev/null
+++ b/src/Release/AppStore-8.1.6-20260628.0230/Screenshots/AppStore/mac-01-colorful-tips-2880x1800.png
Binary files differ
diff --git a/src/Release/AppStore-8.1.6-20260628.0230/Screenshots/AppStore/mac-02-dark-tips-2880x1800.png b/src/Release/AppStore-8.1.6-20260628.0230/Screenshots/AppStore/mac-02-dark-tips-2880x1800.png
new file mode 100644
index 0000000..868d257
--- /dev/null
+++ b/src/Release/AppStore-8.1.6-20260628.0230/Screenshots/AppStore/mac-02-dark-tips-2880x1800.png
Binary files differ
diff --git a/src/Release/AppStore-8.1.6-20260628.0230/Screenshots/IAPReview/iap-review-pro-unlock-about-2880x1800.png b/src/Release/AppStore-8.1.6-20260628.0230/Screenshots/IAPReview/iap-review-pro-unlock-about-2880x1800.png
new file mode 100644
index 0000000..e67a116
--- /dev/null
+++ b/src/Release/AppStore-8.1.6-20260628.0230/Screenshots/IAPReview/iap-review-pro-unlock-about-2880x1800.png
Binary files differ
diff --git a/src/Release/AppStore-8.1.6-20260628.0230/Screenshots/IAPReview/iap-review-pro-unlock-about-actual-2092x1436.png b/src/Release/AppStore-8.1.6-20260628.0230/Screenshots/IAPReview/iap-review-pro-unlock-about-actual-2092x1436.png
new file mode 100644
index 0000000..2fde747
--- /dev/null
+++ b/src/Release/AppStore-8.1.6-20260628.0230/Screenshots/IAPReview/iap-review-pro-unlock-about-actual-2092x1436.png
Binary files differ

--
Gitblit v1.9.3