Update, July 15th: The code is now part of my iPhone tools collection, MuiKit. You can find all the code on the GitHub repository.
Some time ago, I wrote (and blogged about) a piece of code I’ve written for iPhone applications. This code was my technical solution to a social problem that developers face when dealing with the platform: Apple solicits negative reviews, by asking you to rate apps you delete, but does not ask for positive reviews. This piece of code does just that: asking a satisfied user to leave a positive review on the Store, to counterbalance this “negative bias” (mendicant? offensive?) that Apple has introduced.
My BSD-licensed code is available to save you from this trouble. The main header file documents the workings of the class, but it’s almost drop in. You just need to:
- Add a key named
L0SolicitReviewAppStoreURL(that’s ell-zero-solicit…) toInfo.plist, whose value is a URL string to the review page on App Store. The review URL for an app is of the formhttp://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id={your application ID number here}&pageNumber=0&sortOrdering=1&type=Purple+Software(you won’t have this before your app is approved, but you can create a page on your web site with a known address that redirects to this one once it’s known — maybe with a nice “This page will redirect to App Store once the application is released” message for those nice Apple reviewers). - Add a single line to
applicationDidFinishLaunching::
[L0SolicitReviewController solicit]; // again: ell-zero-solicit...
That’s it. The controller will silently do its job, storing state in your app’s user defaults. It’s my opinion that users that are satisfied with your app will have used it a number of times and kept it on device a fair amount of time (they’d have deleted it before, or used it less, if they weren’t happy with it!), so the controller waits five launches and a week from first launch before showing the alert. Once triggered, it shows an alert view that looks like this:
That’s it; the alert is only shown once, total. However, the class is very flexible and you can fine-tune its behavior easily — just see the main header’s comments for details. (Note: the image is outdated — the alert in the repository and in the download below uses “Dismiss” rather than “Cancel”, but is otherwise the same.)
You can get the code by checking out from the GitHub repository. The alert can be localized by placing localized versions of L0SolicitReview.strings in the correct .lproj folders (and an Italian one is included as a little bonus).
Have fun with it, and if you have anything to say or contribute to this, drop a line to me directly or in the comments below. Enjoy!


Excellent idea! Thanks for the post and the very well commented code.
please post to iphonesb@googlegroups.com if you make any updates
thanks
andy
Very nice.
question for you. Lets say I have a user that writes a bad review, lets say it is becuase there is a bug in my app. now assume I release a new version that fixes the bug. Lets say the user has now upgraded to my newer version. what would I have to do to prompt the user to write/rewrite their review?
thanks
Great pointer on going right to the reviews with the URL you mention above. I was a little annoyed that it would “flicker” – by going first to the iTunes app, and then “redirecting” to the App Store app. On a hunch, I tried appending an &mt=8 to the end of the URL, and sure enough – it goes right to the App Store app, bypassing the iTunes app, and manages to go to the right page. So, the format I used was:
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id={your application ID number here}&pageNumber=0&sortOrdering=1&type=Purple+Software&mt=8
brilliant fix. especially with the direct link to reviews!
I’ve been trying to get this:
http://www.mobileorchard.com/fighting-back-against-the-app-stores-negative-rating-bias/
to work for a couple of hours now. So frustrating when you don’t know anything about coding… If anyone can help me set this code so that its countdown is seconds and not days, i’d be very thankful. it’s hard to test it when it’s 10 days. As for this way described on this page, it looks a little more complicated to me..
TIA