Detects missing or insufficient in-app account deletion functionality required since June 30, 2022 under Guideline 5.1.1(v) for all apps that support account creation.
日本語の概要は準備中です。原文の説明を表示しています。
Detects missing or obscured subscription disclosure elements on paywall screens, enforcing Guideline 3.1.2(c) requirements for auto-renewal terms, trial end dates, and actual price.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Detects missing or obscured subscription disclosure elements (auto-renewal, trial end terms, cancellation instructions, actual price) on paywall screens, enforcing Guideline 3.1.2(c).
references/guidelines/3-business.mdCase: Paywall shows "50% OFF" prominently — actual billing amount ($9.99/month) shown in 10pt gray text below fold — rejected Source: https://developer.apple.com/forums/thread/127616 Root cause: 3.1.2(c) requires billed amount shown clearly and conspicuously — size/color/placement must not obscure it; discounts shown without clear pricing are a known rejection trigger
Case: Free trial paywall shows "Try free for 7 days" with no mention of what happens after trial — rejected Source: RevenueCat Community (https://community.revenuecat.com/general-questions-7/rejected-due-to-guideline-3-1-2-business-payments-subscriptions-4775) Root cause: Must clearly state amount billed after trial ends and when billing starts
Case: App rejected for subscription auto-renewal not disclosed — "billed amount not clearly displayed" Source: blog.wenhaofree.com/en/posts/articles/app-store-guideline-3-1-2-subscription-fix/ Root cause: Auto-renewable subscription purchase flow must state renewal continues until cancelled
Case: Paywall had no links to Privacy Policy or Terms of Use — reviewer required legal doc links before purchase could proceed — rejected under 3.1.2(c) Source: AngularCorp blog (angularcorp.com/en-us/blog/guideline-3-1-2) Root cause: Subscription paywalls must include accessible links to Privacy Policy and Terms of Use; reviewers verify these links exist and are functional before approving
Case: Paywall showed price as "from $1.67/month" calculated from an annual plan — reviewer expected to be billed $1.67/month but actual charge was $19.99/year — rejected Source: AppFollow (appfollow.io/blog/app-store-rejection-reasons) Root cause: If billing is annual, the displayed price must be the annual amount or clearly labeled as "billed annually at $X"; showing only the monthly equivalent without disclosing actual charge is a known rejection pattern
Invoke on any iOS/macOS project with subscription or in-app purchase paywalls.
| Name | Type | Default | Description |
|---|---|---|---|
project_root | path | cwd | iOS/macOS project root |
shared_context | object | nil | Pre-collected context from appstore-full-audit Phase 1 |
Skip this phase if shared_context is provided.
Glob **/*Paywall* or **/*Subscription* or **/*Premium* or **/*Pricing* — locate paywall and subscription UI files.Glob **/*.swift — collect all Swift source files for broader search.Search primarily in paywall/subscription view files (*Paywall*, *Subscription*, *Premium*, *Pricing*). Fall back to all **/*.swift if no dedicated files found.
Auto-renewal disclosure
Grep pattern "auto-renew"|"automatically renew"|"renews automatically"|"auto renew"|"recurring" in subscription/paywall files.
If absent → 🔴 CRITICAL. Every auto-renewable subscription paywall must disclose that the subscription renews automatically until cancelled.
Trial end disclosure
Grep pattern "after.*trial|trial ends|then.*per|after.*free|billed after|charged after" in subscription/paywall files.
If a free trial is offered but this disclosure is absent → 🔴 CRITICAL. Users must know what they will be charged when the trial ends.
Cancellation information
Grep pattern "cancel anytime"|"cancelable"|"Cancel in Settings"|"manage.*subscription"|"cancell" in subscription/paywall files.
If absent → 🟠 HIGH. Instructions for cancellation must be accessible from the subscription UI.
Actual price display
Grep pattern displayPrice|localizedPrice|priceLocale|price\.formatted|priceString in subscription/paywall files.
If absent → 🔴 CRITICAL. The actual billed price must be displayed, not only a discount label. Must use StoreKit's localized price APIs to show the correct price for the user's region.
Discount without price
Grep pattern "% off"|"save.*%"|"discount"|"OFF" in subscription/paywall files.
If found, verify displayPrice|localizedPrice also present in same file → 🟠 HIGH if price display absent. Showing a discount without the absolute price is a known rejection pattern.
Billing period disclosure
Grep pattern subscriptionPeriod|subscription_period|billingPeriod|"per month"|"per year"|"monthly"|"annually"|"weekly" in subscription/paywall files.
If absent → 🟠 HIGH. Billing frequency must be clearly stated alongside the price.
Family Sharing disclosure (Guideline 3.1.2(d))
Grep pattern isFamilyShareable|familyShared|familySharable in **/*.swift.
If Family Sharing is enabled on any subscription product: verify a disclosure is present on the paywall such as "Shareable with up to 5 family members" → 🟡 MEDIUM if absent. Guideline 3.1.2(d) requires communicating Family Sharing eligibility to users before purchase.
Collect all findings from Phase 2 and build the prioritised findings list below. Include file paths and line numbers. Omit tiers with no findings.
## Subscription Disclosure — Findings
### 🔴 CRITICAL — Guaranteed rejection
- [ ] TODO: Add auto-renewal disclosure text to paywall — e.g., "Subscription automatically renews unless cancelled" — `PaywallView.swift` — Guideline 3.1.2(c)
- [ ] TODO: Add post-trial billing disclosure — state what amount is charged after the free trial ends — `SubscriptionView.swift:45` — Guideline 3.1.2(c)
- [ ] TODO: Display actual localized price using displayPrice or localizedPrice — price absent from paywall UI — `PremiumView.swift` — Guideline 3.1.2(c)
### 🟠 HIGH — Very likely rejection
- [ ] TODO: Add cancellation instructions — e.g., "Cancel anytime in iPhone Settings > Subscriptions" — `PaywallView.swift` — Guideline 3.1.2(c)
- [ ] TODO: Show actual monthly price alongside "50% OFF" discount label — discount without price is a rejection pattern — `PaywallView.swift:88` — Guideline 3.1.2(c)
- [ ] TODO: Display billing period (monthly/annually/weekly) next to the price — `SubscriptionView.swift:34` — Guideline 3.1.2(c)
### 🟡 MEDIUM — Possible rejection
- [ ] TODO: Verify disclosure text is visually conspicuous — not in small gray font below the fold — manual UI review required
### 🟢 LOW — Best practice
- [ ] TODO: Follow Apple's subscription UI guidelines — use clear, high-contrast disclosure text near the CTA button, not in footnotes
Glob, Grep, Read
shared_context is provided by orchestrating agent.Run these in your project root to check manually:
# Check for auto-renewal disclosure text
!grep -rn "auto-renew\|automatically renew\|renews automatically" . --include="*.swift" -i
# Check for trial disclosure
!grep -rn "after.*trial\|trial ends\|then.*per\|free trial" . --include="*.swift" -i
# Check for actual price display (not just discount)
!grep -rn "displayPrice\|localizedPrice\|priceLocale\|price\b" . --include="*.swift" | grep -v "//"
# Check for discount-only display (missing actual price)
!grep -rn "% off\|save.*%\|discount" . --include="*.swift" -i
examples/swift/SubscriptionPatterns.swift
Find target files
**/*.swift, **/*.m, **/*.storyboard, **/*.xib, **/*.stringsSearch for rejection patterns
freeTrialPeriod\|trialPeriod\|free.*[Tt]rial\|freeTrial — trial UI elementssubscriptionPrice\|priceLocale\|localizedPrice\|displayPrice — price displayautoRenew\|auto-renew\|automatically renews\|autoRenewing — renewal disclosure text%.*off\|[Dd]iscount\|[Ss]ave.*% — discount claimsDetermine verdict
autoRenew/automatically renews text near it → 🟠 HIGH (Guideline 3.1.2(c))localizedPrice displayed + renewal terms present → 🟢 passReport
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Detects missing or insufficient in-app account deletion functionality required since June 30, 2022 under Guideline 5.1.1(v) for all apps that support account creation.
日本語の概要は準備中です。原文の説明を表示しています。
Detects feature patterns that require a higher age rating than commonly submitted, enforcing Guideline 2.3.6 which requires age ratings to accurately reflect the app's content and social features.
日本語の概要は準備中です。原文の説明を表示しています。
Detects apps that send user data to third-party AI systems without explicit in-app consent and disclosure, enforcing Guideline 5.1.2(i).
日本語の概要は準備中です。原文の説明を表示しています。
Detects placeholder content, stub UI, hardcoded test credentials, and non-production endpoints that signal an incomplete app to reviewers under Guideline 2.1.
日本語の概要は準備中です。原文の説明を表示しています。
Detects app name violations including names exceeding 30 characters, beta labels, Apple trademark terms, and version numbers in the display name, enforcing Guideline 2.3.7.
日本語の概要は準備中です。原文の説明を表示しています。
App Store rejection prevention for iOS/macOS apps. Covers privacy, UGC, IAP, metadata, layout, and quality checks based on real Apple rejection cases.
日本語の概要は準備中です。原文の説明を表示しています。