@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.
- package/bin/awk.js +576 -84
- package/core/CLAUDE.md +1 -1
- package/core/GEMINI.md +148 -167
- package/core/GEMINI.md.bak +149 -116
- package/core/skill-runtime-manifest.json +3 -0
- package/docs/Claude Fable 5.md +3826 -0
- package/docs/android_kotlin_system_instruction.md +210 -0
- package/docs/brainstorm_ponytail_integration.md +146 -0
- package/docs/brainstorm_smart_setup.md +113 -0
- package/docs/deep-research-report (1).md +293 -0
- package/docs/history/GEMINI.v1.md +135 -0
- package/docs/history/brainstorm_antigravity_unified_architecture.v1.md +105 -0
- package/docs/history/implementation_plan.v1.md +58 -0
- package/package.json +4 -1
- package/scripts/artifact-storage.js +130 -0
- package/scripts/automation-gate.js +35 -2
- package/scripts/claude-plan.js +76 -0
- package/scripts/dependency-manager.js +210 -0
- package/scripts/exec-rtk.js +11 -5
- package/scripts/i18n-helper.js +381 -0
- package/scripts/multi-model-pipeline.js +144 -0
- package/skill-packs/mobile-ios/pack.json +4 -2
- package/skill-packs/reverse-engineering/pack.json +1 -0
- package/skills/CATALOG.md +20 -0
- package/skills/GEMINI.md +9 -1
- package/skills/TRIGGER_INDEX.md +10 -0
- package/skills/ai-music/SKILL.md +275 -0
- package/skills/android-re-analyzer/SKILL.md +238 -0
- package/skills/android-re-analyzer/references/api-extraction-patterns.md +119 -0
- package/skills/android-re-analyzer/references/call-flow-analysis.md +176 -0
- package/skills/android-re-analyzer/references/fernflower-usage.md +115 -0
- package/skills/android-re-analyzer/references/jadx-usage.md +116 -0
- package/skills/android-re-analyzer/references/setup-guide.md +221 -0
- package/skills/android-re-analyzer/scripts/check-deps.sh +129 -0
- package/skills/android-re-analyzer/scripts/decompile.sh +375 -0
- package/skills/android-re-analyzer/scripts/find-api-calls.sh +118 -0
- package/skills/android-re-analyzer/scripts/install-dep.sh +448 -0
- package/skills/animal-island-ui-style/SKILL.md +1450 -0
- package/skills/app-store-review-agent/SKILL.md +164 -0
- package/skills/app-store-review-agent/references/guidelines/README.md +154 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/ai_apps.md +37 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/all_apps.md +50 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/crypto_finance.md +31 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/games.md +31 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/health_fitness.md +31 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/kids.md +27 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/macos.md +38 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/social_ugc.md +32 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/subscription_iap.md +34 -0
- package/skills/app-store-review-agent/references/guidelines/by-app-type/vpn.md +18 -0
- package/skills/app-store-review-agent/references/rules/design/minimum_functionality.md +96 -0
- package/skills/app-store-review-agent/references/rules/design/sign_in_with_apple.md +54 -0
- package/skills/app-store-review-agent/references/rules/entitlements/unused_entitlements.md +83 -0
- package/skills/app-store-review-agent/references/rules/metadata/accurate_metadata.md +54 -0
- package/skills/app-store-review-agent/references/rules/metadata/apple_trademark.md +99 -0
- package/skills/app-store-review-agent/references/rules/metadata/china_storefront.md +72 -0
- package/skills/app-store-review-agent/references/rules/metadata/competitor_terms.md +56 -0
- package/skills/app-store-review-agent/references/rules/metadata/subscription_metadata.md +81 -0
- package/skills/app-store-review-agent/references/rules/privacy/privacy_manifest.md +84 -0
- package/skills/app-store-review-agent/references/rules/privacy/unnecessary_data.md +60 -0
- package/skills/app-store-review-agent/references/rules/subscription/misleading_pricing.md +63 -0
- package/skills/app-store-review-agent/references/rules/subscription/missing_tos_pp.md +54 -0
- package/skills/awf-ponytail/SKILL.md +91 -0
- package/skills/awf-ponytail-review/SKILL.md +67 -0
- package/skills/awf-session-restore/SKILL.md +3 -3
- package/skills/brainstorm-agent/SKILL.md +11 -2
- package/skills/brainstorm-agent/templates/brief-template.md +8 -0
- package/skills/claude-planner/SKILL.md +47 -0
- package/skills/code-review/SKILL.md +87 -0
- package/skills/expo-game-development/SKILL.md +163 -0
- package/skills/flutter/LICENSE.txt +202 -0
- package/skills/flutter/SKILL.md +127 -0
- package/skills/flutter-project-creater/LICENSE.txt +202 -0
- package/skills/flutter-project-creater/SKILL.md +106 -0
- package/skills/game-developer/SKILL.md +163 -0
- package/skills/game-developer/references/ecs-patterns.md +501 -0
- package/skills/game-developer/references/multiplayer-networking.md +475 -0
- package/skills/game-developer/references/performance-optimization.md +422 -0
- package/skills/game-developer/references/unity-patterns.md +271 -0
- package/skills/game-developer/references/unreal-cpp.md +352 -0
- package/skills/generate-gui-assets/SKILL.md +305 -0
- package/skills/generate-gui-assets/agents/openai.yaml +4 -0
- package/skills/generate-gui-assets/references/catalog-schema.md +58 -0
- package/skills/generate-gui-assets/references/extraction-techniques.md +21 -0
- package/skills/generate-gui-assets/references/prompt-patterns.md +58 -0
- package/skills/generate-gui-assets/scripts/__pycache__/clean_chroma_edges.cpython-311.pyc +0 -0
- package/skills/generate-gui-assets/scripts/build_gui_contact_sheet.py +51 -0
- package/skills/generate-gui-assets/scripts/clean_chroma_edges.py +262 -0
- package/skills/generate-gui-assets/scripts/copy_approved_icons.py +64 -0
- package/skills/generate-gui-assets/scripts/prepare_gui_asset_run.py +91 -0
- package/skills/generate-gui-assets/scripts/suggest_grid_options.py +63 -0
- package/skills/generate-gui-assets/scripts/validate_gui_catalog.py +50 -0
- package/skills/godot-game-development/SKILL.md +142 -0
- package/skills/hatch-pet/LICENSE.txt +201 -0
- package/skills/hatch-pet/SKILL.md +420 -0
- package/skills/hatch-pet/agents/openai.yaml +4 -0
- package/skills/hatch-pet/references/animation-rows.md +29 -0
- package/skills/hatch-pet/references/codex-pet-contract.md +35 -0
- package/skills/hatch-pet/references/qa-rubric.md +60 -0
- package/skills/hatch-pet/scripts/__pycache__/clean_chroma_edges.cpython-311.pyc +0 -0
- package/skills/hatch-pet/scripts/clean_chroma_edges.py +262 -0
- package/skills/hatch-pet/scripts/compose_atlas.py +150 -0
- package/skills/hatch-pet/scripts/derive_running_left_from_running_right.py +143 -0
- package/skills/hatch-pet/scripts/extract_strip_frames.py +323 -0
- package/skills/hatch-pet/scripts/finalize_pet_run.py +382 -0
- package/skills/hatch-pet/scripts/generate_pet_images.py +287 -0
- package/skills/hatch-pet/scripts/inspect_frames.py +246 -0
- package/skills/hatch-pet/scripts/make_contact_sheet.py +96 -0
- package/skills/hatch-pet/scripts/package_custom_pet.py +108 -0
- package/skills/hatch-pet/scripts/pet_job_status.py +117 -0
- package/skills/hatch-pet/scripts/prepare_pet_run.py +673 -0
- package/skills/hatch-pet/scripts/queue_pet_repairs.py +172 -0
- package/skills/hatch-pet/scripts/record_imagegen_result.py +250 -0
- package/skills/hatch-pet/scripts/render_animation_videos.py +134 -0
- package/skills/hatch-pet/scripts/render_animation_videos.sh +5 -0
- package/skills/hatch-pet/scripts/validate_atlas.py +139 -0
- package/skills/i18n-orchestrator/SKILL.md +37 -0
- package/skills/ios-simulator-skill/SKILL.md +390 -0
- package/skills/ios-simulator-skill/scripts/accessibility_audit.py +300 -0
- package/skills/ios-simulator-skill/scripts/app_launcher.py +326 -0
- package/skills/ios-simulator-skill/scripts/app_state_capture.py +400 -0
- package/skills/ios-simulator-skill/scripts/appearance.py +385 -0
- package/skills/ios-simulator-skill/scripts/build_and_test.py +348 -0
- package/skills/ios-simulator-skill/scripts/clipboard.py +103 -0
- package/skills/ios-simulator-skill/scripts/common/__init__.py +61 -0
- package/skills/ios-simulator-skill/scripts/common/cache_utils.py +289 -0
- package/skills/ios-simulator-skill/scripts/common/device_utils.py +462 -0
- package/skills/ios-simulator-skill/scripts/common/env_config.py +35 -0
- package/skills/ios-simulator-skill/scripts/common/hang_pipeline.py +862 -0
- package/skills/ios-simulator-skill/scripts/common/hang_sessions.py +490 -0
- package/skills/ios-simulator-skill/scripts/common/idb_utils.py +180 -0
- package/skills/ios-simulator-skill/scripts/common/screenshot_utils.py +338 -0
- package/skills/ios-simulator-skill/scripts/container.py +668 -0
- package/skills/ios-simulator-skill/scripts/gesture.py +394 -0
- package/skills/ios-simulator-skill/scripts/hang_watcher.py +1533 -0
- package/skills/ios-simulator-skill/scripts/keyboard.py +391 -0
- package/skills/ios-simulator-skill/scripts/localization_audit.py +483 -0
- package/skills/ios-simulator-skill/scripts/location.py +467 -0
- package/skills/ios-simulator-skill/scripts/log_monitor.py +493 -0
- package/skills/ios-simulator-skill/scripts/model_inspector.py +645 -0
- package/skills/ios-simulator-skill/scripts/navigator.py +461 -0
- package/skills/ios-simulator-skill/scripts/privacy_manager.py +310 -0
- package/skills/ios-simulator-skill/scripts/push_notification.py +240 -0
- package/skills/ios-simulator-skill/scripts/screen_mapper.py +296 -0
- package/skills/ios-simulator-skill/scripts/sim_health_check.sh +245 -0
- package/skills/ios-simulator-skill/scripts/sim_list.py +299 -0
- package/skills/ios-simulator-skill/scripts/simctl_boot.py +312 -0
- package/skills/ios-simulator-skill/scripts/simctl_create.py +316 -0
- package/skills/ios-simulator-skill/scripts/simctl_delete.py +357 -0
- package/skills/ios-simulator-skill/scripts/simctl_erase.py +351 -0
- package/skills/ios-simulator-skill/scripts/simctl_shutdown.py +290 -0
- package/skills/ios-simulator-skill/scripts/simulator_selector.py +375 -0
- package/skills/ios-simulator-skill/scripts/status_bar.py +250 -0
- package/skills/ios-simulator-skill/scripts/test_recorder.py +323 -0
- package/skills/ios-simulator-skill/scripts/visual_diff.py +235 -0
- package/skills/ios-simulator-skill/scripts/xcode/__init__.py +13 -0
- package/skills/ios-simulator-skill/scripts/xcode/builder.py +397 -0
- package/skills/ios-simulator-skill/scripts/xcode/cache.py +204 -0
- package/skills/ios-simulator-skill/scripts/xcode/config.py +178 -0
- package/skills/ios-simulator-skill/scripts/xcode/reporter.py +343 -0
- package/skills/ios-simulator-skill/scripts/xcode/xcresult.py +451 -0
- package/skills/ios-visual-qa-strategist/SKILL.md +111 -0
- package/skills/ios-visual-qa-strategist/agents/openai.yaml +4 -0
- package/skills/ios-visual-qa-strategist/references/ios-tool-selection.md +61 -0
- package/skills/ios-visual-qa-strategist/references/minimal-capture-policy.md +56 -0
- package/skills/ios-visual-qa-strategist/references/visual-reasoning-heuristics.md +53 -0
- package/skills/orchestrator/SKILL.md +0 -20
- package/skills/persistent-storage/SKILL.md +55 -0
- package/skills/short-maker/SKILL.md +23 -0
- package/skills/short-maker/scripts/effects.js +56 -0
- package/skills/short-maker/scripts/shortmaker-bridge.js +332 -0
- package/skills/short-maker/scripts/videomix.js +601 -0
- package/skills/short-maker/templates/hyperframes/cinematic-character.template.html +172 -0
- package/skills/short-maker/templates/hyperframes/index.template.html +194 -0
- package/skills/smali-to-kotlin/SKILL.md +128 -0
- package/skills/smali-to-kotlin/examples/getting-started/tech-stack.md +58 -0
- package/skills/smali-to-kotlin/examples/pipeline/data-ui-parity.md +118 -0
- package/skills/smali-to-kotlin/examples/pipeline/scanner-and-bootstrap.md +106 -0
- package/skills/smali-to-kotlin/library-patterns.md +189 -0
- package/skills/smali-to-kotlin/phase-0-discovery.md +128 -0
- package/skills/smali-to-kotlin/phase-1-architecture.md +166 -0
- package/skills/smali-to-kotlin/phase-2-blueprint-ui.md +347 -0
- package/skills/smali-to-kotlin/phase-2-blueprint.md +228 -0
- package/skills/smali-to-kotlin/phase-3-build.md +248 -0
- package/skills/smali-to-kotlin/phase-3-logic-build.md +268 -0
- package/skills/smali-to-kotlin/smali-reading-guide.md +310 -0
- package/skills/smali-to-kotlin/templates/app-map.md +101 -0
- package/skills/smali-to-kotlin/templates/architecture.md +142 -0
- package/skills/smali-to-kotlin/templates/blueprint.md +145 -0
- package/skills/spec-gate/SKILL.md +6 -2
- package/skills/symphony-enforcer/SKILL.md +8 -0
- package/skills/symphony-enforcer/examples/mindful-stop.md +2 -0
- package/skills/symphony-enforcer/examples/three-phase.md +16 -0
- package/skills/symphony-enforcer/examples/trigger-points.md +7 -1
- package/skills/unity-game-development/SKILL.md +231 -0
- package/skills/video-edit/SKILL.md +36 -0
- package/skills/video-edit/scripts/video_edit.py +324 -0
- package/templates/project-identity/android.json +2 -2
- package/templates/project-identity/backend-nestjs.json +2 -2
- package/templates/project-identity/expo.json +2 -2
- package/templates/project-identity/ios.json +2 -2
- package/templates/project-identity/web-nextjs.json +2 -2
- package/templates/setup-mapping.json +48 -0
- package/templates/specs/design-template.md +161 -71
- package/templates/specs/requirements-template.md +65 -133
- package/templates/specs/task-spec-template.xml +3 -0
- package/workflows/_uncategorized/critic.md +40 -0
- package/workflows/_uncategorized/git-rebase-flow.md +81 -0
- package/workflows/_uncategorized/image-gen.md +118 -0
- package/workflows/_uncategorized/multi-model-pipeline.md +60 -0
- package/workflows/_uncategorized/pixel-gen.md +86 -0
- package/workflows/_uncategorized/pixel-setup.md +90 -0
- package/workflows/_uncategorized/ponytail-review.md +59 -0
- package/workflows/_uncategorized/reverse-android-build.md +222 -0
- package/workflows/_uncategorized/reverse-android-design.md +139 -0
- package/workflows/_uncategorized/reverse-android-discover.md +150 -0
- package/workflows/_uncategorized/reverse-android-scan.md +158 -0
- package/workflows/_uncategorized/reverse-android.md +143 -0
- package/workflows/_uncategorized/reverse-ios-build.md +240 -0
- package/workflows/_uncategorized/reverse-ios-design.md +112 -0
- package/workflows/_uncategorized/reverse-ios-discover.md +120 -0
- package/workflows/_uncategorized/reverse-ios-scan.md +155 -0
- package/workflows/_uncategorized/reverse-ios.md +152 -0
- package/workflows/_uncategorized/safety-router.md +34 -0
- package/workflows/_uncategorized/teach.md +89 -0
- package/workflows/_uncategorized/verify-ui.md +53 -0
- package/workflows/_uncategorized/visualize-screenshots.md +34 -0
- package/workflows/ads/ads-analyst.md +201 -0
- package/workflows/ads/ads-audit.md +106 -0
- package/workflows/ads/ads-optimize.md +97 -0
- package/workflows/ads/ads-targeting.md +241 -0
- package/workflows/ads/adsExpert.md +160 -0
- package/workflows/ads/smali-ads-config.md +400 -0
- package/workflows/ads/smali-ads-flow.md +331 -0
- package/workflows/ads/smali-ads-interstitial.md +377 -0
- package/workflows/ads/smali-ads-native.md +382 -0
- package/workflows/context/teach.md +89 -0
- package/workflows/gitnexus.md +8 -8
- package/workflows/lifecycle/brainstorm.md +43 -0
- package/workflows/lifecycle/code.md +5 -0
- package/workflows/lifecycle/init.md +23 -5
- package/workflows/lifecycle/multi-model-pipeline.md +60 -0
- package/workflows/quality/ponytail-review.md +59 -0
- package/workflows/roles/critic.md +40 -0
- 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.
|