@forvibe/cli 1.1.0 → 2.0.0

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.
@@ -1,282 +0,0 @@
1
- [
2
- {
3
- "id": "app-crash-during-review",
4
- "guidelineNumber": "2.1",
5
- "guidelineName": "App Completeness",
6
- "category": "performance",
7
- "rejectionReason": "We discovered one or more bugs in your app. Your app crashed during our review.",
8
- "whatDeveloperDid": "Submitted an app that had a race condition in the initialization sequence. The app worked fine locally but crashed on first launch when network conditions were slower, which matched Apple's review environment.",
9
- "whatAppleSaid": "Guideline 2.1 - Performance - App Completeness: We discovered one or more bugs in your app when reviewed on iPhone 15 Pro running iOS 17.2. Specifically, the app crashed on launch. Please review the crash logs attached in the resolution center.",
10
- "fix": "Analyzed the crash log from the resolution center. Found a force-unwrap on an optional that was nil when a network request hadn't completed before the UI tried to access the data. Added proper nil-checking and async/await handling for the initialization sequence. Tested on a clean install with network throttling enabled.",
11
- "outcome": "approved-after-fix",
12
- "keywords": ["crash", "bug", "launch-crash", "race-condition", "app-completeness"],
13
- "behavioralSignals": ["app crashes on launch", "force-unwrap crash", "race condition on initialization", "works locally but crashes in review"],
14
- "year": 2024
15
- },
16
- {
17
- "id": "placeholder-lorem-ipsum-content",
18
- "guidelineNumber": "2.1",
19
- "guidelineName": "App Completeness",
20
- "category": "performance",
21
- "rejectionReason": "Your app includes placeholder content. Apps should be complete and fully functional when submitted for review.",
22
- "whatDeveloperDid": "Submitted an app where some secondary screens still contained 'Lorem ipsum' placeholder text, sample images, and TODO comments visible in the UI. The developer forgot to replace placeholder content before submission.",
23
- "whatAppleSaid": "Guideline 2.1 - Performance - App Completeness: Your app includes placeholder content that makes it appear as though the app is not yet complete. Specifically, we found Lorem ipsum text on the About page and placeholder images in the settings screen. Please complete all content before resubmitting.",
24
- "fix": "Replaced all Lorem ipsum text with real content. Replaced placeholder images with production assets. Did a full audit of every screen to ensure no remaining placeholder content, TODO labels, or sample data was visible.",
25
- "outcome": "approved-after-fix",
26
- "keywords": ["placeholder", "lorem-ipsum", "incomplete", "sample-content", "app-completeness"],
27
- "behavioralSignals": ["Lorem ipsum text visible", "placeholder images displayed", "TODO text in UI", "sample data on screen"],
28
- "year": 2023
29
- },
30
- {
31
- "id": "testflight-references-in-production",
32
- "guidelineNumber": "2.1",
33
- "guidelineName": "App Completeness",
34
- "category": "performance",
35
- "rejectionReason": "Your app references TestFlight or beta testing in the production build.",
36
- "whatDeveloperDid": "Left a 'Thank you for beta testing!' banner and a 'Report Beta Bug' button visible in the production build. The app also had a settings toggle labeled 'TestFlight Debug Mode' that was visible to all users.",
37
- "whatAppleSaid": "Guideline 2.1 - Performance - App Completeness: Your app contains references to TestFlight and beta testing, which is not appropriate for the production version of your app. Specifically, we found a 'Report Beta Bug' button and references to TestFlight in the settings. Please remove all beta-related content.",
38
- "fix": "Wrapped all beta/TestFlight-related UI elements in compile-time flags (#if DEBUG) and runtime checks for TestFlight environment. Removed the beta testing banner and debug toggle from the production build configuration.",
39
- "outcome": "approved-after-fix",
40
- "keywords": ["testflight", "beta", "debug", "production-build", "beta-references"],
41
- "behavioralSignals": ["TestFlight text visible", "beta testing UI elements", "debug mode toggle in settings", "Report Beta Bug button"],
42
- "year": 2023
43
- },
44
- {
45
- "id": "ipv6-hardcoded-addresses-failure",
46
- "guidelineNumber": "2.1",
47
- "guidelineName": "App Completeness",
48
- "category": "performance",
49
- "rejectionReason": "Your app does not work on IPv6-only networks as required.",
50
- "whatDeveloperDid": "Hardcoded IPv4 addresses for API server connections instead of using domain names. Apple's review network uses a NAT64/DNS64 environment (IPv6-only), causing all direct IPv4 connections to fail.",
51
- "whatAppleSaid": "Guideline 2.1 - Performance - App Completeness: We discovered one or more bugs in your app when reviewed on iPad running iOS 17.1 on an IPv6 network. Specifically, the app was unable to load content. Apps must support IPv6-only networking as many carrier networks are IPv6-only.",
52
- "fix": "Replaced all hardcoded IPv4 addresses with domain name-based connections. Used NSURLSession/URLSession which handles IPv6 natively. Tested using Apple's NAT64 test network setup (macOS Internet Sharing with 'Create NAT64 Network' enabled) to verify connectivity.",
53
- "outcome": "approved-after-fix",
54
- "keywords": ["ipv6", "networking", "hardcoded-ip", "nat64", "connectivity"],
55
- "behavioralSignals": ["app fails to load content", "network requests fail on review", "hardcoded IP addresses in code", "works on WiFi but fails in review"],
56
- "year": 2023
57
- },
58
- {
59
- "id": "nat64-ipv6-mismatch-local-vs-review",
60
- "guidelineNumber": "2.1",
61
- "guidelineName": "App Completeness",
62
- "category": "performance",
63
- "rejectionReason": "Your app failed to connect to its server when tested on Apple's IPv6 review network.",
64
- "whatDeveloperDid": "The app used a third-party networking library that had a bug with NAT64 address synthesis. It worked on the developer's local IPv6 test setup but failed on Apple's specific NAT64/DNS64 configuration because the library was manually resolving DNS instead of letting the system handle it.",
65
- "whatAppleSaid": "Guideline 2.1 - Performance - App Completeness: Your app was unable to connect to its server during review. The app displayed a 'Connection Error' message when attempting to load the main feed. We tested on an IPv6 network and were unable to use the app's core functionality.",
66
- "fix": "Updated the third-party networking library to the latest version which fixed the NAT64 compatibility issue. Switched from manual DNS resolution to system-provided APIs (getaddrinfo) that properly handle IPv6 address synthesis. Verified using Apple's recommended NAT64 testing setup.",
67
- "outcome": "approved-after-fix",
68
- "keywords": ["nat64", "ipv6", "dns64", "networking", "address-synthesis", "connectivity"],
69
- "behavioralSignals": ["connection error on review network", "works locally but fails in review", "third-party networking library", "manual DNS resolution"],
70
- "year": 2022
71
- },
72
- {
73
- "id": "background-audio-mode-no-audio",
74
- "guidelineNumber": "2.5.4",
75
- "guidelineName": "Required Device Capabilities",
76
- "category": "performance",
77
- "rejectionReason": "Your app declares audio background mode but does not play audio content.",
78
- "whatDeveloperDid": "Added the UIBackgroundModes 'audio' capability to keep the app alive in the background for periodic data syncing, even though the app had no audio playback functionality.",
79
- "whatAppleSaid": "Guideline 2.5.4 - Performance - Software Requirements: Your app declares the audio background mode in UIBackgroundModes but does not include audio playback functionality. The audio background mode is intended only for apps that provide audible content to the user. Using background modes for purposes other than their intended function is not permitted.",
80
- "fix": "Removed the 'audio' UIBackgroundMode. Implemented proper background data syncing using BGTaskScheduler (BGAppRefreshTask and BGProcessingTask) which is the correct API for periodic background work without requiring audio playback.",
81
- "outcome": "approved-after-fix",
82
- "keywords": ["background-mode", "audio", "UIBackgroundModes", "background-processing", "misuse"],
83
- "behavioralSignals": ["audio background mode declared", "no audio playback in app", "app stays alive in background", "background mode abuse"],
84
- "year": 2023
85
- },
86
- {
87
- "id": "demo-account-2fa-blocking-reviewer",
88
- "guidelineNumber": "2.1",
89
- "guidelineName": "App Completeness",
90
- "category": "performance",
91
- "rejectionReason": "We were unable to sign in to your app with the demo account provided because it required two-factor authentication.",
92
- "whatDeveloperDid": "Provided demo account credentials in the App Review notes, but the account had mandatory two-factor authentication enabled which sent an SMS code to the developer's phone. The Apple reviewer had no way to receive the 2FA code.",
93
- "whatAppleSaid": "Guideline 2.1 - Performance - App Completeness: We were unable to complete the review of your app because we could not sign in using the demo credentials provided. The account requires two-factor authentication via SMS, and we were unable to receive the verification code. Please provide demo credentials that allow full access without requiring additional verification steps.",
94
- "fix": "Created a dedicated demo/review account with 2FA disabled. Added the demo credentials (username, password) in the App Review Information section of App Store Connect. Included a note explaining which features to test and any special instructions for the reviewer.",
95
- "outcome": "approved-after-fix",
96
- "keywords": ["demo-account", "2fa", "authentication", "login", "reviewer-access", "two-factor"],
97
- "behavioralSignals": ["2FA required on demo account", "SMS verification blocking reviewer", "unable to sign in during review", "demo credentials incomplete"],
98
- "year": 2024
99
- },
100
- {
101
- "id": "magic-link-email-prefetch-ipad",
102
- "guidelineNumber": "2.1",
103
- "guidelineName": "App Completeness",
104
- "category": "performance",
105
- "rejectionReason": "We were unable to sign in using the magic link authentication because the link expired before we could use it.",
106
- "whatDeveloperDid": "Implemented passwordless authentication using magic links sent via email. When the Apple reviewer opened the email on iPad, the Mail app's link preview/prefetch feature automatically triggered the magic link URL, consuming it before the reviewer could manually tap it to authenticate.",
107
- "whatAppleSaid": "Guideline 2.1 - Performance - App Completeness: We were unable to complete the login process. We received the magic link email, but when we tapped the link it showed 'Link expired or already used.' We attempted this multiple times with the same result.",
108
- "fix": "Changed the magic link flow to a two-step process: the link now opens a confirmation page in the browser where the user must tap 'Confirm Sign In' before the token is consumed. This prevents email client prefetching from invalidating the link. Also added a fallback OTP code option as an alternative to magic links.",
109
- "outcome": "approved-after-fix",
110
- "keywords": ["magic-link", "authentication", "email-prefetch", "login", "link-expiry", "passwordless"],
111
- "behavioralSignals": ["magic link expires immediately", "link already used error", "email prefetch consuming link", "login fails on iPad Mail"],
112
- "year": 2024
113
- },
114
- {
115
- "id": "passkey-aasa-creation-failure",
116
- "guidelineNumber": "2.1",
117
- "guidelineName": "App Completeness",
118
- "category": "performance",
119
- "rejectionReason": "Passkey creation failed during our review. The app displayed an error when attempting to create a passkey.",
120
- "whatDeveloperDid": "Implemented passkey (WebAuthn) authentication but the Apple App Site Association (AASA) file wasn't being fetched quickly enough by Apple's CDN during the review. The passkey creation requires the AASA file to be available at /.well-known/apple-app-site-association to verify the domain-app association.",
121
- "whatAppleSaid": "Guideline 2.1 - Performance - App Completeness: We were unable to create a passkey during review. When attempting to register, the app displayed 'Unable to create passkey. Please try again later.' We attempted multiple times without success.",
122
- "fix": "Ensured the AASA file was properly hosted and cached before submission. Added the associated domains entitlement with the webcredentials service. Pre-warmed the AASA cache by making requests to the domain before submission. Also added a fallback email/password registration option so reviewers could complete onboarding even if passkey creation failed.",
123
- "outcome": "approved-after-fix",
124
- "keywords": ["passkey", "webauthn", "aasa", "authentication", "associated-domains", "fido"],
125
- "behavioralSignals": ["passkey creation error", "AASA file not found", "domain association failure", "authentication registration fails"],
126
- "year": 2024
127
- },
128
- {
129
- "id": "codepush-hot-code-push-rejection",
130
- "guidelineNumber": "2.3.1",
131
- "guidelineName": "Hidden or Undocumented Features",
132
- "category": "performance",
133
- "rejectionReason": "Your app includes the ability to download and execute code after installation, which can be used to introduce features not reviewed by Apple.",
134
- "whatDeveloperDid": "Used Microsoft CodePush (or a similar hot-code-push solution) to push JavaScript bundle updates to a React Native app, bypassing the App Store review process. The updates were capable of changing app functionality beyond minor bug fixes.",
135
- "whatAppleSaid": "Guideline 2.3.1 - Performance - Accurate Metadata: Your app contains hidden features. Specifically, your app includes functionality that allows for the remote downloading and execution of code that can change the app's behavior or functionality after review. Apps must not provide mechanisms to alter their primary functionality post-review.",
136
- "fix": "Configured CodePush to only push minor bug fixes and UI text changes, not functional changes. Added documentation in the review notes explaining that CodePush is used only for critical bug fixes and does not alter app functionality. Some developers choose to remove CodePush entirely and use standard App Store updates instead.",
137
- "outcome": "approved-after-fix",
138
- "keywords": ["codepush", "hot-code-push", "hidden-features", "remote-code", "javascript-bundle", "react-native"],
139
- "behavioralSignals": ["CodePush SDK detected", "remote code execution capability", "JavaScript bundle updates", "app behavior changes post-review"],
140
- "year": 2022
141
- },
142
- {
143
- "id": "missing-app-icon",
144
- "guidelineNumber": "2.3",
145
- "guidelineName": "Accurate Metadata",
146
- "category": "performance",
147
- "rejectionReason": "Your app is missing the required app icon.",
148
- "whatDeveloperDid": "Submitted an app without including the 1024x1024 App Store icon in the asset catalog, or the icon was corrupted/transparent. The app appeared with a blank or default icon in App Store Connect.",
149
- "whatAppleSaid": "Guideline 2.3 - Performance - Accurate Metadata: Your app is missing the required 1024x1024 App Store icon. All apps must include a valid app icon that will be displayed on the App Store. Please add the icon to your app's asset catalog.",
150
- "fix": "Added the 1024x1024 App Store icon to the Assets.xcassets/AppIcon.appiconset. Verified all required icon sizes were present and none were transparent or contained alpha channels (which App Store Connect rejects).",
151
- "outcome": "approved-after-fix",
152
- "keywords": ["app-icon", "missing-icon", "metadata", "asset-catalog", "icon-size"],
153
- "behavioralSignals": ["blank app icon", "missing icon in asset catalog", "corrupted icon file", "transparent app icon"],
154
- "year": 2023
155
- },
156
- {
157
- "id": "ios-release-notes-in-macos-app",
158
- "guidelineNumber": "2.3",
159
- "guidelineName": "Accurate Metadata",
160
- "category": "performance",
161
- "rejectionReason": "Your macOS app's release notes reference iOS-specific features and terminology.",
162
- "whatDeveloperDid": "Jesse Squires' Taxatio app was a universal app supporting both iOS and macOS. The release notes for a macOS update mentioned iOS-specific features like 'improved iPhone widget' and 'haptic feedback improvements' that don't apply to macOS.",
163
- "whatAppleSaid": "Guideline 2.3 - Performance - Accurate Metadata: Your Mac app's release notes reference iOS-specific features ('iPhone widget', 'haptic feedback'). Release notes for macOS apps should be relevant to the macOS version of your app.",
164
- "fix": "Created platform-specific release notes. For macOS submissions, wrote release notes that only reference macOS-relevant features and improvements. Used App Store Connect's platform-specific metadata fields to provide different release notes for each platform.",
165
- "outcome": "approved-after-fix",
166
- "keywords": ["release-notes", "macos", "ios", "metadata", "platform-specific", "universal-app"],
167
- "behavioralSignals": ["iOS terms in macOS release notes", "platform-specific features mentioned for wrong platform", "universal app with shared metadata"],
168
- "year": 2023
169
- },
170
- {
171
- "id": "screenshots-dont-match-ui",
172
- "guidelineNumber": "2.3.7",
173
- "guidelineName": "Accurate Metadata - Screenshots",
174
- "category": "performance",
175
- "rejectionReason": "Your app's screenshots do not accurately reflect the current version of your app.",
176
- "whatDeveloperDid": "Submitted an app update with significant UI changes but forgot to update the App Store screenshots. The screenshots showed the old design with a tab bar at the bottom, while the new version used a sidebar navigation pattern.",
177
- "whatAppleSaid": "Guideline 2.3.7 - Performance - Accurate Metadata: Your app's screenshots do not reflect the current version of your app. The screenshots show a different navigation pattern and UI layout than what is present in the current build. Please update your screenshots to accurately represent the app.",
178
- "fix": "Took new screenshots on all required device sizes reflecting the current UI. Used Xcode's screenshot automation or a tool like fastlane snapshot to generate consistent screenshots across all required device sizes and localizations.",
179
- "outcome": "approved-after-fix",
180
- "keywords": ["screenshots", "metadata", "ui-mismatch", "app-store-connect", "visual-accuracy"],
181
- "behavioralSignals": ["screenshots show old design", "UI changed since screenshots taken", "navigation pattern mismatch", "outdated marketing assets"],
182
- "year": 2024
183
- },
184
- {
185
- "id": "free-word-in-preview-poster-frame",
186
- "guidelineNumber": "2.3",
187
- "guidelineName": "Accurate Metadata",
188
- "category": "performance",
189
- "rejectionReason": "Your app preview poster frame contains the word 'Free' which references pricing.",
190
- "whatDeveloperDid": "Created an app preview video whose poster frame (the still image shown before the video plays) contained text overlay saying 'Try Free for 7 Days'. Apple prohibits pricing references in app preview content.",
191
- "whatAppleSaid": "Guideline 2.3 - Performance - Accurate Metadata: Your app preview includes references to your app's price. Specifically, the poster frame contains the text 'Try Free for 7 Days.' App previews and screenshots may not reference pricing information, as pricing can vary by region and may change over time.",
192
- "fix": "Removed the 'Try Free for 7 Days' text from the app preview poster frame and video. Replaced it with a value-proposition message like 'Track Your Fitness Goals' that describes app functionality without referencing pricing.",
193
- "outcome": "approved-after-fix",
194
- "keywords": ["app-preview", "poster-frame", "free", "pricing", "metadata", "screenshots"],
195
- "behavioralSignals": ["word 'Free' in preview", "pricing mentioned in screenshots", "poster frame with price reference", "promotional pricing in media"],
196
- "year": 2023
197
- },
198
- {
199
- "id": "version-number-suggesting-beta",
200
- "guidelineNumber": "2.1",
201
- "guidelineName": "App Completeness",
202
- "category": "performance",
203
- "rejectionReason": "Your app's version number suggests it is a pre-release or beta version.",
204
- "whatDeveloperDid": "Submitted the first version of an app with version number '0.1' or '0.9.2-beta', suggesting the app was not yet a complete, finished product ready for the App Store.",
205
- "whatAppleSaid": "Guideline 2.1 - Performance - App Completeness: Your app version number (0.1) suggests that the app is still in development or beta stage. Apps submitted to the App Store should be final versions. Please update your version number to reflect a production-ready release (e.g., 1.0).",
206
- "fix": "Changed the version number from '0.1' to '1.0.0' in the project settings and App Store Connect. Removed any 'beta' or 'pre-release' suffixes from the version string and marketing version.",
207
- "outcome": "approved-after-fix",
208
- "keywords": ["version-number", "beta", "pre-release", "app-completeness", "version-string"],
209
- "behavioralSignals": ["version number below 1.0", "beta in version string", "pre-release version numbering", "0.x version submitted to App Store"],
210
- "year": 2022
211
- },
212
- {
213
- "id": "debug-mode-left-enabled",
214
- "guidelineNumber": "2.1",
215
- "guidelineName": "App Completeness",
216
- "category": "performance",
217
- "rejectionReason": "Your app appears to have debug or development mode features visible to users.",
218
- "whatDeveloperDid": "Submitted a production build with debug logging visible in a console view, a floating debug menu accessible via a hidden gesture, and network request/response details displayed in an overlay that could be triggered by shaking the device.",
219
- "whatAppleSaid": "Guideline 2.1 - Performance - App Completeness: Your app includes development tools and debug information that are visible to users. Specifically, shaking the device reveals a network debugging overlay and there is a hidden debug menu accessible through a multi-tap gesture. Please remove all development/debugging features from the production build.",
220
- "fix": "Wrapped all debug UI elements in #if DEBUG preprocessor directives. Removed the shake-to-debug gesture recognizer from the release build. Ensured the debug menu is only accessible in development builds by checking the build configuration at runtime.",
221
- "outcome": "approved-after-fix",
222
- "keywords": ["debug-mode", "development-tools", "debug-menu", "logging", "production-build"],
223
- "behavioralSignals": ["debug overlay visible", "shake to reveal debug tools", "hidden debug menu accessible", "network logging displayed to users"],
224
- "year": 2023
225
- },
226
- {
227
- "id": "localhost-development-urls-production",
228
- "guidelineNumber": "2.1",
229
- "guidelineName": "App Completeness",
230
- "category": "performance",
231
- "rejectionReason": "Your app attempts to connect to localhost or development server URLs.",
232
- "whatDeveloperDid": "Accidentally shipped a production build with the API base URL still pointing to 'http://localhost:3000' or a staging server like 'https://staging-api.example.com'. The app failed to load any content during review because the development server was not accessible.",
233
- "whatAppleSaid": "Guideline 2.1 - Performance - App Completeness: Your app was unable to load content during our review. We found that the app is attempting to connect to development/staging server URLs that are not accessible. Please ensure your app connects to production servers.",
234
- "fix": "Fixed the build configuration to use the correct production API URL. Implemented environment-based configuration using .xcconfig files or build schemes so that Debug/Staging/Release builds automatically use the correct server URLs. Added a runtime check that warns during development if production URLs are not configured.",
235
- "outcome": "approved-after-fix",
236
- "keywords": ["localhost", "development-server", "staging", "api-url", "build-configuration"],
237
- "behavioralSignals": ["app can't load content", "localhost in network requests", "staging URL in production", "development server reference"],
238
- "year": 2023
239
- },
240
- {
241
- "id": "large-asset-download-no-disclosure",
242
- "guidelineNumber": "2.3",
243
- "guidelineName": "Accurate Metadata",
244
- "category": "performance",
245
- "rejectionReason": "Your app downloads large amounts of data after installation without informing the user.",
246
- "whatDeveloperDid": "Published a game that was 150MB on download but immediately required an additional 2GB asset download on first launch without any disclosure in the App Store listing or a user prompt before downloading.",
247
- "whatAppleSaid": "Guideline 2.3 - Performance - Accurate Metadata: Your app downloads a significant amount of additional content (approximately 2GB) after installation without informing the user beforehand. Users should be informed about the total storage requirements. Please disclose the additional download requirement in your app description and provide a prompt before downloading.",
248
- "fix": "Added a note in the App Store description about the additional download size. Implemented a pre-download prompt showing the total size and allowing the user to choose when to download. Added a progress indicator showing download status and the option to download over Wi-Fi only.",
249
- "outcome": "approved-after-fix",
250
- "keywords": ["asset-download", "large-download", "storage", "disclosure", "on-demand-resources"],
251
- "behavioralSignals": ["large post-install download", "no size disclosure", "immediate background download", "storage requirement hidden"],
252
- "year": 2022
253
- },
254
- {
255
- "id": "incomplete-ui-blank-purchase-page",
256
- "guidelineNumber": "2.1",
257
- "guidelineName": "App Completeness",
258
- "category": "performance",
259
- "rejectionReason": "Your app has an incomplete user interface. A purchase/subscription page appears blank.",
260
- "whatDeveloperDid": "The app's premium subscription page was blank during review because the StoreKit products hadn't been approved in App Store Connect yet, or the product IDs were misconfigured. The reviewer saw an empty paywall with no pricing or subscription options displayed.",
261
- "whatAppleSaid": "Guideline 2.1 - Performance - App Completeness: Your app appears to be incomplete. Specifically, the subscription page does not display any content - it appears as a blank screen with no purchase options. Please ensure all pages in your app are fully functional.",
262
- "fix": "Ensured all IAP products were in 'Ready to Submit' or 'Approved' status in App Store Connect before submitting the app for review. Added error handling and a fallback UI for when StoreKit products fail to load, showing a 'Unable to load products. Please try again.' message with a retry button instead of a blank screen.",
263
- "outcome": "approved-after-fix",
264
- "keywords": ["blank-screen", "iap", "storekit", "purchase-page", "subscription", "incomplete-ui"],
265
- "behavioralSignals": ["empty subscription page", "blank paywall screen", "no products displayed", "StoreKit products not loading"],
266
- "year": 2024
267
- },
268
- {
269
- "id": "crash-from-apple-framework-bug",
270
- "guidelineNumber": "2.1",
271
- "guidelineName": "App Completeness",
272
- "category": "performance",
273
- "rejectionReason": "Your app crashed during review due to a system framework issue, but the rejection still stands.",
274
- "whatDeveloperDid": "The app crashed during review due to a known bug in Apple's own UIKit framework (specifically a UICollectionView layout crash on certain iOS versions). The developer filed a Radar/Feedback but the crash still caused a rejection because Apple reviews based on observed behavior, not cause.",
275
- "whatAppleSaid": "Guideline 2.1 - Performance - App Completeness: We discovered one or more bugs in your app. The app crashed when navigating to the gallery view. While we understand this may be related to a system framework issue, apps must not crash regardless of the underlying cause.",
276
- "fix": "Implemented a workaround for the UIKit framework bug by using a different collection view layout approach. Added a try-catch wrapper around the problematic layout code and a fallback layout in case of failure. Filed a Feedback Assistant report with Apple about the underlying framework bug.",
277
- "outcome": "approved-after-fix",
278
- "keywords": ["framework-bug", "apple-bug", "crash", "uikit", "workaround", "system-crash"],
279
- "behavioralSignals": ["crash in Apple framework", "UIKit layout crash", "system bug causing rejection", "crash not in developer code"],
280
- "year": 2024
281
- }
282
- ]
@@ -1,212 +0,0 @@
1
- [
2
- {
3
- "id": "ugc-moderation-missing-fliplearn",
4
- "guidelineNumber": "1.2",
5
- "guidelineName": "User-Generated Content",
6
- "category": "safety",
7
- "rejectionReason": "Your app includes user-generated content but does not include the required moderation controls.",
8
- "whatDeveloperDid": "Built an education app (FlipLearn) with a social feed where students could post content, but did not include any report, block, or flag buttons on posts or user profiles.",
9
- "whatAppleSaid": "Guideline 1.2 - Safety - User-Generated Content: Your app enables the display of user-generated content but does not have the required precautions in place. Specifically, your app is missing the ability to report objectionable content, block abusive users, and a mechanism to flag content for review.",
10
- "fix": "Added a flag/report button on every post and user profile, implemented user blocking functionality, added a 24-hour content moderation SLA with a dedicated moderation queue, and included a visible link to community guidelines.",
11
- "outcome": "approved-after-fix",
12
- "keywords": ["ugc", "moderation", "report", "block", "flag", "user-generated-content"],
13
- "behavioralSignals": ["app has social feed", "users can post content", "no report button visible", "no block functionality"],
14
- "year": 2023
15
- },
16
- {
17
- "id": "kids-category-firebase-analytics",
18
- "guidelineNumber": "1.3",
19
- "guidelineName": "Kids Category",
20
- "category": "safety",
21
- "rejectionReason": "Your Kids Category app includes third-party analytics with the ability to collect identifiable information from minors.",
22
- "whatDeveloperDid": "Published a kids educational game in the Kids Category on the App Store while including Firebase Analytics SDK, which can collect device identifiers and behavioral data in violation of COPPA regulations.",
23
- "whatAppleSaid": "Guideline 1.3 - Safety - Kids Category: Your app includes third-party analytics software with the ability to collect and transmit identifiable information about children. Specifically, we found your app integrates Firebase Analytics which may collect device identifiers. Apps in the Kids Category must not include third-party analytics or advertising that can collect identifiable information.",
24
- "fix": "Removed Firebase Analytics SDK entirely from the app. Replaced with a custom first-party analytics solution that collects only anonymous aggregate event counts stored on the developer's own server, with no device identifiers or user-level tracking.",
25
- "outcome": "approved-after-fix",
26
- "keywords": ["kids-category", "firebase", "analytics", "coppa", "children", "data-collection"],
27
- "behavioralSignals": ["app is in Kids Category", "Firebase SDK detected in binary", "analytics collecting device identifiers"],
28
- "year": 2022
29
- },
30
- {
31
- "id": "kids-category-amplitude-sdk",
32
- "guidelineNumber": "1.3",
33
- "guidelineName": "Kids Category",
34
- "category": "safety",
35
- "rejectionReason": "Your Kids Category app includes third-party analytics (Amplitude) which may collect identifiable information from children.",
36
- "whatDeveloperDid": "Integrated Amplitude analytics SDK in a children's learning app listed in the Kids Category to track user engagement and session metrics.",
37
- "whatAppleSaid": "Guideline 1.3 - Safety - Kids Category: We found that your app uses the Amplitude SDK, which has the capability to collect identifiable information. Apps in the Kids Category may not include third-party analytics or third-party advertising. You must remove all such SDKs before resubmitting.",
38
- "fix": "Removed Amplitude SDK completely. Built a lightweight custom event tracker that only logs anonymized session durations and feature usage counts without any device fingerprinting, IDFA, or persistent identifiers.",
39
- "outcome": "approved-after-fix",
40
- "keywords": ["kids-category", "amplitude", "analytics", "coppa", "children", "tracking-sdk"],
41
- "behavioralSignals": ["app targets children", "Amplitude SDK in binary scan", "third-party analytics present in Kids Category app"],
42
- "year": 2023
43
- },
44
- {
45
- "id": "anonymous-chat-pornography-risk",
46
- "guidelineNumber": "1.1.4",
47
- "guidelineName": "Objectionable Content - Pornography",
48
- "category": "safety",
49
- "rejectionReason": "Your app connects users anonymously for video chat, which presents a high risk of pornographic or objectionable content.",
50
- "whatDeveloperDid": "Built a Chatroulette-style anonymous video chat app that randomly paired strangers for live video conversations with no content filtering or identity verification.",
51
- "whatAppleSaid": "Guideline 1.1.4 - Safety - Objectionable Content: Your app facilitates anonymous video connections between users, which creates significant risk for pornographic content, exploitation, and abuse. Apps that connect strangers for anonymous communication must implement robust safeguards including content moderation and age verification.",
52
- "fix": "The developer was unable to adequately address Apple's concerns. Anonymous random video chat apps are effectively banned from the App Store due to the inherent risk of objectionable content. The developer pivoted to a moderated, interest-based matching system with AI-powered nudity detection, mandatory profile verification, and real-time content monitoring.",
53
- "outcome": "approved-after-fix",
54
- "keywords": ["anonymous-chat", "video-chat", "chatroulette", "pornography", "content-moderation", "age-verification"],
55
- "behavioralSignals": ["anonymous video pairing", "no identity verification", "random stranger matching", "no content filtering"],
56
- "year": 2021
57
- },
58
- {
59
- "id": "drug-dosage-calculator-unapproved-entity",
60
- "guidelineNumber": "1.4.2",
61
- "guidelineName": "Medical - Drug Dosage Calculators",
62
- "category": "safety",
63
- "rejectionReason": "Your app provides drug dosage calculations but is not from a recognized institution such as a drug manufacturer, hospital, or university.",
64
- "whatDeveloperDid": "An independent developer built a drug dosage calculator app for healthcare professionals that calculated dosages based on patient weight, age, and renal function without affiliation to any medical institution.",
65
- "whatAppleSaid": "Guideline 1.4.2 - Safety - Medical: Your app provides drug dosage calculations. Per App Store Review Guidelines, drug dosage calculators must come from the drug manufacturer, a hospital, university, health insurance company, pharmacy, or other approved entity. We are unable to accept drug dosage calculators from independent developers due to the potential risk to patient safety.",
66
- "fix": "The developer partnered with a university hospital's pharmacy department, which agreed to co-publish the app under the hospital's developer account with clinical pharmacist review and validation of all dosage formulas.",
67
- "outcome": "approved-after-fix",
68
- "keywords": ["medical", "drug-dosage", "calculator", "institution", "healthcare", "patient-safety"],
69
- "behavioralSignals": ["app calculates drug dosages", "independent developer account", "no institutional affiliation", "medical calculations without clinical oversight"],
70
- "year": 2022
71
- },
72
- {
73
- "id": "missing-age-rating-violence-gambling",
74
- "guidelineNumber": "1.1",
75
- "guidelineName": "Objectionable Content",
76
- "category": "safety",
77
- "rejectionReason": "Your app contains content that requires a higher age rating than what is currently set in App Store Connect.",
78
- "whatDeveloperDid": "Published a card game app with simulated gambling mechanics (poker chips, betting) and cartoon combat violence, but set the age rating to 4+ in App Store Connect without properly answering the content description questionnaire.",
79
- "whatAppleSaid": "Guideline 1.1 - Safety - Objectionable Content: Your app contains simulated gambling and frequent/intense cartoon violence, but the age rating is set to 4+. You must update your age rating in App Store Connect to accurately reflect the content in your app. Please review the content descriptions and adjust accordingly.",
80
- "fix": "Updated the App Store Connect age rating questionnaire to accurately reflect simulated gambling (selecting 'Frequent/Intense') and cartoon violence (selecting 'Frequent/Intense'), which raised the age rating to 12+.",
81
- "outcome": "approved-after-fix",
82
- "keywords": ["age-rating", "violence", "gambling", "content-rating", "app-store-connect"],
83
- "behavioralSignals": ["app contains gambling mechanics", "violence present in gameplay", "age rating set too low", "content questionnaire answered incorrectly"],
84
- "year": 2023
85
- },
86
- {
87
- "id": "tinyco-kids-email-collection-ftc",
88
- "guidelineNumber": "1.3",
89
- "guidelineName": "Kids Category",
90
- "category": "safety",
91
- "rejectionReason": "App collected children's email addresses for in-game rewards without verifiable parental consent.",
92
- "whatDeveloperDid": "TinyCo's kids games prompted children to enter their email addresses to receive virtual game items and rewards, collecting personal information from minors without obtaining verifiable parental consent as required by COPPA.",
93
- "whatAppleSaid": "This case resulted in an FTC settlement rather than a standard App Review rejection. The FTC found TinyCo violated COPPA by collecting children's email addresses without parental consent. Apple subsequently tightened enforcement of Guideline 1.3 for all Kids Category apps.",
94
- "fix": "TinyCo paid a $300,000 FTC settlement and removed all email collection prompts from kids games. Implemented age-gating and parental consent flows for any data collection. This case became a precedent for stricter Kids Category enforcement.",
95
- "outcome": "approved-after-fix",
96
- "keywords": ["kids-category", "email-collection", "coppa", "ftc", "parental-consent", "children-privacy"],
97
- "behavioralSignals": ["email input field in kids game", "rewards requiring personal info", "no parental consent gate", "children's data collection"],
98
- "year": 2014
99
- },
100
- {
101
- "id": "ninjawords-dictionary-vulgar-terms",
102
- "guidelineNumber": "1.1.1",
103
- "guidelineName": "Objectionable Content - Defamatory or Mean-Spirited",
104
- "category": "safety",
105
- "rejectionReason": "Your app contains objectionable content including vulgar and profane language.",
106
- "whatDeveloperDid": "Ninjawords, a dictionary app, was rejected because it contained definitions for vulgar and profane words. The developer had to strip out thousands of dictionary entries that Apple deemed objectionable, even though the app was a reference dictionary.",
107
- "whatAppleSaid": "Your application contains content that many audiences would find objectionable. Specifically, the dictionary includes definitions for terms that are vulgar, profane, and sexually explicit in nature. You must remove this content or implement a content filter.",
108
- "fix": "The developer removed objectionable word definitions from the dictionary database and submitted a censored version. This case sparked public controversy about Apple's content policies, as critics argued a dictionary should be allowed to define all words. Apple later softened its stance on reference content when properly age-rated.",
109
- "outcome": "approved-after-fix",
110
- "keywords": ["dictionary", "objectionable-content", "profanity", "censorship", "reference-app"],
111
- "behavioralSignals": ["dictionary with vulgar definitions", "no content filter", "unrestricted word lookup", "profane terms displayed"],
112
- "year": 2009
113
- },
114
- {
115
- "id": "hot-or-not-voting-objectification",
116
- "guidelineNumber": "1.1.1",
117
- "guidelineName": "Objectionable Content - Defamatory or Mean-Spirited",
118
- "category": "safety",
119
- "rejectionReason": "Your app enables users to rate the physical appearance of real people, which is considered mean-spirited and objectionable.",
120
- "whatDeveloperDid": "Built a Hot-or-Not style app where users could upload photos of real people and other users would vote on their attractiveness with a rating system.",
121
- "whatAppleSaid": "Guideline 1.1.1 - Safety - Objectionable Content: Your app allows users to rate the physical appearance of other people, which Apple considers to be mean-spirited and potentially harmful. This type of content that objectifies real individuals is not appropriate for the App Store.",
122
- "fix": "The concept was fundamentally incompatible with Apple's guidelines. The developer pivoted to a photo contest app where users voluntarily submitted their own photos to themed photography challenges judged on artistic merit rather than personal appearance.",
123
- "outcome": "approved-after-fix",
124
- "keywords": ["objectification", "rating-people", "mean-spirited", "hot-or-not", "appearance-rating"],
125
- "behavioralSignals": ["photo rating of real people", "attractiveness voting", "user photos rated by strangers", "appearance-based scoring"],
126
- "year": 2019
127
- },
128
- {
129
- "id": "for-kids-description-not-kids-category",
130
- "guidelineNumber": "1.3",
131
- "guidelineName": "Kids Category",
132
- "category": "safety",
133
- "rejectionReason": "Your app references being designed for kids in its metadata but is not published in the Kids Category.",
134
- "whatDeveloperDid": "Published an app outside the Kids Category but included phrases like 'perfect for kids' and 'designed for children ages 3-8' in the app description and marketing text. The app also did not comply with Kids Category data collection restrictions.",
135
- "whatAppleSaid": "Guideline 1.3 - Safety - Kids Category: Your app's metadata indicates it is designed for children, but it is not published in the Kids Category. Apps that are designed specifically for children must be published in the Kids Category and must comply with all Kids Category requirements, including restrictions on data collection, third-party analytics, and advertising.",
136
- "fix": "The developer had two choices: either move the app to the Kids Category and comply with all Kids Category requirements (removing third-party analytics, advertising, and external links), or remove all references to children from the app description and metadata. They chose to move to the Kids Category and strip out non-compliant SDKs.",
137
- "outcome": "approved-after-fix",
138
- "keywords": ["kids-category", "metadata", "children", "app-description", "category-mismatch"],
139
- "behavioralSignals": ["app description mentions kids", "not in Kids Category", "child-oriented content outside Kids Category", "metadata references children"],
140
- "year": 2022
141
- },
142
- {
143
- "id": "kids-app-third-party-advertising",
144
- "guidelineNumber": "1.3",
145
- "guidelineName": "Kids Category",
146
- "category": "safety",
147
- "rejectionReason": "Your Kids Category app includes third-party advertising which is not permitted.",
148
- "whatDeveloperDid": "Published a children's coloring book app in the Kids Category that displayed AdMob banner ads and interstitial ads between activities. The ads were not age-appropriate and included tracking.",
149
- "whatAppleSaid": "Guideline 1.3 - Safety - Kids Category: Your app includes third-party advertising (Google AdMob) in a Kids Category app. Apps in the Kids Category may not include third-party advertising or analytics. All ads in Kids Category apps must be appropriate for children and must not include behavioral targeting or tracking.",
150
- "fix": "Removed Google AdMob SDK entirely. Switched to a premium paid model with no ads. For developers who need ad revenue in Kids Category apps, Apple requires using Apple's own advertising framework (SKAdNetwork) with certified kid-safe ad content from Apple-approved networks.",
151
- "outcome": "approved-after-fix",
152
- "keywords": ["kids-category", "advertising", "admob", "third-party-ads", "children", "ad-tracking"],
153
- "behavioralSignals": ["ads displayed in kids app", "AdMob SDK detected", "interstitial ads between activities", "behavioral ad targeting in children's app"],
154
- "year": 2023
155
- },
156
- {
157
- "id": "ugc-app-no-terms-of-service",
158
- "guidelineNumber": "1.2",
159
- "guidelineName": "User-Generated Content",
160
- "category": "safety",
161
- "rejectionReason": "Your app with user-generated content does not include terms of service that users must agree to.",
162
- "whatDeveloperDid": "Built a community forum app where users could post text and images but did not include any terms of service, community guidelines, or content policy that users were required to accept before participating.",
163
- "whatAppleSaid": "Guideline 1.2 - Safety - User-Generated Content: Your app enables users to share content but does not include published terms of service or community guidelines. Apps with user-generated content must include terms that clearly state what content is not acceptable and the consequences of violations.",
164
- "fix": "Added a Terms of Service and Community Guidelines document within the app. Implemented a mandatory acceptance flow during onboarding where users must agree to the terms before being able to post content. Added a link to the terms in the app settings.",
165
- "outcome": "approved-after-fix",
166
- "keywords": ["ugc", "terms-of-service", "community-guidelines", "content-policy", "user-agreement"],
167
- "behavioralSignals": ["no terms of service visible", "users can post without accepting rules", "missing content policy", "no community guidelines"],
168
- "year": 2023
169
- },
170
- {
171
- "id": "medical-app-no-disclaimers",
172
- "guidelineNumber": "1.4.1",
173
- "guidelineName": "Medical - Physical Harm",
174
- "category": "safety",
175
- "rejectionReason": "Your medical app does not include appropriate disclaimers about the limitations of its health-related information.",
176
- "whatDeveloperDid": "Created a symptom checker app that provided potential diagnoses based on user-entered symptoms without any medical disclaimers, warnings that the information is not a substitute for professional medical advice, or recommendation to consult a healthcare provider.",
177
- "whatAppleSaid": "Guideline 1.4.1 - Safety - Physical Harm: Your app provides medical information and symptom analysis without appropriate disclaimers. Medical apps must clearly indicate that the information provided is not intended to replace professional medical advice, diagnosis, or treatment. You must include prominent disclaimers throughout the app.",
178
- "fix": "Added a prominent disclaimer on the app's launch screen and before every symptom analysis result stating 'This app is for informational purposes only and is not a substitute for professional medical advice. Always consult a qualified healthcare provider.' Also added a persistent disclaimer banner on all diagnosis result screens.",
179
- "outcome": "approved-after-fix",
180
- "keywords": ["medical", "disclaimers", "symptom-checker", "health", "diagnosis", "patient-safety"],
181
- "behavioralSignals": ["medical advice without disclaimers", "symptom checker with no warnings", "health app missing liability notice", "diagnosis results without professional consultation reminder"],
182
- "year": 2022
183
- },
184
- {
185
- "id": "tobacco-alcohol-no-age-gate",
186
- "guidelineNumber": "1.1.5",
187
- "guidelineName": "Objectionable Content - Age-Restricted Content",
188
- "category": "safety",
189
- "rejectionReason": "Your app promotes tobacco and/or alcohol products without implementing an age verification gate.",
190
- "whatDeveloperDid": "Built a craft beer discovery app that showcased various alcohol brands, included purchasing links, and featured tobacco-related lifestyle content without any age verification or age gate on app launch.",
191
- "whatAppleSaid": "Guideline 1.1.5 - Safety - Objectionable Content: Your app facilitates the sale or promotion of tobacco and alcohol products but does not include an age gate. Apps that promote or sell age-restricted products must include an appropriate age verification mechanism to ensure users meet the minimum legal age requirements.",
192
- "fix": "Implemented an age gate on first launch requiring users to confirm they are of legal drinking age (21+ in US). Added date-of-birth verification with persistent storage so users only need to verify once. Also added age-appropriate content warnings on alcohol-related pages.",
193
- "outcome": "approved-after-fix",
194
- "keywords": ["age-gate", "alcohol", "tobacco", "age-verification", "age-restricted", "legal-age"],
195
- "behavioralSignals": ["alcohol content displayed without age check", "no age verification on launch", "tobacco promotion without gate", "purchasing links for age-restricted products"],
196
- "year": 2023
197
- },
198
- {
199
- "id": "social-media-no-content-reporting",
200
- "guidelineNumber": "1.2",
201
- "guidelineName": "User-Generated Content",
202
- "category": "safety",
203
- "rejectionReason": "Your social media app does not include a mechanism for users to report objectionable content.",
204
- "whatDeveloperDid": "Launched a photo-sharing social media app with commenting and messaging features but only included content moderation on the backend. There was no user-facing way to report posts, comments, or other users for objectionable content.",
205
- "whatAppleSaid": "Guideline 1.2 - Safety - User-Generated Content: Your app includes user-generated content features such as photo sharing and commenting but does not provide a mechanism for users to report objectionable content and abusive users. You must implement a reporting mechanism that is easily accessible to users.",
206
- "fix": "Added a three-dot menu on every post and comment with a 'Report' option. Added a 'Report User' button on user profiles. Implemented a report flow with categories (spam, harassment, inappropriate content, etc.) and confirmation. Also added an in-app content moderation dashboard for the team.",
207
- "outcome": "approved-after-fix",
208
- "keywords": ["social-media", "content-reporting", "ugc", "moderation", "report-mechanism", "abuse-reporting"],
209
- "behavioralSignals": ["no report button on posts", "no way to report users", "content moderation only backend", "missing user-facing reporting"],
210
- "year": 2024
211
- }
212
- ]