@leejungkiin/awkit 1.7.1 → 1.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/bin/awk.js +576 -84
  2. package/core/CLAUDE.md +1 -1
  3. package/core/GEMINI.md +148 -167
  4. package/core/GEMINI.md.bak +149 -116
  5. package/core/skill-runtime-manifest.json +3 -0
  6. package/docs/Claude Fable 5.md +3826 -0
  7. package/docs/android_kotlin_system_instruction.md +210 -0
  8. package/docs/brainstorm_ponytail_integration.md +146 -0
  9. package/docs/brainstorm_smart_setup.md +113 -0
  10. package/docs/deep-research-report (1).md +293 -0
  11. package/docs/history/GEMINI.v1.md +135 -0
  12. package/docs/history/brainstorm_antigravity_unified_architecture.v1.md +105 -0
  13. package/docs/history/implementation_plan.v1.md +58 -0
  14. package/package.json +4 -1
  15. package/scripts/artifact-storage.js +130 -0
  16. package/scripts/automation-gate.js +35 -2
  17. package/scripts/claude-plan.js +76 -0
  18. package/scripts/dependency-manager.js +210 -0
  19. package/scripts/exec-rtk.js +11 -5
  20. package/scripts/i18n-helper.js +381 -0
  21. package/scripts/multi-model-pipeline.js +144 -0
  22. package/skill-packs/mobile-ios/pack.json +4 -2
  23. package/skill-packs/reverse-engineering/pack.json +1 -0
  24. package/skills/CATALOG.md +20 -0
  25. package/skills/GEMINI.md +9 -1
  26. package/skills/TRIGGER_INDEX.md +10 -0
  27. package/skills/ai-music/SKILL.md +275 -0
  28. package/skills/android-re-analyzer/SKILL.md +238 -0
  29. package/skills/android-re-analyzer/references/api-extraction-patterns.md +119 -0
  30. package/skills/android-re-analyzer/references/call-flow-analysis.md +176 -0
  31. package/skills/android-re-analyzer/references/fernflower-usage.md +115 -0
  32. package/skills/android-re-analyzer/references/jadx-usage.md +116 -0
  33. package/skills/android-re-analyzer/references/setup-guide.md +221 -0
  34. package/skills/android-re-analyzer/scripts/check-deps.sh +129 -0
  35. package/skills/android-re-analyzer/scripts/decompile.sh +375 -0
  36. package/skills/android-re-analyzer/scripts/find-api-calls.sh +118 -0
  37. package/skills/android-re-analyzer/scripts/install-dep.sh +448 -0
  38. package/skills/animal-island-ui-style/SKILL.md +1450 -0
  39. package/skills/app-store-review-agent/SKILL.md +164 -0
  40. package/skills/app-store-review-agent/references/guidelines/README.md +154 -0
  41. package/skills/app-store-review-agent/references/guidelines/by-app-type/ai_apps.md +37 -0
  42. package/skills/app-store-review-agent/references/guidelines/by-app-type/all_apps.md +50 -0
  43. package/skills/app-store-review-agent/references/guidelines/by-app-type/crypto_finance.md +31 -0
  44. package/skills/app-store-review-agent/references/guidelines/by-app-type/games.md +31 -0
  45. package/skills/app-store-review-agent/references/guidelines/by-app-type/health_fitness.md +31 -0
  46. package/skills/app-store-review-agent/references/guidelines/by-app-type/kids.md +27 -0
  47. package/skills/app-store-review-agent/references/guidelines/by-app-type/macos.md +38 -0
  48. package/skills/app-store-review-agent/references/guidelines/by-app-type/social_ugc.md +32 -0
  49. package/skills/app-store-review-agent/references/guidelines/by-app-type/subscription_iap.md +34 -0
  50. package/skills/app-store-review-agent/references/guidelines/by-app-type/vpn.md +18 -0
  51. package/skills/app-store-review-agent/references/rules/design/minimum_functionality.md +96 -0
  52. package/skills/app-store-review-agent/references/rules/design/sign_in_with_apple.md +54 -0
  53. package/skills/app-store-review-agent/references/rules/entitlements/unused_entitlements.md +83 -0
  54. package/skills/app-store-review-agent/references/rules/metadata/accurate_metadata.md +54 -0
  55. package/skills/app-store-review-agent/references/rules/metadata/apple_trademark.md +99 -0
  56. package/skills/app-store-review-agent/references/rules/metadata/china_storefront.md +72 -0
  57. package/skills/app-store-review-agent/references/rules/metadata/competitor_terms.md +56 -0
  58. package/skills/app-store-review-agent/references/rules/metadata/subscription_metadata.md +81 -0
  59. package/skills/app-store-review-agent/references/rules/privacy/privacy_manifest.md +84 -0
  60. package/skills/app-store-review-agent/references/rules/privacy/unnecessary_data.md +60 -0
  61. package/skills/app-store-review-agent/references/rules/subscription/misleading_pricing.md +63 -0
  62. package/skills/app-store-review-agent/references/rules/subscription/missing_tos_pp.md +54 -0
  63. package/skills/awf-ponytail/SKILL.md +91 -0
  64. package/skills/awf-ponytail-review/SKILL.md +67 -0
  65. package/skills/awf-session-restore/SKILL.md +3 -3
  66. package/skills/brainstorm-agent/SKILL.md +11 -2
  67. package/skills/brainstorm-agent/templates/brief-template.md +8 -0
  68. package/skills/claude-planner/SKILL.md +47 -0
  69. package/skills/code-review/SKILL.md +87 -0
  70. package/skills/expo-game-development/SKILL.md +163 -0
  71. package/skills/flutter/LICENSE.txt +202 -0
  72. package/skills/flutter/SKILL.md +127 -0
  73. package/skills/flutter-project-creater/LICENSE.txt +202 -0
  74. package/skills/flutter-project-creater/SKILL.md +106 -0
  75. package/skills/game-developer/SKILL.md +163 -0
  76. package/skills/game-developer/references/ecs-patterns.md +501 -0
  77. package/skills/game-developer/references/multiplayer-networking.md +475 -0
  78. package/skills/game-developer/references/performance-optimization.md +422 -0
  79. package/skills/game-developer/references/unity-patterns.md +271 -0
  80. package/skills/game-developer/references/unreal-cpp.md +352 -0
  81. package/skills/generate-gui-assets/SKILL.md +305 -0
  82. package/skills/generate-gui-assets/agents/openai.yaml +4 -0
  83. package/skills/generate-gui-assets/references/catalog-schema.md +58 -0
  84. package/skills/generate-gui-assets/references/extraction-techniques.md +21 -0
  85. package/skills/generate-gui-assets/references/prompt-patterns.md +58 -0
  86. package/skills/generate-gui-assets/scripts/__pycache__/clean_chroma_edges.cpython-311.pyc +0 -0
  87. package/skills/generate-gui-assets/scripts/build_gui_contact_sheet.py +51 -0
  88. package/skills/generate-gui-assets/scripts/clean_chroma_edges.py +262 -0
  89. package/skills/generate-gui-assets/scripts/copy_approved_icons.py +64 -0
  90. package/skills/generate-gui-assets/scripts/prepare_gui_asset_run.py +91 -0
  91. package/skills/generate-gui-assets/scripts/suggest_grid_options.py +63 -0
  92. package/skills/generate-gui-assets/scripts/validate_gui_catalog.py +50 -0
  93. package/skills/godot-game-development/SKILL.md +142 -0
  94. package/skills/hatch-pet/LICENSE.txt +201 -0
  95. package/skills/hatch-pet/SKILL.md +420 -0
  96. package/skills/hatch-pet/agents/openai.yaml +4 -0
  97. package/skills/hatch-pet/references/animation-rows.md +29 -0
  98. package/skills/hatch-pet/references/codex-pet-contract.md +35 -0
  99. package/skills/hatch-pet/references/qa-rubric.md +60 -0
  100. package/skills/hatch-pet/scripts/__pycache__/clean_chroma_edges.cpython-311.pyc +0 -0
  101. package/skills/hatch-pet/scripts/clean_chroma_edges.py +262 -0
  102. package/skills/hatch-pet/scripts/compose_atlas.py +150 -0
  103. package/skills/hatch-pet/scripts/derive_running_left_from_running_right.py +143 -0
  104. package/skills/hatch-pet/scripts/extract_strip_frames.py +323 -0
  105. package/skills/hatch-pet/scripts/finalize_pet_run.py +382 -0
  106. package/skills/hatch-pet/scripts/generate_pet_images.py +287 -0
  107. package/skills/hatch-pet/scripts/inspect_frames.py +246 -0
  108. package/skills/hatch-pet/scripts/make_contact_sheet.py +96 -0
  109. package/skills/hatch-pet/scripts/package_custom_pet.py +108 -0
  110. package/skills/hatch-pet/scripts/pet_job_status.py +117 -0
  111. package/skills/hatch-pet/scripts/prepare_pet_run.py +673 -0
  112. package/skills/hatch-pet/scripts/queue_pet_repairs.py +172 -0
  113. package/skills/hatch-pet/scripts/record_imagegen_result.py +250 -0
  114. package/skills/hatch-pet/scripts/render_animation_videos.py +134 -0
  115. package/skills/hatch-pet/scripts/render_animation_videos.sh +5 -0
  116. package/skills/hatch-pet/scripts/validate_atlas.py +139 -0
  117. package/skills/i18n-orchestrator/SKILL.md +37 -0
  118. package/skills/ios-simulator-skill/SKILL.md +390 -0
  119. package/skills/ios-simulator-skill/scripts/accessibility_audit.py +300 -0
  120. package/skills/ios-simulator-skill/scripts/app_launcher.py +326 -0
  121. package/skills/ios-simulator-skill/scripts/app_state_capture.py +400 -0
  122. package/skills/ios-simulator-skill/scripts/appearance.py +385 -0
  123. package/skills/ios-simulator-skill/scripts/build_and_test.py +348 -0
  124. package/skills/ios-simulator-skill/scripts/clipboard.py +103 -0
  125. package/skills/ios-simulator-skill/scripts/common/__init__.py +61 -0
  126. package/skills/ios-simulator-skill/scripts/common/cache_utils.py +289 -0
  127. package/skills/ios-simulator-skill/scripts/common/device_utils.py +462 -0
  128. package/skills/ios-simulator-skill/scripts/common/env_config.py +35 -0
  129. package/skills/ios-simulator-skill/scripts/common/hang_pipeline.py +862 -0
  130. package/skills/ios-simulator-skill/scripts/common/hang_sessions.py +490 -0
  131. package/skills/ios-simulator-skill/scripts/common/idb_utils.py +180 -0
  132. package/skills/ios-simulator-skill/scripts/common/screenshot_utils.py +338 -0
  133. package/skills/ios-simulator-skill/scripts/container.py +668 -0
  134. package/skills/ios-simulator-skill/scripts/gesture.py +394 -0
  135. package/skills/ios-simulator-skill/scripts/hang_watcher.py +1533 -0
  136. package/skills/ios-simulator-skill/scripts/keyboard.py +391 -0
  137. package/skills/ios-simulator-skill/scripts/localization_audit.py +483 -0
  138. package/skills/ios-simulator-skill/scripts/location.py +467 -0
  139. package/skills/ios-simulator-skill/scripts/log_monitor.py +493 -0
  140. package/skills/ios-simulator-skill/scripts/model_inspector.py +645 -0
  141. package/skills/ios-simulator-skill/scripts/navigator.py +461 -0
  142. package/skills/ios-simulator-skill/scripts/privacy_manager.py +310 -0
  143. package/skills/ios-simulator-skill/scripts/push_notification.py +240 -0
  144. package/skills/ios-simulator-skill/scripts/screen_mapper.py +296 -0
  145. package/skills/ios-simulator-skill/scripts/sim_health_check.sh +245 -0
  146. package/skills/ios-simulator-skill/scripts/sim_list.py +299 -0
  147. package/skills/ios-simulator-skill/scripts/simctl_boot.py +312 -0
  148. package/skills/ios-simulator-skill/scripts/simctl_create.py +316 -0
  149. package/skills/ios-simulator-skill/scripts/simctl_delete.py +357 -0
  150. package/skills/ios-simulator-skill/scripts/simctl_erase.py +351 -0
  151. package/skills/ios-simulator-skill/scripts/simctl_shutdown.py +290 -0
  152. package/skills/ios-simulator-skill/scripts/simulator_selector.py +375 -0
  153. package/skills/ios-simulator-skill/scripts/status_bar.py +250 -0
  154. package/skills/ios-simulator-skill/scripts/test_recorder.py +323 -0
  155. package/skills/ios-simulator-skill/scripts/visual_diff.py +235 -0
  156. package/skills/ios-simulator-skill/scripts/xcode/__init__.py +13 -0
  157. package/skills/ios-simulator-skill/scripts/xcode/builder.py +397 -0
  158. package/skills/ios-simulator-skill/scripts/xcode/cache.py +204 -0
  159. package/skills/ios-simulator-skill/scripts/xcode/config.py +178 -0
  160. package/skills/ios-simulator-skill/scripts/xcode/reporter.py +343 -0
  161. package/skills/ios-simulator-skill/scripts/xcode/xcresult.py +451 -0
  162. package/skills/ios-visual-qa-strategist/SKILL.md +111 -0
  163. package/skills/ios-visual-qa-strategist/agents/openai.yaml +4 -0
  164. package/skills/ios-visual-qa-strategist/references/ios-tool-selection.md +61 -0
  165. package/skills/ios-visual-qa-strategist/references/minimal-capture-policy.md +56 -0
  166. package/skills/ios-visual-qa-strategist/references/visual-reasoning-heuristics.md +53 -0
  167. package/skills/orchestrator/SKILL.md +0 -20
  168. package/skills/persistent-storage/SKILL.md +55 -0
  169. package/skills/short-maker/SKILL.md +23 -0
  170. package/skills/short-maker/scripts/effects.js +56 -0
  171. package/skills/short-maker/scripts/shortmaker-bridge.js +332 -0
  172. package/skills/short-maker/scripts/videomix.js +601 -0
  173. package/skills/short-maker/templates/hyperframes/cinematic-character.template.html +172 -0
  174. package/skills/short-maker/templates/hyperframes/index.template.html +194 -0
  175. package/skills/smali-to-kotlin/SKILL.md +128 -0
  176. package/skills/smali-to-kotlin/examples/getting-started/tech-stack.md +58 -0
  177. package/skills/smali-to-kotlin/examples/pipeline/data-ui-parity.md +118 -0
  178. package/skills/smali-to-kotlin/examples/pipeline/scanner-and-bootstrap.md +106 -0
  179. package/skills/smali-to-kotlin/library-patterns.md +189 -0
  180. package/skills/smali-to-kotlin/phase-0-discovery.md +128 -0
  181. package/skills/smali-to-kotlin/phase-1-architecture.md +166 -0
  182. package/skills/smali-to-kotlin/phase-2-blueprint-ui.md +347 -0
  183. package/skills/smali-to-kotlin/phase-2-blueprint.md +228 -0
  184. package/skills/smali-to-kotlin/phase-3-build.md +248 -0
  185. package/skills/smali-to-kotlin/phase-3-logic-build.md +268 -0
  186. package/skills/smali-to-kotlin/smali-reading-guide.md +310 -0
  187. package/skills/smali-to-kotlin/templates/app-map.md +101 -0
  188. package/skills/smali-to-kotlin/templates/architecture.md +142 -0
  189. package/skills/smali-to-kotlin/templates/blueprint.md +145 -0
  190. package/skills/spec-gate/SKILL.md +6 -2
  191. package/skills/symphony-enforcer/SKILL.md +8 -0
  192. package/skills/symphony-enforcer/examples/mindful-stop.md +2 -0
  193. package/skills/symphony-enforcer/examples/three-phase.md +16 -0
  194. package/skills/symphony-enforcer/examples/trigger-points.md +7 -1
  195. package/skills/unity-game-development/SKILL.md +231 -0
  196. package/skills/video-edit/SKILL.md +36 -0
  197. package/skills/video-edit/scripts/video_edit.py +324 -0
  198. package/templates/project-identity/android.json +2 -2
  199. package/templates/project-identity/backend-nestjs.json +2 -2
  200. package/templates/project-identity/expo.json +2 -2
  201. package/templates/project-identity/ios.json +2 -2
  202. package/templates/project-identity/web-nextjs.json +2 -2
  203. package/templates/setup-mapping.json +48 -0
  204. package/templates/specs/design-template.md +161 -71
  205. package/templates/specs/requirements-template.md +65 -133
  206. package/templates/specs/task-spec-template.xml +3 -0
  207. package/workflows/_uncategorized/critic.md +40 -0
  208. package/workflows/_uncategorized/git-rebase-flow.md +81 -0
  209. package/workflows/_uncategorized/image-gen.md +118 -0
  210. package/workflows/_uncategorized/multi-model-pipeline.md +60 -0
  211. package/workflows/_uncategorized/pixel-gen.md +86 -0
  212. package/workflows/_uncategorized/pixel-setup.md +90 -0
  213. package/workflows/_uncategorized/ponytail-review.md +59 -0
  214. package/workflows/_uncategorized/reverse-android-build.md +222 -0
  215. package/workflows/_uncategorized/reverse-android-design.md +139 -0
  216. package/workflows/_uncategorized/reverse-android-discover.md +150 -0
  217. package/workflows/_uncategorized/reverse-android-scan.md +158 -0
  218. package/workflows/_uncategorized/reverse-android.md +143 -0
  219. package/workflows/_uncategorized/reverse-ios-build.md +240 -0
  220. package/workflows/_uncategorized/reverse-ios-design.md +112 -0
  221. package/workflows/_uncategorized/reverse-ios-discover.md +120 -0
  222. package/workflows/_uncategorized/reverse-ios-scan.md +155 -0
  223. package/workflows/_uncategorized/reverse-ios.md +152 -0
  224. package/workflows/_uncategorized/safety-router.md +34 -0
  225. package/workflows/_uncategorized/teach.md +89 -0
  226. package/workflows/_uncategorized/verify-ui.md +53 -0
  227. package/workflows/_uncategorized/visualize-screenshots.md +34 -0
  228. package/workflows/ads/ads-analyst.md +201 -0
  229. package/workflows/ads/ads-audit.md +106 -0
  230. package/workflows/ads/ads-optimize.md +97 -0
  231. package/workflows/ads/ads-targeting.md +241 -0
  232. package/workflows/ads/adsExpert.md +160 -0
  233. package/workflows/ads/smali-ads-config.md +400 -0
  234. package/workflows/ads/smali-ads-flow.md +331 -0
  235. package/workflows/ads/smali-ads-interstitial.md +377 -0
  236. package/workflows/ads/smali-ads-native.md +382 -0
  237. package/workflows/context/teach.md +89 -0
  238. package/workflows/gitnexus.md +8 -8
  239. package/workflows/lifecycle/brainstorm.md +43 -0
  240. package/workflows/lifecycle/code.md +5 -0
  241. package/workflows/lifecycle/init.md +23 -5
  242. package/workflows/lifecycle/multi-model-pipeline.md +60 -0
  243. package/workflows/quality/ponytail-review.md +59 -0
  244. package/workflows/roles/critic.md +40 -0
  245. package/workflows/roles/safety-router.md +34 -0
@@ -0,0 +1,18 @@
1
+ # Checklist: VPN & Networking Apps
2
+
3
+ Guidelines specifically applying to VPN, proxy, and network management apps.
4
+
5
+ ## Critical (Will Reject)
6
+
7
+ - [ ] **5.4** — Must use the NEVPNManager API
8
+ - [ ] **5.4** — Must be from developers enrolled as an organization
9
+ - [ ] **5.4** — Must not collect any user data
10
+ - [ ] **5.4** — Must not use VPN profiles to block ads, redirect traffic for monetization, or collect/sell data
11
+ - [ ] **5.4** — Must clearly state what data is collected and how it is used on-screen before any data access
12
+
13
+ ## Important
14
+
15
+ - [ ] **5.1.1** — Privacy policy required
16
+ - [ ] **2.5.5** — Fully functional on IPv6-only networks
17
+ - [ ] **2.3.1** — All app functionality documented in review notes
18
+ - [ ] **3.1.1** — Premium VPN features must use IAP (not external payment for digital service)
@@ -0,0 +1,96 @@
1
+ # Rule: Minimum Functionality
2
+ - **Guideline**: 4.2
3
+ - **Severity**: REJECTION
4
+ - **Category**: design
5
+
6
+ ## What to Check
7
+
8
+ Apple requires apps to provide "valuable utility or entertainment" and be more than a repackaged website, simple wrapper, or thin shell. Apps rejected under 4.2 typically:
9
+
10
+ - Have only 1-2 screens with minimal interactivity
11
+ - Are essentially a WebView wrapping a website
12
+ - Provide no functionality beyond what Safari offers
13
+ - Are a simple collection of links or RSS feed
14
+ - Consist primarily of marketing material or a product catalog
15
+ - Are a book or game guide that should be on Apple Books instead
16
+ - Are template-generated apps with no unique content
17
+
18
+ ### Related Sub-Guidelines
19
+
20
+ | Guideline | What It Covers |
21
+ |-----------|---------------|
22
+ | 4.2.1 | ARKit apps must provide rich integrated AR — not just dropping a model |
23
+ | 4.2.2 | Not primarily marketing materials, ads, web clippings, or link aggregators |
24
+ | 4.2.3(i) | App must work on its own without requiring another app |
25
+ | 4.2.3(ii) | Disclose size of additional required downloads before user proceeds |
26
+ | 4.2.6 | Template/app-generator apps rejected unless submitted by content provider |
27
+
28
+ ## How to Detect
29
+
30
+ ### Code-Level Signals
31
+
32
+ ```bash
33
+ # Check if app is primarily a WebView wrapper
34
+ grep -rn "WKWebView\|UIWebView\|WebView\|SFSafariViewController" --include="*.swift" --include="*.m" .
35
+
36
+ # Count total view controllers / screens
37
+ grep -rn "class.*:.*UIViewController\|class.*:.*View {" --include="*.swift" . | wc -l
38
+
39
+ # Check for meaningful model/data layer
40
+ find . -name "*.swift" -path "*/Model*" -o -name "*.swift" -path "*/Models*" | wc -l
41
+
42
+ # Check if app has any local data persistence
43
+ grep -rn "CoreData\|SwiftData\|UserDefaults\|Realm\|SQLite\|KeychainSwift" --include="*.swift" .
44
+ ```
45
+
46
+ ### Red Flags
47
+
48
+ - **< 3 unique screens** -> Very likely to trigger 4.2
49
+ - **Single WebView** loading an external URL as the primary experience
50
+ - **No model layer** — no local data structures beyond what the web provides
51
+ - **No offline functionality** — completely dependent on network
52
+ - **Only static content** — no user interaction beyond scrolling
53
+
54
+ ### Description Check
55
+ If the app description is very short (< 50 words) or struggles to articulate what the app does beyond what a website offers, it may lack sufficient functionality.
56
+
57
+ ## Resolution
58
+
59
+ 1. **Add unique features** that go beyond what a website offers:
60
+ - Offline mode / local data caching
61
+ - Push notifications for relevant events
62
+ - Device-specific integrations (camera, location, HealthKit, etc.)
63
+ - User-generated content or personalization
64
+ - Native UI patterns (swipe actions, drag & drop, widgets)
65
+
66
+ 2. **If your app is a web wrapper**, consider:
67
+ - Adding native authentication (Sign in with Apple, biometrics)
68
+ - Implementing native navigation instead of web-based nav
69
+ - Adding local storage so the app works offline
70
+ - Integrating Apple frameworks (Share Sheet, Spotlight, Shortcuts)
71
+
72
+ 3. **In your review notes**, clearly explain:
73
+ - What the app does that a website can't
74
+ - The target audience and use case
75
+ - Any features that might not be immediately obvious to the reviewer
76
+
77
+ ## Example Rejection
78
+
79
+ ```
80
+ Guideline 4.2 - Design - Minimum Functionality
81
+
82
+ The usefulness of the app is limited by the minimal functionality it currently
83
+ provides.
84
+
85
+ Specifically, the app does not provide sufficient content and features to be
86
+ useful, unique, and "app-like."
87
+
88
+ Apps should provide valuable utility or entertainment, draw people in by
89
+ offering compelling capabilities or content, or enable people to do something
90
+ they couldn't do before or in a way they couldn't do it before.
91
+
92
+ Next Steps
93
+
94
+ We encourage you to review your app concept and incorporate different content
95
+ and features that are in compliance with the App Review Guidelines.
96
+ ```
@@ -0,0 +1,54 @@
1
+ # Rule: Sign in with Apple UX Violations
2
+ - **Guideline**: 4.0 – Design
3
+ - **Severity**: REJECTION
4
+ - **Category**: design
5
+
6
+ ## What to Check
7
+ If the app offers **Sign in with Apple** (SIWA), the implementation must follow Apple's design and UX requirements. The most common violations:
8
+
9
+ ### Common Violations
10
+ 1. **Asking for name/email after SIWA** — The Authentication Services framework already provides name and email (if the user chooses to share). Do not prompt for this information again.
11
+ 2. **Non-standard button styling** — The SIWA button must use Apple's provided `ASAuthorizationAppleIDButton` or equivalent, not a custom-designed button.
12
+ 3. **Hidden or de-emphasized SIWA** — If other social logins are shown (Google, Facebook, etc.), SIWA must be equally prominent.
13
+ 4. **Not handling the "Hide My Email" relay** — The app must work with Apple's relay email addresses (`*@privaterelay.appleid.com`).
14
+
15
+ ## How to Detect
16
+
17
+ ### Check for post-SIWA data requests
18
+ ```bash
19
+ # Find SIWA implementation
20
+ grep -rn "ASAuthorizationAppleIDProvider\|SignInWithApple\|appleIDCredential\|apple.*sign.*in" --include="*.swift" --include="*.dart" .
21
+
22
+ # Check if name/email is requested AFTER sign-in
23
+ grep -rn "askForName\|askForEmail\|nameTextField\|emailTextField\|profileSetup\|completeProfile" --include="*.swift" --include="*.dart" .
24
+ ```
25
+
26
+ ### Check for relay email handling
27
+ ```bash
28
+ # Ensure the app doesn't reject relay emails
29
+ grep -rn "privaterelay.appleid.com\|@privaterelay\|email.*validation\|isValid.*email" --include="*.swift" --include="*.dart" .
30
+ ```
31
+
32
+ ### Visual Inspection
33
+ 1. Sign in with Apple using the "Hide My Email" option
34
+ 2. After authenticating, check if the app:
35
+ - Shows a form asking for your name (❌ violation)
36
+ - Shows a form asking for your email (❌ violation)
37
+ - Immediately proceeds to the main app (✅ correct)
38
+
39
+ ## Resolution
40
+ 1. **Use the data from SIWA credentials**: `ASAuthorizationAppleIDCredential` provides `fullName` and `email` — cache these on first use
41
+ 2. **Don't re-ask for provided data**: If the user shared their name/email via SIWA, use it directly
42
+ 3. **Handle missing data gracefully**: If the user chose to hide email, use the relay address; if they hid their name, use a default
43
+ 4. **Use standard SIWA button**: Use `ASAuthorizationAppleIDButton` (Swift) or `sign_in_with_apple` package (Flutter)
44
+
45
+ ## Example Rejection
46
+ > **Guideline 4.0 - Design**
47
+ >
48
+ > Your app offers Sign in with Apple as a login option but does not follow the design and user experience requirements for Sign in with Apple. Specifically:
49
+ >
50
+ > - Your app requires users to provide their name and/or email address after using Sign in with Apple. This information is already provided by the Authentication Services framework.
51
+ >
52
+ > Next Steps
53
+ >
54
+ > Please revise the Sign in with Apple experience in your app to address the issues we identified above.
@@ -0,0 +1,83 @@
1
+ # Rule: Unused or Unnecessary Entitlements
2
+ - **Guideline**: 2.4.5(i) – Performance
3
+ - **Severity**: REJECTION (info request, blocks review)
4
+ - **Category**: entitlements
5
+
6
+ ## What to Check
7
+ Apps should only declare entitlements that are **actively used** by the app. Apple will request justification for any entitlement that doesn't have matching functionality in the app. If you can't justify an entitlement, it must be removed.
8
+
9
+ ### Commonly Flagged Entitlements (macOS)
10
+ - `com.apple.security.network.server` — App acts as a network server
11
+ - `com.apple.security.network.client` — App makes outbound network requests
12
+ - `com.apple.security.files.downloads.read-only` — App reads the Downloads folder
13
+ - `com.apple.security.files.downloads.read-write` — App writes to Downloads
14
+ - `com.apple.security.files.user-selected.read-only` — App reads user-selected files
15
+ - `com.apple.security.files.user-selected.read-write` — App writes to user-selected files
16
+ - `com.apple.security.files.bookmarks.app-scope` — App uses security-scoped bookmarks
17
+ - `com.apple.security.temporary-exception.*` — Temporary exceptions (will draw scrutiny)
18
+
19
+ ### iOS Capabilities That Add Entitlements
20
+ - Push Notifications → `aps-environment`
21
+ - HealthKit → `com.apple.developer.healthkit`
22
+ - Sign in with Apple → `com.apple.developer.applesignin`
23
+ - iCloud → `com.apple.developer.icloud-*`
24
+
25
+ ## How to Detect
26
+
27
+ ### Find entitlements files
28
+ ```bash
29
+ # Find all entitlements files
30
+ find . -name "*.entitlements" -not -path "./.build/*"
31
+ ```
32
+
33
+ ### Parse entitlements
34
+ ```bash
35
+ # List all declared entitlements
36
+ plutil -p *.entitlements
37
+ # or
38
+ cat *.entitlements
39
+ ```
40
+
41
+ ### Cross-reference with code usage
42
+ For each entitlement, verify the app actually uses the capability:
43
+
44
+ ```bash
45
+ # Network server — is the app running a local server?
46
+ grep -rn "NWListener\|GCDWebServer\|Swifter\|Vapor\|HttpServer\|startServer" --include="*.swift" .
47
+
48
+ # Downloads folder access — does the app read/write Downloads?
49
+ grep -rn "Downloads\|downloadsDirectory\|FileManager.*downloads" --include="*.swift" .
50
+
51
+ # HealthKit — is HealthKit actually used?
52
+ grep -rn "HKHealthStore\|HealthKit\|health_kit" --include="*.swift" --include="*.dart" .
53
+ ```
54
+
55
+ ### Automated audit
56
+ ```bash
57
+ # List entitlements from the built app
58
+ codesign -d --entitlements :- /path/to/YourApp.app
59
+ ```
60
+
61
+ ## Resolution
62
+ 1. **Remove unused entitlements**: Open the `.entitlements` file in Xcode and remove keys for capabilities you don't use
63
+ 2. **Remove unused capabilities**: In Xcode → Target → Signing & Capabilities, remove capabilities you don't need
64
+ 3. **If the entitlement IS needed**: Reply to Apple in App Store Connect explaining how and where the app uses each flagged entitlement
65
+ 4. **Rebuild and resubmit**: After removing entitlements, Developer Reject the current submission, rebuild, and upload a new binary
66
+
67
+ ## Example Rejection
68
+ > **Guideline 2.4.5(i) - Performance**
69
+ >
70
+ > Issue Description
71
+ >
72
+ > In order to continue reviewing the app, we require additional information.
73
+ >
74
+ > The app uses one or more entitlements which do not appear to have matching functionality within the app. Please reply to this message in App Store Connect and describe how and where the app uses the following entitlements.
75
+ >
76
+ > ---
77
+ > • com.apple.security.network.server
78
+ > • com.apple.security.files.downloads.read-only
79
+ > ---
80
+ >
81
+ > Resources
82
+ >
83
+ > Learn more about Mac App Store requirements in guideline 2.4.5.
@@ -0,0 +1,54 @@
1
+ # Rule: App Preview Contains Device Frames
2
+ - **Guideline**: 2.3.4 – Performance – Accurate Metadata
3
+ - **Severity**: REJECTION
4
+ - **Category**: metadata
5
+
6
+ ## What to Check
7
+ App preview videos must only contain capture footage of the app running. They must **not** include:
8
+
9
+ - Device images or device frames (e.g., an iPhone bezel around the screen)
10
+ - Framing around the video screen capture
11
+ - Non-app content that obscures the app experience
12
+
13
+ > **Note**: This applies to **app preview videos**, not static screenshots. Static screenshots _may_ use device frames.
14
+
15
+ ## How to Detect
16
+
17
+ ### Manual Inspection
18
+ 1. Open App Store Connect -> your app version -> Previews and Screenshots
19
+ 2. Play each app preview video in full screen
20
+ 3. Check for:
21
+ - Device bezels or phone outlines visible in the video
22
+ - Borders, frames, or decorative elements around the screen capture
23
+ - Non-app scenes (e.g., lifestyle shots with a person holding a phone)
24
+
25
+ ### Check local preview assets (if stored in repo)
26
+ ```bash
27
+ # Find preview video files
28
+ find . -name "*.mp4" -o -name "*.mov" | grep -i "preview"
29
+
30
+ # Extract first frame for visual inspection (requires ffmpeg)
31
+ for preview in ./previews/*.mp4; do
32
+ ffmpeg -i "$preview" -vframes 1 -q:v 2 "${preview%.mp4}_frame.jpg"
33
+ done
34
+ ```
35
+
36
+ ## Resolution
37
+ 1. Re-record app previews using **only screen capture** (e.g., Xcode Simulator recording, QuickTime screen recording)
38
+ 2. Remove any device frame overlays from the video
39
+ 3. Narration and text overlays are allowed for clarity
40
+ 4. Upload via App Store Connect -> "View All Sizes in Media Manager"
41
+
42
+ ## Example Rejection
43
+ > **Guideline 2.3.4 - Performance - Accurate Metadata**
44
+ >
45
+ > The app preview includes content that does not sufficiently show the app in use. Specifically, the app preview:
46
+ >
47
+ > - Includes framing around the video screen capture.
48
+ > - Includes device images and/or device frames.
49
+ >
50
+ > App previews should allow users to see what the app does and how it will appear on their device when the preview is played in full screen.
51
+ >
52
+ > Next Steps
53
+ >
54
+ > To resolve this issue, revise the app preview to only use video screen captures of the app that may include narration and video or textual overlays for added clarity.
@@ -0,0 +1,99 @@
1
+ # Rule: Apple Trademark Violations
2
+ - **Guideline**: 5.2.5 – Legal – Intellectual Property
3
+ - **Severity**: REJECTION
4
+ - **Category**: metadata
5
+
6
+ ## What to Check
7
+ App metadata, icons, and screenshots must not include content confusingly similar to Apple products, services, or trademarks.
8
+
9
+ ### Flagged Patterns
10
+
11
+ **App Icon:**
12
+ - Apple device silhouettes or imagery (iPhone, iPad, Mac, Apple Watch)
13
+ - Apple logo or any variation of it
14
+ - Icons confusingly similar to Apple's own app icons
15
+
16
+ **App Name / Subtitle:**
17
+ - Using Apple product names as part of your app name (e.g., "iPhone Cleaner", "iPad Manager")
18
+ - Using Apple service names (e.g., "My iCloud Backup", "Siri Helper")
19
+
20
+ **Metadata Text:**
21
+ - Apple product names used as feature descriptors unnecessarily
22
+ - Phrases like "best app in the App Store" (using "App Store" generically)
23
+ - Terms like "iPhone app", "iPad edition" in subtitle or description
24
+
25
+ **Screenshots / Marketing:**
26
+ - Unauthorized 3D renders or simulations of Apple products
27
+ - Illustrations of Apple devices (unless for instructional use showing your app running)
28
+ - Apple device images placed alongside competitor product images
29
+ - Obscuring or exploiting the Apple logo on device images
30
+ - Die-cut promotions in the shape of an Apple product
31
+ - Using icons, logos, or images sourced directly from apple.com
32
+
33
+ ### Commonly Flagged Terms
34
+ - `iPhone`, `iPad`, `Mac`, `MacBook`, `Apple Watch`, `Apple TV`, `Vision Pro`
35
+ - `iMessage`, `FaceTime`, `Siri`, `AirDrop`, `iCloud`
36
+ - `App Store` (when used generically)
37
+ - `Apple` (when implying endorsement or association)
38
+
39
+ ## How to Detect
40
+
41
+ ### App Icon
42
+ - Visually inspect the app icon asset (`AppIcon.appiconset/`) for device silhouettes or Apple product imagery
43
+ - Check `Assets.xcassets/AppIcon.appiconset/Contents.json` for references
44
+
45
+ ### App Name (in project files)
46
+ ```bash
47
+ # Check Info.plist for Apple product terms in display name
48
+ grep -i "iphone\|ipad\|macbook\|apple watch\|apple tv\|imessage\|facetime\|siri\|icloud\|vision pro" **/Info.plist
49
+ ```
50
+
51
+ ### In source code and strings
52
+ ```bash
53
+ # Search localizable strings for Apple trademarks used inappropriately
54
+ grep -ri "iphone\|ipad\|macbook\|apple watch\|apple tv\|imessage\|facetime\|siri\|airdrop\|vision pro" --include="*.strings" --include="*.stringsdict" --include="*.xcstrings" .
55
+ ```
56
+
57
+ ### In local metadata (if fastlane or similar)
58
+ ```bash
59
+ grep -ri "iphone\|ipad\|macbook\|apple watch\|apple tv\|imessage\|facetime\|siri\|airdrop\|vision pro" ./fastlane/metadata/ ./metadata/ 2>/dev/null
60
+ ```
61
+
62
+ ### Screenshots
63
+ - Visually inspect all screenshot assets for:
64
+ - Unauthorized Apple device renders (3D models, illustrations, die-cuts)
65
+ - Apple logo exploitation (centering on or enhancing the Apple logo)
66
+ - Apple devices shown next to competitor devices (Samsung, Google, etc.)
67
+ - **Allowed**: Showing your app running on a real Apple device in screenshots, as long as the device illustrates natural use and is not the focal point
68
+
69
+ ### In App Store Connect (manual check)
70
+ Verify app name, subtitle, and description do not use Apple product terms inappropriately.
71
+
72
+ ## Resolution
73
+ 1. **App Icon**: Remove any Apple device imagery; use abstract or product-specific design instead
74
+ 2. **App Name**: Remove Apple product names from app name/subtitle:
75
+ - "iPhone Cleaner Pro" -> "Phone Cleaner Pro"
76
+ - "My iPad Manager" -> "My Tablet Manager"
77
+ 3. **Metadata**: Remove or rephrase Apple product references:
78
+ - "Works with iPhone" -> "Works with your phone" (if it's a universal claim)
79
+ - "Download on App Store" -> remove (users are already on the App Store)
80
+ - "Best Siri alternative" -> "Best voice assistant"
81
+ 4. **Screenshots**: Replace unauthorized renders with real device screenshots or remove device frames entirely
82
+ 5. **Apple device photos**: If showing an Apple device, ensure it shows your app in natural use; don't place alongside competitor products
83
+
84
+ ## Example Rejection
85
+ > **Guideline 5.2.5 - Legal - Intellectual Property**
86
+ >
87
+ > Issue Description
88
+ >
89
+ > The app's metadata includes content that is similar to designs or terms used for Apple products and services and may cause confusion for users. Specifically, your metadata includes:
90
+ >
91
+ > - iPhone device found in the application icon
92
+ >
93
+ > Next Steps
94
+ >
95
+ > To resolve this issue, remove images and terms that are confusingly similar to an Apple product or service from the app's metadata.
96
+ >
97
+ > Resources
98
+ >
99
+ > - Learn more about appropriate and inappropriate use of Apple trademarks in the Guidelines for Using Apple's Trademarks and Copyrights.
@@ -0,0 +1,72 @@
1
+ # Rule: AI Service References for China Storefront
2
+ - **Guideline**: 5 – Legal (Chinese DST Regulations)
3
+ - **Severity**: REJECTION
4
+ - **Category**: metadata
5
+
6
+ ## What to Check
7
+ Apps distributed on the **China mainland storefront** must not reference AI services that lack the required Chinese government permits (MIIT license). This applies to both **metadata** and **in-app functionality**.
8
+
9
+ ### Banned Terms (China Storefront)
10
+ - `ChatGPT`, `GPT-4`, `GPT-4o`, `GPT`
11
+ - `OpenAI`
12
+ - `Gemini` (Google), `Bard`
13
+ - `Claude`, `Anthropic`
14
+ - `Midjourney`, `DALL-E`, `DALL·E`
15
+ - `Copilot` (in AI context)
16
+ - `Stable Diffusion` (when referencing cloud API)
17
+ - Any **deep synthesis technology (DST)** service without a Chinese MIIT license
18
+
19
+ ### Metadata Fields to Check
20
+ - App name
21
+ - Subtitle
22
+ - Promotional text
23
+ - App description
24
+ - Keywords
25
+ - Screenshots (text overlays)
26
+ - What's New
27
+
28
+ ## How to Detect
29
+
30
+ ### In source code and strings
31
+ ```bash
32
+ # Search for banned AI terms in localizable strings
33
+ grep -ri "chatgpt\|openai\|gpt-4\|gemini\|claude\|anthropic\|midjourney\|dall-e\|copilot\|bard" --include="*.strings" --include="*.stringsdict" --include="*.xcstrings" .
34
+
35
+ # Search in source code (hardcoded strings)
36
+ grep -rn "chatgpt\|openai\|gpt-4\|gemini\|claude\|anthropic\|midjourney\|dall-e\|copilot\|bard" --include="*.swift" --include="*.m" .
37
+ ```
38
+
39
+ ### In local metadata (if fastlane or similar)
40
+ ```bash
41
+ # Check all locales — Apple may flag ANY locale if the app is distributed in China
42
+ grep -ri "chatgpt\|openai\|gpt-4\|gemini\|claude\|anthropic\|midjourney\|dall-e" ./fastlane/metadata/ ./metadata/ 2>/dev/null
43
+ ```
44
+
45
+ ### In App Store Connect (manual check)
46
+ Verify that app name, subtitle, description, keywords, promotional text, What's New, and screenshot text overlays do not contain banned AI terms across ALL locales. Also verify whether China mainland is included in the app's availability settings.
47
+
48
+ ## Resolution
49
+
50
+ ### Option A: Remove references (keep China distribution)
51
+ 1. Remove all AI service brand names from metadata across **all locales**
52
+ 2. Use generic terms: "AI-powered" or "smart assistant" instead of brand names
53
+ 3. Suppress AI functionality specifically for the China storefront build
54
+ 4. Update Review Notes to confirm AI functionality is suppressed in China
55
+
56
+ ### Option B: Exclude China storefront
57
+ 1. In App Store Connect -> Pricing and Availability -> Deselect "China mainland"
58
+ 2. Keep AI references in metadata for all other storefronts
59
+
60
+ ### Option C: Obtain compliance
61
+ Seek professional advice on compliance with the *Administrative Provisions on Deep Synthesis of Internet-based Information Services* to obtain the required MIIT permits.
62
+
63
+ ## Example Rejection
64
+ > **Guideline 5 - Legal**
65
+ >
66
+ > Issue Description
67
+ >
68
+ > As you may know, the Chinese government has been tightening regulations associated with deep synthesis technologies (DST) and generative AI services, including ChatGPT. DST must fulfill permitting requirements to operate in China, including securing a license from the Ministry of Industry and Information Technology (MIIT) if the services are provided while connected to the Internet.
69
+ >
70
+ > Based on our review, the app appears to be associated with ChatGPT, which does not have requisite permits to operate in China. Specifically, the app's metadata includes the following references to ChatGPT and/or OpenAI: OpenAI.
71
+ >
72
+ > Accordingly, pursuant to local Chinese law, this functionality must be deactivated in the version of the app that you make available on the China App Store and all references to ChatGPT or OpenAI must be removed from metadata fields such as app name, subtitle, promotional text, app description, and screenshots.
@@ -0,0 +1,56 @@
1
+ # Rule: Competitor Platform Terms in Metadata
2
+ - **Guideline**: 2.3.1 – Performance – Accurate Metadata
3
+ - **Severity**: REJECTION
4
+ - **Category**: metadata
5
+
6
+ ## What to Check
7
+ App Store metadata (name, subtitle, description, keywords, promotional text, What's New) must not reference competing platforms or brands.
8
+
9
+ ### Banned Terms
10
+ - `Android`, `Google Play`, `Google Play Store`
11
+ - `Samsung`, `Galaxy Store`
12
+ - `Huawei`, `AppGallery`
13
+ - `Amazon Appstore`
14
+ - `Windows Store`, `Microsoft Store`
15
+ - `APK`, `sideload`
16
+
17
+ ## How to Detect
18
+
19
+ ### In Xcode project files
20
+ ```bash
21
+ # Check Info.plist and project files for competitor terms
22
+ grep -ri "android\|google play\|samsung\|huawei\|apk\|amazon appstore\|windows store\|microsoft store" *.xcodeproj/project.pbxproj **/Info.plist
23
+ ```
24
+
25
+ ### In source code (user-facing strings)
26
+ ```bash
27
+ # Search localizable strings and string catalogs
28
+ grep -ri "android\|google play\|samsung\|huawei\|apk\|amazon appstore\|windows store\|microsoft store" --include="*.strings" --include="*.stringsdict" --include="*.xcstrings" .
29
+
30
+ # Search hardcoded strings in source
31
+ grep -rn "android\|google play\|samsung\|huawei\|apk\|sideload" --include="*.swift" --include="*.m" .
32
+ ```
33
+
34
+ ### In local metadata (if fastlane or similar)
35
+ ```bash
36
+ grep -ri "android\|google play\|samsung\|huawei\|apk\|amazon appstore\|windows store\|microsoft store" ./fastlane/metadata/ ./metadata/ 2>/dev/null
37
+ ```
38
+
39
+ ### In App Store Connect (manual check)
40
+ Verify app name, subtitle, description, keywords, promotional text, and What's New text do not contain competitor platform references.
41
+
42
+ ## Resolution
43
+ 1. Remove all references to competing platforms from metadata fields
44
+ 2. Replace with generic terms:
45
+ - "Available on Android" -> "Available on multiple platforms"
46
+ - "Also on Google Play" -> remove entirely
47
+ - "Transfer from Android" -> "Transfer from your previous device"
48
+ 3. Check App Store Connect metadata manually for any remaining references
49
+
50
+ ## Example Rejection
51
+ > **Guideline 2.3.1 - Performance - Accurate Metadata**
52
+ >
53
+ > We noticed that your app's metadata includes references to other mobile platforms, which is not appropriate for the App Store. Specifically, the following content was found:
54
+ > - "Android" mentioned in the app description
55
+ >
56
+ > **Next Steps**: Remove all references to other mobile platforms from the app's metadata.
@@ -0,0 +1,81 @@
1
+ # Rule: Missing Subscription Metadata in App Store Listing
2
+ - **Guideline**: 3.1.2 – Business – Payments – Subscriptions
3
+ - **Severity**: REJECTION
4
+ - **Category**: metadata
5
+
6
+ ## What to Check
7
+ Apps offering **auto-renewable subscriptions** must include all of the following in both the app and App Store metadata:
8
+
9
+ ### Required in the App
10
+ - Title of auto-renewing subscription
11
+ - Length of subscription
12
+ - Price of subscription (and price per unit if appropriate)
13
+ - Functional link to **Privacy Policy**
14
+ - Functional link to **Terms of Use (EULA)**
15
+
16
+ ### Required in App Store Metadata
17
+ - **Privacy Policy URL** — Set in the Privacy Policy field in App Store Connect
18
+ - **Terms of Use (EULA)** — Either:
19
+ - A functional link in the **App Description**, OR
20
+ - A custom EULA added in the **EULA field** in App Store Connect
21
+ - If using Apple's standard EULA, include a link to it in the description
22
+
23
+ ## How to Detect
24
+
25
+ ### Check in-app subscription screens
26
+ ```bash
27
+ # Find subscription-related UI code
28
+ grep -rn "subscribe\|paywall\|purchase\|StoreKit\|RevenueCat\|Superwall" --include="*.swift" .
29
+
30
+ # Check if terms/privacy links exist in subscription UI
31
+ grep -rn "terms\|privacy\|eula\|TermsOfService\|PrivacyPolicy" --include="*.swift" .
32
+ ```
33
+
34
+ ### Check local metadata (if fastlane or similar)
35
+ ```bash
36
+ # Check if description contains ToS/EULA link
37
+ grep -i "terms of use\|terms of service\|terms and conditions\|eula\|end user license" ./fastlane/metadata/*/description.txt ./metadata/*/description.txt 2>/dev/null
38
+
39
+ # Look for actual URLs in descriptions
40
+ grep -oE "https?://[^ ]+" ./fastlane/metadata/*/description.txt ./metadata/*/description.txt 2>/dev/null
41
+ ```
42
+
43
+ ### In App Store Connect (manual check)
44
+ - App Information -> Privacy Policy URL field must not be empty
45
+ - App Information -> EULA field should have custom EULA or description should reference Apple's standard EULA
46
+
47
+ ### Check in-app subscription flow
48
+ Verify the app's subscription purchase screen includes:
49
+ - Subscription title and duration
50
+ - Price
51
+ - Tappable Privacy Policy link
52
+ - Tappable Terms of Use link
53
+ - "Restore Purchases" button
54
+
55
+ ## Resolution
56
+ 1. Add a Terms of Use / EULA link to the app description for **every locale**
57
+ 2. Add a Privacy Policy URL in App Store Connect -> App Information -> Privacy Policy URL
58
+ 3. Optionally, add a custom EULA in App Store Connect -> App Information -> EULA
59
+ 4. Ensure the in-app subscription screen shows all required information with working links
60
+
61
+ ### Description Template
62
+ Add this block at the bottom of your app description:
63
+ ```
64
+ Terms of Use: https://yourdomain.com/terms
65
+ Privacy Policy: https://yourdomain.com/privacy
66
+ ```
67
+
68
+ ## Example Rejection
69
+ > **Guideline 3.1.2 - Business - Payments - Subscriptions**
70
+ >
71
+ > Issue Description
72
+ >
73
+ > The submission did not include all the required information for apps offering auto-renewable subscriptions.
74
+ >
75
+ > The following information needs to be included in the App Store metadata:
76
+ >
77
+ > - A functional link to the Terms of Use (EULA). If you are using the standard Apple Terms of Use (EULA), include a link to the Terms of Use in the App Description. If you are using a custom EULA, add it in App Store Connect.
78
+ >
79
+ > Next Steps
80
+ >
81
+ > Update the App Store metadata to include the information specified above.