I am using similar idea in one of my Windows apps -- it has a one-time notification that prompts the user to join a mailing list or subscribe to the Twitter feed [1]. After much experimenting I have converged to the following criteria:
The app has been up for at least 5 minutes
&&
It was first run at least 7 days ago
&&
It (executed primary function) no more than 12 hours ago
&&
It (executed primary function) at least 3 times
&&
There was some user activity in last 60 seconds
The app is of a service nature, it runs in a background, so some conditions are unique to that, but the general idea is the same - talk to users that are engaged and happy rather than to all of them. Seems to be working really well so far.
Appirater (the lib mentioned in the post) does it like this:
"every time the user launches your app, Appirater will see if they’ve used the app for 30 days and launched it at least 15 times. If they have, they’ll be asked to rate the app, and then be taken to your app’s review page in the App Store. If you release a new version of your app, Appirater will again wait until the new version has been used 15 times for 30 days and then prompt the user again for another review. Optionally, you can adjust the days to wait and the launch number by changing DAYS_UNTIL_PROMPT and LAUNCHES_UNTIL_PROMPT in Appirater.h."
Tweaking those two settings lets you target any selection of engaged users (eg. 15 launches in 30 days will reach primarily very engaged users).
[1] http://bvckup.com/tmp/notification.png