My Journey through the world of app store rejections
Warning: count(): Parameter must be an array or an object that implements Countable in /home/logansea/public_html/iparty/wp-content/themes/grizzly-theme/base/shortcodes/fix.php on line 36
Having brought many apps live over the years, I’ve had to deal with a significant number of app store rejections. I used to wince when I would see “Cupertino CA” pop up on my cell phone’s caller ID. I’d answer and hear the ever familiar voice, “Hey, It’s Richard from Apple.” As nice as Richard was, he always brought me the bad news of a new app rejection. These days the process is much more streamlined and messages are sent via an online portal.
My many rejection experiences are chronicled below, to the best of my memory, to help other developers traverse through the loosely defined review guidelines as best as possible.
If you have any rejections, you’d like to add, please comment below!
Rejection Reason: using Google 3rd Party Authorization, where the authorization opens a web browser to sign the user in.
Date: December 2015
Resolution: Update Google SDK or remove Google Auth. See: https://github.com/EddyVerbruggen/cordova-plugin-googleplus/issues/37
10.6 Details We noticed an issue in your app that contributes to a lower quality user experience than Apple users expect: When the user attempts to login with Google +, a web page in mobile Safari opens and then returns the user to the app. The user should be able to log in without opening Safari first. It would be appropriate for this login to be placed within a web view. Please refer to the attached screenshot for more information. Next Steps It would be appropriate to revise your app to address all instances of this type of issue.
Rejection Reason: Not including a key in the info.plist about contact authorization
Date: December 2015
Resolution: Add a key to info.plst describing the reason for contact usage.
17.1 - Apps cannot transmit data about a user without obtaining the user's prior permission and providing the user with access to information about how and where the data will be used. We noticed that your app asks for users's contacts list without confirming its usage. Next Steps To collect personal data with your app, you must make it clear to the user that their personal data will be uploaded to your server and you must obtain the user's consent before the data is uploaded. - Starting with iOS 6, there are keys for specifying the reason the app will access the user's protected data. When the access prompt is displayed, the purpose specified in these keys is displayed in that dialog box. If your application will be transmitting protected user data, the usage string in your access request should clearly inform the user that their data will be uploaded to your server if they consent.
Rejection: For storing app generated data into the user documents folder
Date: December 2015
Resolution: Store app generated data to the temporary folder.
2.23 Details On launch and content download, your app stores 9.98 MB on the user's iCloud, which does not comply with the iOS Data Storage Guidelines. Next Steps Please verify that only the content that the user creates using your app, e.g., documents, new files, edits, etc. is backed up by iCloud as required by the iOS Data Storage Guidelines. Also, check that any temporary files used by your app are only stored in the /tmp directory; please remember to remove or delete the files stored in this location when it is determined they are no longer needed. Data that can be recreated but must persist for proper functioning of your app - or because users expect it to be available for offline use - should be marked with the "do not back up" attribute. For NSURL objects, add the NSURLIsExcludedFromBackupKey attribute to prevent the corresponding file from being backed up. For CFURLRef objects, use the corresponding kCRUFLIsExcludedFromBackupKey attribute. Resources To check how much data your app is storing: - Install and launch your app - Go to Settings > iCloud > Storage > Manage Storage - Select your device - If necessary, tap "Show all apps" - Check your app's storage For additional information on preventing files from being backed up to iCloud and iTunes, see Technical Q&A 1719: How do I prevent files from being backed up to iCloud and iTunes.
Rejection Reasons: Tell iTunes connect that your app uses the advertising identifier to serve ads, but having no ads visible
Date: December 2015
Resolution: Ensure ads are enabled and showing during the review process, or do not use the identifier.
Your iTunes Connect settings indicate that your app serves third-party advertisements. However, we were unable to locate ads in your app.
Rejection Reason: The Apple TV Store won’t accept ‘Cracked’ Screen apps
Date: December 2015
Resolution: Unable to put app live on app store
22.2 Apps that contain false, fraudulent or misleading representations or use names or icons similar to other Apps will be rejected My opinion, this doesnt fall under this guideline, however I submitted an appeal to the app store and it was not overturned. :(
Rejection Reason: information needed about monitization.
Date: October 2015
I had a free app, where the user was able to add contracts via a web portal and have them signed on the device. The app was free, but Apple wanted to verify how I was making money and ensure that if I was charging a subscription on the online site, I should do it with in app purchase, or not be allowed to link to the site in the app description.
Resolution: I just had to let the reviewers know that I didn’t have a monitization strategy yet and was not charging anyone for anything and they let the app through.
I’ve seen similiar issues like this in other apps. If your app is a client for a 3rd party website that charges fees, Apple will want you to use In App Purchasing or may not allow you to point your user to your external site or even make mention to it in your app description.
Additionally, we have begun the review of your app but aren't able to continue because we need additional information about your app. At your earliest opportunity, please review the following question(s) and provide as much detailed information as you can. The more information you can provide upfront, the sooner we can complete your review. - Who is the target audience? - Is this an existing service? If yes, where is it available? - Are there costs involved with the service? - Are there costs involved with the application? - How does the user/company pay? What is the cost? What does it pay for? - Is there a paid upgrade option outside of the app? 11.2 Apps utilizing a system other than the In-App Purchase API (IAP) to purchase content, functionality, or services in an App will be rejected 11.13 Apps that link to external mechanisms for purchases or subscriptions to be used in the App, such as a "buy" button that goes to a web site to purchase a digital book, will be rejected
Rejection Reason: Requiring a user to enter their birthdate and phone number on registration
Date: October 2015
Resolution: Make these fields optional
We noticed that your app requires users to register with personal information to access non account-based features. Apps cannot require user registration prior to allowing access to app content and features that are not associated specifically to the user. Specifically, the application requires that the user enter their Date of Birth and Cell Phone number upon registration.
Rejection Reason: If you include user generated content, you need a mechanism to filter it, like a flag button.
14.3 Apps that display user generated content must include a method for filtering objectionable material, a mechanism for users to flag offensive content, and the ability to block abusive users from the service
Rejection Reason: Including screen shots that were somewhat, remotely violent
Date: November 2015
Resolution: Removed Screenshot
In this case I just had a screenshot from my game Zappy Duck where the duck gets electrocuted, Loony Toons style, when it flies into an electrofied post. This was for some reason too graphic for the app store, so I had to remove the screenshot.
15.1 Apps portraying realistic images of people or animals being killed or maimed, shot, stabbed, tortured or injured will be rejected
Rejection Reason: Including a graphic of a Nazi Swastica in a game.
Date: November 2013
Resolution: Had to remove from sale in Germany.
22.1 Apps must comply with all legal requirements in any location where they are made available to users. It is the developer's obligation to understand and conform to all local laws
Rejection Reason: Apple did not like my use in app purchase for unlocking content on a daily basis
Resolution: Instead of unlocking content for a day after a purchase, I had to unlock a fixed number of items.
11.6 Content subscriptions using IAP must last a minimum of 7 days and be available to the user from all of their iOS devices
Rejection Reason: Apple did not like my use of Recurring subscriptions and insisted I use a noncurring subscription
Resolution: Recurring subscriptions seem to only be allowed for content like magazines and publications.
11.15 Apps may only use auto-renewing subscriptions for periodicals (newspapers, magazines), business Apps (enterprise, productivity, professional creative, cloud storage), and media Apps (video, audio, voice), or the App will be rejected
Rejection: App was rejected for being named “Power Hour”
Resolution: The use of alcohol insinuated titles like the drinking game ‘Power Hour’ is not allowed. Name change required.
2.18 Apps that encourage excessive consumption of alcohol or illegal substances, or encourage minors to consume alcohol or smoke cigarettes, will be rejected
Rejection: My app, Hookups was rejected because Apple deemed it inappropriate
Resolution: Time wasted
I created an where the transmission of STDs was simulated as users bumped phones to simulate a ‘hook up’ and the goal was to hook up as much as possible without contracting any STDs. Apple did not like this, even though I thought it was neat and tried to pitch it as an educational product. Despite months of effort for an appeal, I gave up on this one.