@forvibe/cli 1.1.1 → 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.
- package/dist/engine/data/bundle.appstore.json +10098 -0
- package/dist/index.js +3454 -370
- package/package.json +6 -3
- package/dist/review/rag-data/business.json +0 -282
- package/dist/review/rag-data/common-pitfalls.json +0 -212
- package/dist/review/rag-data/design.json +0 -212
- package/dist/review/rag-data/legal.json +0 -212
- package/dist/review/rag-data/performance.json +0 -282
- package/dist/review/rag-data/safety.json +0 -212
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"id": "webview-wrapper-app-no-native",
|
|
4
|
-
"guidelineNumber": "4.2",
|
|
5
|
-
"guidelineName": "Minimum Functionality",
|
|
6
|
-
"category": "design",
|
|
7
|
-
"rejectionReason": "Your app is primarily a repackaged website using a web view, without sufficient native iOS functionality.",
|
|
8
|
-
"whatDeveloperDid": "Submitted an app that was essentially a WKWebView loading the company's responsive website. The app had no native UI elements, no offline functionality, no push notifications, and no device-specific features. It was indistinguishable from visiting the website in Safari.",
|
|
9
|
-
"whatAppleSaid": "Guideline 4.2 - Design - Minimum Functionality: Your app is essentially a repackaged version of your website. We encourage you to review your app concept and incorporate native iOS features and functionality. Apps that are simply web views of a website are not appropriate for the App Store. Consider using Safari or creating a Home Screen bookmark instead.",
|
|
10
|
-
"fix": "Added native iOS features: push notifications for order updates, Face ID authentication, native navigation with tab bar, offline caching of key content, Haptic feedback on interactions, widgets for quick access, and Shortcuts integration. Converted critical screens (login, checkout, profile) to native SwiftUI views.",
|
|
11
|
-
"outcome": "approved-after-fix",
|
|
12
|
-
"keywords": ["webview", "wrapper", "wkwebview", "website", "minimum-functionality", "native-features"],
|
|
13
|
-
"behavioralSignals": ["entire app is a web view", "no native UI elements", "identical to mobile website", "no offline capability", "no device-specific features"],
|
|
14
|
-
"year": 2024
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"id": "church-info-app-static-content",
|
|
18
|
-
"guidelineNumber": "4.2",
|
|
19
|
-
"guidelineName": "Minimum Functionality",
|
|
20
|
-
"category": "design",
|
|
21
|
-
"rejectionReason": "Your app provides only static information that would be better suited as a website.",
|
|
22
|
-
"whatDeveloperDid": "Created a church information app that displayed static content: service times, address, staff directory, and a few pages of text about the church. No dynamic features, no community interaction, no event calendar updates, and no push notifications.",
|
|
23
|
-
"whatAppleSaid": "Guideline 4.2 - Design - Minimum Functionality: Your app provides limited functionality that could be accomplished with a website. The static information displayed (service times, address, staff bios) does not provide a compelling native app experience. We encourage you to add features that take advantage of the device's capabilities.",
|
|
24
|
-
"fix": "Added dynamic features: live-updating event calendar with push notification reminders, sermon audio/video streaming with offline downloads, community prayer request board (with UGC moderation), in-app giving via IAP, location-based check-in, and an interactive Bible study feature with notes.",
|
|
25
|
-
"outcome": "approved-after-fix",
|
|
26
|
-
"keywords": ["minimum-functionality", "static-content", "church-app", "information-only", "limited-features"],
|
|
27
|
-
"behavioralSignals": ["only static text pages", "no dynamic content", "information-only app", "no interactive features", "could be a website"],
|
|
28
|
-
"year": 2023
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"id": "ionic-react-native-too-web-like",
|
|
32
|
-
"guidelineNumber": "4.2",
|
|
33
|
-
"guidelineName": "Minimum Functionality",
|
|
34
|
-
"category": "design",
|
|
35
|
-
"rejectionReason": "Your app's user interface appears to be a web-based experience that does not follow iOS design conventions.",
|
|
36
|
-
"whatDeveloperDid": "Built an app using Ionic/React Native that retained many web-like UI patterns: browser-style back buttons, web-style dropdown selects, non-native scrolling behavior, text inputs without iOS keyboard accessories, and hamburger menu instead of tab bar navigation.",
|
|
37
|
-
"whatAppleSaid": "Guideline 4.2 - Design - Minimum Functionality: Your app's user interface does not provide an experience that is consistent with the quality and design expectations of the App Store. The app appears to use web-based UI components that do not conform to iOS Human Interface Guidelines. Please review the iOS Human Interface Guidelines and ensure your app provides a native-quality experience.",
|
|
38
|
-
"fix": "Replaced web-style components with native-looking equivalents: used bottom tab navigation instead of hamburger menu, native-style action sheets instead of web dropdowns, proper iOS navigation bar with back chevron, native scrolling with rubber-banding, and iOS-style form inputs with proper keyboard handling.",
|
|
39
|
-
"outcome": "approved-after-fix",
|
|
40
|
-
"keywords": ["hybrid-app", "ionic", "react-native", "web-like", "ui-quality", "native-experience"],
|
|
41
|
-
"behavioralSignals": ["web-style UI components", "hamburger menu navigation", "non-native scrolling", "browser-style controls", "web dropdown selects"],
|
|
42
|
-
"year": 2023
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"id": "spam-duplicate-app-rxmarbles",
|
|
46
|
-
"guidelineNumber": "4.3",
|
|
47
|
-
"guidelineName": "Spam",
|
|
48
|
-
"category": "design",
|
|
49
|
-
"rejectionReason": "Your app is a duplicate of another app and does not provide a unique experience.",
|
|
50
|
-
"whatDeveloperDid": "Submitted an app that was a fork of the open-source RxMarbles app with the same binary, same functionality, and only cosmetic changes (icon color). The app was submitted from a different developer account than the original.",
|
|
51
|
-
"whatAppleSaid": "Guideline 4.3 - Design - Spam: Your app duplicates the content and functionality of another app already on the App Store (RxMarbles). Submitting multiple similar apps or copycat versions of popular apps is considered spam. Please ensure your app provides a unique, innovative experience.",
|
|
52
|
-
"fix": "This rejection is not easily fixable since the app was fundamentally a duplicate. The developer would need to create a genuinely unique app with different functionality and value proposition. Simply changing the skin or branding of an existing app is insufficient.",
|
|
53
|
-
"outcome": "rejected-permanently",
|
|
54
|
-
"keywords": ["spam", "duplicate", "copycat", "fork", "clone", "same-binary"],
|
|
55
|
-
"behavioralSignals": ["identical functionality to existing app", "same binary different account", "fork of open-source app", "only cosmetic differences"],
|
|
56
|
-
"year": 2020
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"id": "sora-copycat-clones-removed",
|
|
60
|
-
"guidelineNumber": "4.3",
|
|
61
|
-
"guidelineName": "Spam",
|
|
62
|
-
"category": "design",
|
|
63
|
-
"rejectionReason": "Your app impersonates or copies another developer's app or service.",
|
|
64
|
-
"whatDeveloperDid": "After OpenAI announced Sora (AI video generation), dozens of copycat apps appeared on the App Store with names like 'Sora 2 AI Video', 'Sora Video Generator Pro', and similar variations. These apps used the Sora name and branding to mislead users, often charging subscriptions for unrelated or non-functional AI services.",
|
|
65
|
-
"whatAppleSaid": "Guideline 4.3 - Design - Spam: Your app appears to impersonate or misleadingly suggest an affiliation with another developer's product (Sora/OpenAI). Apps that copy the name, branding, or concept of another product to mislead users are not permitted on the App Store.",
|
|
66
|
-
"fix": "These apps were removed from the App Store. Apple conducted a mass removal of Sora copycat apps. Developers of legitimate AI video tools need to use original branding that does not suggest affiliation with OpenAI or Sora.",
|
|
67
|
-
"outcome": "rejected-permanently",
|
|
68
|
-
"keywords": ["copycat", "impersonation", "sora", "clone", "misleading", "brand-infringement"],
|
|
69
|
-
"behavioralSignals": ["uses another product's name", "misleading branding", "suggests false affiliation", "copies popular product"],
|
|
70
|
-
"year": 2024
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
"id": "android-style-buttons-ui",
|
|
74
|
-
"guidelineNumber": "4.1",
|
|
75
|
-
"guidelineName": "Copycats",
|
|
76
|
-
"category": "design",
|
|
77
|
-
"rejectionReason": "Your app's UI elements are inconsistent with iOS design patterns and appear to follow Android design conventions.",
|
|
78
|
-
"whatDeveloperDid": "Ported an Android app to iOS but kept Android-style Material Design UI elements: floating action buttons (FAB), Android-style bottom sheets, Material Design text fields with floating labels, three-dot overflow menus, and Android-style toggle switches.",
|
|
79
|
-
"whatAppleSaid": "Guideline 4.0 - Design: Your app's user interface does not follow iOS design conventions. Several UI elements appear to be designed for another platform. Please review the iOS Human Interface Guidelines and update your app's interface to provide an experience consistent with the iOS platform.",
|
|
80
|
-
"fix": "Replaced Android-style UI elements with iOS equivalents: FAB became a navigation bar '+' button, Material bottom sheets became iOS sheet presentations, floating label text fields became standard iOS text fields, three-dot menus became iOS ellipsis menus or swipe actions, and toggle switches were replaced with UISwitch.",
|
|
81
|
-
"outcome": "approved-after-fix",
|
|
82
|
-
"keywords": ["android-ui", "material-design", "platform-consistency", "ios-guidelines", "ui-elements"],
|
|
83
|
-
"behavioralSignals": ["floating action button", "Material Design components", "Android-style navigation", "non-iOS toggle switches", "three-dot overflow menu"],
|
|
84
|
-
"year": 2022
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
"id": "sign-in-with-apple-missing",
|
|
88
|
-
"guidelineNumber": "4.8",
|
|
89
|
-
"guidelineName": "Sign in with Apple",
|
|
90
|
-
"category": "design",
|
|
91
|
-
"rejectionReason": "Your app uses third-party social login but does not offer Sign in with Apple as an option.",
|
|
92
|
-
"whatDeveloperDid": "Implemented Google Sign-In and Facebook Login as authentication options but did not include Sign in with Apple. Since June 2020, apps that offer third-party social login must also offer Sign in with Apple as an equivalent option.",
|
|
93
|
-
"whatAppleSaid": "Guideline 4.8 - Design - Sign in with Apple: Your app uses third-party login services (Google, Facebook) but does not offer Sign in with Apple. Apps that use a third-party or social login service to set up or authenticate the user's primary account must also offer Sign in with Apple as an equivalent option.",
|
|
94
|
-
"fix": "Added Sign in with Apple as a login option alongside Google and Facebook. Implemented the AuthenticationServices framework with ASAuthorizationAppleIDProvider. Ensured the Sign in with Apple button is displayed with equal prominence to other login options.",
|
|
95
|
-
"outcome": "approved-after-fix",
|
|
96
|
-
"keywords": ["sign-in-with-apple", "social-login", "authentication", "google-login", "facebook-login"],
|
|
97
|
-
"behavioralSignals": ["Google/Facebook login without Apple login", "third-party login without SIWA", "missing Sign in with Apple button", "social login options incomplete"],
|
|
98
|
-
"year": 2023
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
"id": "sign-in-with-apple-wrong-style",
|
|
102
|
-
"guidelineNumber": "4.8",
|
|
103
|
-
"guidelineName": "Sign in with Apple",
|
|
104
|
-
"category": "design",
|
|
105
|
-
"rejectionReason": "Your Sign in with Apple button does not follow Apple's Human Interface Guidelines for button styling.",
|
|
106
|
-
"whatDeveloperDid": "Implemented Sign in with Apple but used a custom-styled button that didn't match Apple's required design specifications. The button was too small, used a custom font, had rounded corners that didn't match the spec, and was placed below other login options in a smaller size.",
|
|
107
|
-
"whatAppleSaid": "Guideline 4.8 - Design - Sign in with Apple: Your Sign in with Apple button does not conform to the required design specifications. The button must use Apple's provided styles (ASAuthorizationAppleIDButton), be at least the same size as other login buttons, and follow the Human Interface Guidelines for Sign in with Apple button design.",
|
|
108
|
-
"fix": "Replaced the custom button with Apple's native ASAuthorizationAppleIDButton, which automatically handles correct styling, sizing, and localization. Ensured the button is the same size or larger than other login buttons and is positioned with equal prominence on the login screen.",
|
|
109
|
-
"outcome": "approved-after-fix",
|
|
110
|
-
"keywords": ["sign-in-with-apple", "button-style", "hig", "design-guidelines", "authentication"],
|
|
111
|
-
"behavioralSignals": ["custom SIWA button", "undersized Apple login button", "non-standard button styling", "Apple login less prominent than others"],
|
|
112
|
-
"year": 2022
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
"id": "apple-ip-springboard-image",
|
|
116
|
-
"guidelineNumber": "4.5.3",
|
|
117
|
-
"guidelineName": "Apple Trademarks and IP",
|
|
118
|
-
"category": "design",
|
|
119
|
-
"rejectionReason": "Your app uses Apple's copyrighted imagery without authorization.",
|
|
120
|
-
"whatDeveloperDid": "Used a screenshot of the iOS home screen (SpringBoard) as a background image in the app's onboarding tutorial. The screenshot included Apple's copyrighted wallpaper, app icons, and the dock design.",
|
|
121
|
-
"whatAppleSaid": "Guideline 4.5.3 - Design - Apple Trademarks: Your app uses Apple's copyrighted material (iOS home screen screenshot including SpringBoard interface and Apple app icons). You may not use Apple-owned images, icons, or screenshots of Apple software in your app without explicit permission.",
|
|
122
|
-
"fix": "Replaced the iOS home screen screenshot with a custom-designed illustration that conveys the same tutorial concept without using Apple's copyrighted imagery. Used generic device mockups from Apple's official marketing resources (which are permitted for certain uses) or created original artwork.",
|
|
123
|
-
"outcome": "approved-after-fix",
|
|
124
|
-
"keywords": ["apple-ip", "trademark", "copyright", "springboard", "home-screen", "apple-images"],
|
|
125
|
-
"behavioralSignals": ["iOS home screen screenshot in app", "Apple wallpaper used", "Apple app icons displayed", "copyrighted Apple UI elements"],
|
|
126
|
-
"year": 2022
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
"id": "app-too-similar-built-in-app",
|
|
130
|
-
"guidelineNumber": "4.2",
|
|
131
|
-
"guidelineName": "Minimum Functionality",
|
|
132
|
-
"category": "design",
|
|
133
|
-
"rejectionReason": "Your app provides functionality that is too similar to built-in iOS apps without providing additional unique value.",
|
|
134
|
-
"whatDeveloperDid": "Created a simple calculator app and a flashlight app that replicated the exact functionality of iOS built-in apps without any additional features, customization options, or unique value proposition.",
|
|
135
|
-
"whatAppleSaid": "Guideline 4.2 - Design - Minimum Functionality: Your app replicates the functionality of a built-in iOS app (Calculator/Flashlight) without providing additional unique value. Simple utility apps that duplicate built-in capabilities are not appropriate for the App Store unless they offer significant additional functionality.",
|
|
136
|
-
"fix": "For the calculator: added scientific calculator mode, unit conversion, calculation history, custom themes, and a widget. For the flashlight: added SOS mode, color filters, strobe patterns, screen color options, and an ambient light meter. The apps now offer meaningful functionality beyond the built-in equivalents.",
|
|
137
|
-
"outcome": "approved-after-fix",
|
|
138
|
-
"keywords": ["built-in-app", "calculator", "flashlight", "duplicate-functionality", "minimum-value"],
|
|
139
|
-
"behavioralSignals": ["replicates built-in app", "no features beyond system app", "basic utility clone", "no unique value proposition"],
|
|
140
|
-
"year": 2021
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
"id": "simple-app-not-unique",
|
|
144
|
-
"guidelineNumber": "4.2",
|
|
145
|
-
"guidelineName": "Minimum Functionality",
|
|
146
|
-
"category": "design",
|
|
147
|
-
"rejectionReason": "Your app does not provide a unique or innovative experience and lacks sufficient functionality.",
|
|
148
|
-
"whatDeveloperDid": "Submitted a very simple app with a single screen that performed one basic function (e.g., a tip calculator with just a percentage slider and total display) without any additional features, customization, or polish.",
|
|
149
|
-
"whatAppleSaid": "Guideline 4.2 - Design - Minimum Functionality: Your app does not include sufficient content or functionality to provide a compelling App Store experience. We encourage you to review your app concept and add more features and content to provide value to users.",
|
|
150
|
-
"fix": "Expanded the app with multiple features: bill splitting, custom tip presets, receipt scanning, expense history, group dining calculations, Apple Watch companion, and widgets. The app evolved from a single-function utility to a comprehensive dining expense tool.",
|
|
151
|
-
"outcome": "approved-after-fix",
|
|
152
|
-
"keywords": ["minimum-functionality", "simple-app", "insufficient-features", "single-function", "not-unique"],
|
|
153
|
-
"behavioralSignals": ["single-screen app", "one basic function", "no settings or customization", "minimal feature set"],
|
|
154
|
-
"year": 2023
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
"id": "ui-elements-too-small",
|
|
158
|
-
"guidelineNumber": "4.0",
|
|
159
|
-
"guidelineName": "Design",
|
|
160
|
-
"category": "design",
|
|
161
|
-
"rejectionReason": "Your app's interactive elements are too small for comfortable touch interaction.",
|
|
162
|
-
"whatDeveloperDid": "Designed an app with very small buttons (less than 44x44 points), tiny text (below 11pt), and densely packed interactive elements that were difficult to tap accurately on iPhone screens.",
|
|
163
|
-
"whatAppleSaid": "Guideline 4.0 - Design: Your app includes interactive elements that are too small for reliable touch interaction. Per Human Interface Guidelines, tappable elements should have a minimum target size of 44x44 points. Several buttons and links in your app are significantly below this minimum.",
|
|
164
|
-
"fix": "Increased all tappable elements to at least 44x44 points. Increased body text to at least 13pt and added Dynamic Type support. Added proper spacing between interactive elements. Tested on the smallest supported iPhone screen size to ensure all elements are comfortably tappable.",
|
|
165
|
-
"outcome": "approved-after-fix",
|
|
166
|
-
"keywords": ["touch-targets", "small-buttons", "accessibility", "ui-size", "hig", "readability"],
|
|
167
|
-
"behavioralSignals": ["tiny buttons", "small text", "densely packed UI", "hard to tap elements", "poor readability"],
|
|
168
|
-
"year": 2023
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
"id": "missing-localization-launch-images",
|
|
172
|
-
"guidelineNumber": "4.0",
|
|
173
|
-
"guidelineName": "Design",
|
|
174
|
-
"category": "design",
|
|
175
|
-
"rejectionReason": "Your app's launch screen displays content in a different language than the app's primary localization.",
|
|
176
|
-
"whatDeveloperDid": "Created a Japanese-language app but the LaunchScreen.storyboard contained English text ('Loading...', company name in English). The launch screen language didn't match the app's primary language, creating an inconsistent first impression.",
|
|
177
|
-
"whatAppleSaid": "Guideline 4.0 - Design: Your app's launch screen contains text in English, but the app's primary language is Japanese. The launch screen should be consistent with the app's primary language and localization.",
|
|
178
|
-
"fix": "Localized the LaunchScreen.storyboard to display Japanese text. Best practice: use a minimal launch screen with just the app logo/icon without text to avoid localization issues entirely, matching Apple's own app launch screens.",
|
|
179
|
-
"outcome": "approved-after-fix",
|
|
180
|
-
"keywords": ["localization", "launch-screen", "language-mismatch", "internationalization", "storyboard"],
|
|
181
|
-
"behavioralSignals": ["launch screen in wrong language", "English text in localized app", "language inconsistency on launch"],
|
|
182
|
-
"year": 2022
|
|
183
|
-
},
|
|
184
|
-
{
|
|
185
|
-
"id": "macos-window-management-no-reopen",
|
|
186
|
-
"guidelineNumber": "4.0",
|
|
187
|
-
"guidelineName": "Design",
|
|
188
|
-
"category": "design",
|
|
189
|
-
"rejectionReason": "Your macOS app does not properly handle window management. Closing all windows provides no way to create a new window.",
|
|
190
|
-
"whatDeveloperDid": "Built a macOS Catalyst or native macOS app that, when the user closed all windows, had no File > New Window menu item and no dock icon click handler to reopen the main window. The app was running but had no visible UI and no way to get back to it.",
|
|
191
|
-
"whatAppleSaid": "Guideline 4.0 - Design: Your macOS app does not properly handle window management. After closing the app's window, there is no menu option to reopen or create a new window. Users expect to be able to click the dock icon or use the File menu to access the app again.",
|
|
192
|
-
"fix": "Implemented applicationShouldHandleReopen(_:hasVisibleWindows:) delegate method to show the main window when the dock icon is clicked. Added File > New Window menu item. Ensured the app activates and shows the main window when launched via Spotlight or dock.",
|
|
193
|
-
"outcome": "approved-after-fix",
|
|
194
|
-
"keywords": ["macos", "window-management", "dock", "menu-bar", "catalyst", "reopen"],
|
|
195
|
-
"behavioralSignals": ["no way to reopen window", "closing window loses app", "missing File menu items", "dock click does nothing"],
|
|
196
|
-
"year": 2023
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
"id": "clunky-ui-spelling-grammar-errors",
|
|
200
|
-
"guidelineNumber": "4.0",
|
|
201
|
-
"guidelineName": "Design",
|
|
202
|
-
"category": "design",
|
|
203
|
-
"rejectionReason": "Your app's interface has significant quality issues including spelling errors, grammar mistakes, and unpolished UI elements.",
|
|
204
|
-
"whatDeveloperDid": "Submitted an app with multiple spelling errors in button labels and navigation titles, grammatically incorrect alert messages, inconsistent font sizes, misaligned UI elements, and truncated text that made the app feel unfinished and unprofessional.",
|
|
205
|
-
"whatAppleSaid": "Guideline 4.0 - Design: Your app's user interface has quality issues that affect the user experience. We found multiple spelling errors ('Settigns', 'Purchse'), grammatically incorrect messages, truncated labels, and misaligned elements. Please polish your app's interface before resubmitting.",
|
|
206
|
-
"fix": "Conducted a thorough UI review: fixed all spelling and grammar errors, ensured consistent typography, fixed all layout and alignment issues, tested on all screen sizes to prevent truncation, and had a native speaker review all user-facing text.",
|
|
207
|
-
"outcome": "approved-after-fix",
|
|
208
|
-
"keywords": ["ui-quality", "spelling-errors", "grammar", "polish", "unfinished", "typography"],
|
|
209
|
-
"behavioralSignals": ["spelling errors in buttons", "grammar mistakes in alerts", "truncated text", "misaligned elements", "inconsistent fonts"],
|
|
210
|
-
"year": 2023
|
|
211
|
-
}
|
|
212
|
-
]
|
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"id": "missing-privacy-info-xcprivacy",
|
|
4
|
-
"guidelineNumber": "5.1.2",
|
|
5
|
-
"guidelineName": "Data Use and Sharing - Required Reason APIs",
|
|
6
|
-
"category": "legal",
|
|
7
|
-
"rejectionReason": "Your app does not include the required PrivacyInfo.xcprivacy manifest file.",
|
|
8
|
-
"whatDeveloperDid": "Submitted an app without the PrivacyInfo.xcprivacy file, which became mandatory for all apps submitted after February 2025. The app used Required Reason APIs (UserDefaults, file timestamp access, disk space) without declaring the reasons in a privacy manifest.",
|
|
9
|
-
"whatAppleSaid": "ITMS-91053: Missing API declaration - Your app's code in the binary references one or more APIs that require reasons. Starting February 2025, all apps must include a PrivacyInfo.xcprivacy file that declares the reasons for using Required Reason APIs. Please add the privacy manifest to your app.",
|
|
10
|
-
"fix": "Created a PrivacyInfo.xcprivacy file and added it to the app target's Build Phases > Copy Bundle Resources. Declared all Required Reason API usages with their approved reasons (e.g., NSPrivacyAccessedAPICategoryUserDefaults with reason 'CA92.1' for app functionality). Also ensured all third-party SDKs included their own privacy manifests.",
|
|
11
|
-
"outcome": "approved-after-fix",
|
|
12
|
-
"keywords": ["privacy-manifest", "xcprivacy", "required-reason-api", "privacy-info", "itms-91053"],
|
|
13
|
-
"behavioralSignals": ["missing PrivacyInfo.xcprivacy", "Required Reason API usage without manifest", "ITMS-91053 error on upload", "no privacy declarations"],
|
|
14
|
-
"year": 2025
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"id": "privacy-manifest-not-in-build-phases",
|
|
18
|
-
"guidelineNumber": "5.1.2",
|
|
19
|
-
"guidelineName": "Data Use and Sharing - Required Reason APIs",
|
|
20
|
-
"category": "legal",
|
|
21
|
-
"rejectionReason": "Your PrivacyInfo.xcprivacy file exists in the project but is not included in the app bundle.",
|
|
22
|
-
"whatDeveloperDid": "Created the PrivacyInfo.xcprivacy file and added it to the Xcode project, but forgot to add it to the target's Build Phases > Copy Bundle Resources. The file existed in the project navigator but was not included in the compiled app bundle.",
|
|
23
|
-
"whatAppleSaid": "ITMS-91053: Missing API declaration - Your app references Required Reason APIs but the privacy manifest was not found in the app bundle. Please ensure the PrivacyInfo.xcprivacy file is included in your app's Copy Bundle Resources build phase.",
|
|
24
|
-
"fix": "Added the PrivacyInfo.xcprivacy file to the correct target's Build Phases > Copy Bundle Resources. Verified it was included in the bundle by inspecting the .ipa contents. For frameworks and Swift packages, ensured each target has its own privacy manifest included in the correct location.",
|
|
25
|
-
"outcome": "approved-after-fix",
|
|
26
|
-
"keywords": ["privacy-manifest", "build-phases", "bundle-resources", "xcprivacy", "copy-resources"],
|
|
27
|
-
"behavioralSignals": ["PrivacyInfo.xcprivacy in project but not bundle", "file not in Copy Bundle Resources", "manifest exists but not bundled", "ITMS-91053 despite having file"],
|
|
28
|
-
"year": 2025
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"id": "account-deletion-missing",
|
|
32
|
-
"guidelineNumber": "5.1.1",
|
|
33
|
-
"guidelineName": "Data Collection and Storage - Account Deletion",
|
|
34
|
-
"category": "legal",
|
|
35
|
-
"rejectionReason": "Your app supports account creation but does not offer account deletion.",
|
|
36
|
-
"whatDeveloperDid": "Built an app with user registration and login but did not provide any way for users to delete their account and associated data from within the app. Users had to email support to request account deletion.",
|
|
37
|
-
"whatAppleSaid": "Guideline 5.1.1(v) - Legal - Privacy - Data Collection and Storage: Apps that support account creation must also offer account deletion. Your app allows users to create an account but does not provide the ability to delete the account within the app. The account deletion option must be easy to find and must initiate deletion of the account and all associated personal data.",
|
|
38
|
-
"fix": "Added an 'Delete Account' option in Settings > Account. The deletion flow includes a confirmation dialog explaining what data will be deleted, a re-authentication step for security, and an optional reason selector. Account and all associated data are deleted within 14 days as per Apple's requirements. Also added the AccountDeletionURL in App Store Connect.",
|
|
39
|
-
"outcome": "approved-after-fix",
|
|
40
|
-
"keywords": ["account-deletion", "privacy", "data-deletion", "user-account", "gdpr", "5.1.1"],
|
|
41
|
-
"behavioralSignals": ["no delete account option", "account creation without deletion", "must email support to delete", "no in-app account removal"],
|
|
42
|
-
"year": 2023
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"id": "att-permission-not-appearing-ipad",
|
|
46
|
-
"guidelineNumber": "5.1.2",
|
|
47
|
-
"guidelineName": "Data Use and Sharing",
|
|
48
|
-
"category": "legal",
|
|
49
|
-
"rejectionReason": "The App Tracking Transparency prompt does not appear on iPad during review.",
|
|
50
|
-
"whatDeveloperDid": "Implemented ATT (App Tracking Transparency) permission request, but it only appeared on iPhone. On iPad, the ATT prompt never showed because the app was checking for IDFA availability using an older API that returned different results on iPad, or the prompt was being called before the app was in the active state on iPad.",
|
|
51
|
-
"whatAppleSaid": "Guideline 5.1.2 - Legal - Privacy - Data Use and Sharing: We noticed that your app does not display the App Tracking Transparency permission prompt on iPad. The app appears to collect tracking data without requesting user permission. Please ensure the ATT prompt appears on all supported device types.",
|
|
52
|
-
"fix": "Ensured the ATT prompt is called after the app reaches the active state using applicationDidBecomeActive or sceneDidBecomeActive. Added a delay to ensure the UI is fully loaded before presenting the prompt. Tested on both iPhone and iPad to verify the prompt appears correctly on all devices.",
|
|
53
|
-
"outcome": "approved-after-fix",
|
|
54
|
-
"keywords": ["att", "tracking-transparency", "ipad", "idfa", "permission-prompt", "tracking"],
|
|
55
|
-
"behavioralSignals": ["ATT prompt missing on iPad", "tracking without permission on iPad", "IDFA access without consent", "prompt only shows on iPhone"],
|
|
56
|
-
"year": 2023
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"id": "att-timing-must-be-active",
|
|
60
|
-
"guidelineNumber": "5.1.2",
|
|
61
|
-
"guidelineName": "Data Use and Sharing",
|
|
62
|
-
"category": "legal",
|
|
63
|
-
"rejectionReason": "The App Tracking Transparency prompt is called at an inappropriate time and does not display.",
|
|
64
|
-
"whatDeveloperDid": "Called requestTrackingAuthorization() in application(_:didFinishLaunchingWithOptions:) or during a scene transition, before the app was fully in the foreground active state. The system silently dropped the ATT prompt because the app wasn't yet active.",
|
|
65
|
-
"whatAppleSaid": "Guideline 5.1.2 - Legal - Privacy - Data Use and Sharing: The App Tracking Transparency prompt does not appear when your app is launched. The ATT prompt must be displayed while the app is in the active state. Please ensure you request tracking authorization at an appropriate time after the app has become active.",
|
|
66
|
-
"fix": "Moved the ATT permission request to trigger after the app is fully active and visible. Used a slight delay (e.g., DispatchQueue.main.asyncAfter(deadline: .now() + 1.0)) after applicationDidBecomeActive to ensure the app is ready. Showed the prompt on a meaningful screen (e.g., after onboarding) rather than immediately on launch.",
|
|
67
|
-
"outcome": "approved-after-fix",
|
|
68
|
-
"keywords": ["att", "tracking-transparency", "timing", "app-active", "permission-prompt", "idfa"],
|
|
69
|
-
"behavioralSignals": ["ATT prompt not showing", "permission requested too early", "prompt called before app active", "tracking authorization fails silently"],
|
|
70
|
-
"year": 2022
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
"id": "multiple-permissions-blocking-att",
|
|
74
|
-
"guidelineNumber": "5.1.2",
|
|
75
|
-
"guidelineName": "Data Use and Sharing",
|
|
76
|
-
"category": "legal",
|
|
77
|
-
"rejectionReason": "The App Tracking Transparency prompt is blocked by other permission dialogs.",
|
|
78
|
-
"whatDeveloperDid": "Requested multiple permissions simultaneously on app launch: notifications, location, camera, and ATT. The system queued these permission dialogs, and on some devices/OS versions the ATT prompt was blocked or dismissed by other permission alerts appearing over it.",
|
|
79
|
-
"whatAppleSaid": "Guideline 5.1.2 - Legal - Privacy - Data Use and Sharing: We were unable to see the App Tracking Transparency prompt during our review. It appears that other permission requests may be interfering with the ATT prompt display. Please ensure the ATT prompt is displayed without interference from other system dialogs.",
|
|
80
|
-
"fix": "Implemented a sequential permission request flow that spaces out permission prompts. Request permissions one at a time with appropriate delays between each. Show the ATT prompt on its own screen without other system dialogs. Used a permission queue manager to ensure only one system alert is presented at a time.",
|
|
81
|
-
"outcome": "approved-after-fix",
|
|
82
|
-
"keywords": ["att", "permission-conflicts", "multiple-permissions", "dialog-blocking", "permission-queue"],
|
|
83
|
-
"behavioralSignals": ["multiple permission popups at once", "ATT blocked by other alerts", "permission dialogs overlapping", "simultaneous permission requests"],
|
|
84
|
-
"year": 2023
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
"id": "adjust-sdk-fingerprinting-rejection",
|
|
88
|
-
"guidelineNumber": "5.1.2",
|
|
89
|
-
"guidelineName": "Data Use and Sharing",
|
|
90
|
-
"category": "legal",
|
|
91
|
-
"rejectionReason": "Your app uses a third-party SDK (Adjust) that performs device fingerprinting for tracking purposes.",
|
|
92
|
-
"whatDeveloperDid": "Used the Adjust SDK for attribution tracking. An older version of the SDK performed device fingerprinting (collecting device model, OS version, IP address, locale, and other signals to create a unique identifier) as a fallback when IDFA was unavailable, violating Apple's anti-tracking policies.",
|
|
93
|
-
"whatAppleSaid": "Guideline 5.1.2 - Legal - Privacy - Data Use and Sharing: Your app includes a third-party SDK (Adjust) that collects device and usage data to create a unique identifier for tracking purposes (fingerprinting). Fingerprinting is not permitted regardless of whether the user has granted tracking permission. Over 50,000 apps were affected by this enforcement action.",
|
|
94
|
-
"fix": "Updated the Adjust SDK to the latest version that complies with Apple's anti-fingerprinting requirements. The updated SDK removes fingerprinting fallback mechanisms and relies solely on ATT-consented IDFA or Apple's SKAdNetwork for attribution. Verified with Adjust's compliance documentation.",
|
|
95
|
-
"outcome": "approved-after-fix",
|
|
96
|
-
"keywords": ["adjust", "fingerprinting", "attribution", "tracking", "sdk", "device-fingerprint"],
|
|
97
|
-
"behavioralSignals": ["Adjust SDK fingerprinting", "device identification without consent", "attribution tracking via fingerprint", "outdated tracking SDK"],
|
|
98
|
-
"year": 2024
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
"id": "vague-photo-permission-description",
|
|
102
|
-
"guidelineNumber": "5.1.1",
|
|
103
|
-
"guidelineName": "Data Collection and Storage",
|
|
104
|
-
"category": "legal",
|
|
105
|
-
"rejectionReason": "Your app's photo library permission description does not adequately explain why the app needs access.",
|
|
106
|
-
"whatDeveloperDid": "Set the NSPhotoLibraryUsageDescription to a vague message like 'App requires photo access to function' or 'This app needs your photos' without explaining specifically why the app needs photo library access and how the photos would be used.",
|
|
107
|
-
"whatAppleSaid": "Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage: Your app's permission request descriptions are not sufficiently descriptive. The purpose string for photo library access ('App requires photo access to function') does not clearly explain to users why the app needs this access. Please provide a specific, clear description of how the app uses the photo library.",
|
|
108
|
-
"fix": "Updated NSPhotoLibraryUsageDescription to a specific, clear description: 'YourApp needs access to your photo library to let you select photos for your profile picture and share images in chat conversations.' The description now explains exactly what the photos are used for.",
|
|
109
|
-
"outcome": "approved-after-fix",
|
|
110
|
-
"keywords": ["permission-description", "photo-library", "purpose-string", "privacy", "usage-description"],
|
|
111
|
-
"behavioralSignals": ["vague permission popup text", "generic photo access reason", "unclear usage description", "non-descriptive purpose string"],
|
|
112
|
-
"year": 2023
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
"id": "missing-photo-permission-third-party-sdk",
|
|
116
|
-
"guidelineNumber": "5.1.1",
|
|
117
|
-
"guidelineName": "Data Collection and Storage",
|
|
118
|
-
"category": "legal",
|
|
119
|
-
"rejectionReason": "Your app accesses the photo library without including the required NSPhotoLibraryUsageDescription.",
|
|
120
|
-
"whatDeveloperDid": "The app's own code didn't access the photo library, but a third-party SDK (e.g., an image picker library, chat SDK, or analytics SDK with screenshot detection) included photo library access APIs. The developer didn't add NSPhotoLibraryUsageDescription to Info.plist because they were unaware the SDK accessed photos.",
|
|
121
|
-
"whatAppleSaid": "ITMS-90683: Missing Purpose String in Info.plist - Your app's code references the photo library API but the corresponding purpose string (NSPhotoLibraryUsageDescription) is not present in the Info.plist. All apps that access the photo library must include a purpose string explaining the use.",
|
|
122
|
-
"fix": "Added NSPhotoLibraryUsageDescription to Info.plist with a clear description of how the third-party SDK uses photo access. Audited all third-party SDKs for permission requirements and ensured all required usage descriptions are present. Alternatively, if the photo access was unnecessary, configured the SDK to disable that feature or switched to an SDK that doesn't require photo access.",
|
|
123
|
-
"outcome": "approved-after-fix",
|
|
124
|
-
"keywords": ["photo-permission", "third-party-sdk", "info-plist", "usage-description", "missing-permission"],
|
|
125
|
-
"behavioralSignals": ["ITMS-90683 error", "SDK requires photo access", "missing Info.plist key", "unknown permission requirement from SDK"],
|
|
126
|
-
"year": 2023
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
"id": "vpn-app-content-blocking-rejection",
|
|
130
|
-
"guidelineNumber": "5.4",
|
|
131
|
-
"guidelineName": "VPN Apps",
|
|
132
|
-
"category": "legal",
|
|
133
|
-
"rejectionReason": "Your VPN app uses the VPN capability primarily for content blocking or ad blocking rather than providing a VPN service.",
|
|
134
|
-
"whatDeveloperDid": "Created an app that used the Network Extension VPN entitlement primarily to block ads, trackers, and specific website content by routing traffic through a local VPN tunnel with DNS-level filtering. The app was marketed as an ad blocker rather than a VPN service.",
|
|
135
|
-
"whatAppleSaid": "Guideline 5.4 - Legal - VPN Apps: Your app uses the VPN capability for purposes other than providing a virtual private network service. Using the VPN entitlement primarily for content blocking, ad blocking, or traffic manipulation is not permitted. VPN apps must provide VPN service as their primary function.",
|
|
136
|
-
"fix": "Restructured the app to use Safari Content Blocker extension (Content Blocker API) for ad blocking instead of VPN-based filtering. For DNS-level filtering, used the DNSSettings configuration profile approach. Removed the VPN entitlement since the app's primary purpose was content blocking, not VPN.",
|
|
137
|
-
"outcome": "approved-after-fix",
|
|
138
|
-
"keywords": ["vpn", "ad-blocking", "content-blocking", "network-extension", "dns-filtering"],
|
|
139
|
-
"behavioralSignals": ["VPN used for ad blocking", "local VPN tunnel for filtering", "ad blocker using VPN entitlement", "content blocking via VPN"],
|
|
140
|
-
"year": 2023
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
"id": "privacy-policy-url-broken",
|
|
144
|
-
"guidelineNumber": "5.1.1",
|
|
145
|
-
"guidelineName": "Data Collection and Storage",
|
|
146
|
-
"category": "legal",
|
|
147
|
-
"rejectionReason": "Your app's privacy policy URL leads to a broken page or placeholder content.",
|
|
148
|
-
"whatDeveloperDid": "Provided a privacy policy URL in App Store Connect that returned a 404 error, was a placeholder page ('Coming Soon'), or redirected to the app's homepage without any privacy policy content.",
|
|
149
|
-
"whatAppleSaid": "Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage: The privacy policy URL provided for your app does not lead to a valid privacy policy. The URL returns a 404 error. All apps must provide a working privacy policy URL that is accessible to users.",
|
|
150
|
-
"fix": "Created a proper privacy policy page and hosted it at a stable, permanent URL. Ensured the URL is accessible, loads quickly, and contains a complete privacy policy. Updated the privacy policy URL in App Store Connect and within the app settings.",
|
|
151
|
-
"outcome": "approved-after-fix",
|
|
152
|
-
"keywords": ["privacy-policy", "broken-url", "404", "placeholder", "legal-requirement"],
|
|
153
|
-
"behavioralSignals": ["privacy policy URL returns 404", "placeholder privacy page", "broken link in App Store Connect", "privacy policy not accessible"],
|
|
154
|
-
"year": 2024
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
"id": "privacy-policy-missing-details",
|
|
158
|
-
"guidelineNumber": "5.1.1",
|
|
159
|
-
"guidelineName": "Data Collection and Storage",
|
|
160
|
-
"category": "legal",
|
|
161
|
-
"rejectionReason": "Your privacy policy does not adequately describe the data your app collects and how it is used.",
|
|
162
|
-
"whatDeveloperDid": "Provided a generic one-paragraph privacy policy that did not specify what data the app collects, how it's used, whether it's shared with third parties, data retention periods, or user rights regarding their data.",
|
|
163
|
-
"whatAppleSaid": "Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage: Your privacy policy does not adequately describe your app's data collection and usage practices. The privacy policy must clearly identify what data is collected, how it is used, when it is shared, and the data retention policy. Please update your privacy policy to include these details.",
|
|
164
|
-
"fix": "Rewrote the privacy policy to include: specific types of data collected (personal info, usage data, device info), purposes of data collection, third-party services and SDKs that receive data, data retention and deletion policies, user rights (access, correction, deletion), contact information for privacy inquiries, and effective date.",
|
|
165
|
-
"outcome": "approved-after-fix",
|
|
166
|
-
"keywords": ["privacy-policy", "data-collection", "disclosure", "transparency", "legal-compliance"],
|
|
167
|
-
"behavioralSignals": ["generic privacy policy", "missing data collection details", "no third-party disclosure", "vague privacy terms"],
|
|
168
|
-
"year": 2023
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
"id": "background-location-for-analytics",
|
|
172
|
-
"guidelineNumber": "5.1.2",
|
|
173
|
-
"guidelineName": "Data Use and Sharing",
|
|
174
|
-
"category": "legal",
|
|
175
|
-
"rejectionReason": "Your app accesses location data in the background for analytics purposes rather than a user-facing feature.",
|
|
176
|
-
"whatDeveloperDid": "Requested 'Always' location permission and tracked the user's location in the background to feed location data into an analytics platform for market research, without providing any user-facing feature that required background location.",
|
|
177
|
-
"whatAppleSaid": "Guideline 5.1.2 - Legal - Privacy - Data Use and Sharing: Your app collects location data in the background for analytics and advertising purposes rather than providing a user-facing feature. Background location access must be tied to a feature that directly benefits the user. Using location for analytics or advertising is not a valid use of background location.",
|
|
178
|
-
"fix": "Removed background location tracking entirely. Downgraded to 'While Using' location permission. Location data is now only used for the app's core map feature while the user is actively using the app. Removed location data from the analytics pipeline.",
|
|
179
|
-
"outcome": "approved-after-fix",
|
|
180
|
-
"keywords": ["background-location", "analytics", "tracking", "location-permission", "privacy-violation"],
|
|
181
|
-
"behavioralSignals": ["background location for analytics", "Always location without user feature", "location tracking for market research", "no user-facing location feature"],
|
|
182
|
-
"year": 2023
|
|
183
|
-
},
|
|
184
|
-
{
|
|
185
|
-
"id": "clipboard-reading-without-user-intent",
|
|
186
|
-
"guidelineNumber": "5.1.1",
|
|
187
|
-
"guidelineName": "Data Collection and Storage",
|
|
188
|
-
"category": "legal",
|
|
189
|
-
"rejectionReason": "Your app reads clipboard contents without clear user intent or action.",
|
|
190
|
-
"whatDeveloperDid": "The app read the clipboard contents (UIPasteboard.general.string) on every app launch or foreground event to detect URLs, referral codes, or other content. Starting with iOS 16, users see a paste notification banner and starting with iOS 14, a paste indicator appears, making this behavior highly visible.",
|
|
191
|
-
"whatAppleSaid": "Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage: Your app reads the clipboard contents on launch without a clear user action or intent. Reading clipboard data should only occur in response to an explicit user action (e.g., tapping a paste button). Automatically reading the clipboard on app launch is not permitted.",
|
|
192
|
-
"fix": "Removed automatic clipboard reading on launch. Implemented a 'Paste' button that users can tap to voluntarily share clipboard contents. Used the new UIPasteboard.DetectionPattern API (iOS 14+) to detect if the clipboard contains relevant content (like URLs) without actually reading it, then show a prompt for the user to paste.",
|
|
193
|
-
"outcome": "approved-after-fix",
|
|
194
|
-
"keywords": ["clipboard", "pasteboard", "privacy", "user-intent", "paste-detection"],
|
|
195
|
-
"behavioralSignals": ["clipboard read on launch", "paste notification appearing", "automatic clipboard access", "UIPasteboard access without user action"],
|
|
196
|
-
"year": 2023
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
"id": "third-party-sdk-data-sharing-undisclosed",
|
|
200
|
-
"guidelineNumber": "5.1.2",
|
|
201
|
-
"guidelineName": "Data Use and Sharing",
|
|
202
|
-
"category": "legal",
|
|
203
|
-
"rejectionReason": "Your app shares user data with third-party SDKs that are not disclosed in your privacy nutrition labels.",
|
|
204
|
-
"whatDeveloperDid": "Integrated multiple third-party SDKs (analytics, advertising, crash reporting) that collected and shared user data, but did not disclose this data sharing in the App Privacy (nutrition label) section of App Store Connect. The privacy labels showed 'Data Not Collected' while SDKs were actively collecting and transmitting user data.",
|
|
205
|
-
"whatAppleSaid": "Guideline 5.1.2 - Legal - Privacy - Data Use and Sharing: Your app's privacy information on the App Store does not accurately reflect your app's data collection and sharing practices. We identified third-party SDKs in your app that collect data not disclosed in your privacy nutrition labels. Please update your App Privacy information to accurately reflect all data collection.",
|
|
206
|
-
"fix": "Audited all third-party SDKs for data collection practices using each SDK's privacy documentation. Updated the App Privacy nutrition labels in App Store Connect to accurately reflect all data collected by the app and its SDKs, including the purpose of collection and whether it's linked to the user's identity.",
|
|
207
|
-
"outcome": "approved-after-fix",
|
|
208
|
-
"keywords": ["privacy-labels", "nutrition-label", "data-sharing", "third-party-sdk", "disclosure", "app-privacy"],
|
|
209
|
-
"behavioralSignals": ["privacy labels don't match SDK data collection", "undisclosed data sharing", "Data Not Collected but SDKs present", "inaccurate privacy nutrition labels"],
|
|
210
|
-
"year": 2024
|
|
211
|
-
}
|
|
212
|
-
]
|