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