le lab

Why I think AppStore Review system is broken, and ideas to fix it.

I have two apps on the AppStore : Trackme, sold since August, made 1300 euros and 1300 USD so far; Location recorder, didn't pay so far (published in december). I have sold 300 units of TrackMe in december, and thanks to a sale price in January, I'm moving towards a 400 mark for january.

This doesn't even pay the money spent on developing the apps (training, licence, iPhone), and I don't speak about the time spent on these apps, so please don't comment that I am an iPhone dev making thousands and should be happy with it. Anyway, sales are not the subject of this post, but reviews.


I used to use the script provided by Erica Sadun in october on Ars' website and said so in another post (please dig if you want). Thanks to Mobile Orchard, I found a new site taking advantage of the same script. Here are the reviews for TrackMe and Location Recorder. I cannot comment on Location Recorder's reviews : there are two. But the comments on TrackMe are making me angry... That's the reason for this post. If it ain't broke, don't fix it : well, mothership, it needs fixing.

First thing that I dislike : the "review while you delete" system. Is it really a good idea to ask to someone to judge from an app they are deleting if they are happy with it? I guess that 9 out of 10 people don't review, and the last one gives a one star review. Great! I must be the only one who gave a 5 star review to an app he deleted (was Benjamin Button's story), but this was a book : read it, toss it.

Second, the reviews don't age well : if you take the reviews for TrackMe on the US AppStore , all of them are from september / october. Well there have been at least 4 updates since : added KML export, added map for reviews, added average speed, a cleaner way to export really big tracks etc. 'Altitude' has been replaced with 'Elevation'. If people continued to post reviews, they'd age. Or not? If I read other reviews from apps with many reviews, I don't know if the reviews are ordered by age, country, stars, or the color of the trousers of the reviewer. No way to know, really. But sometimes, worst reviews are at the top, sometimes best reviews are.

Third point is the quality of the review. I am sorry to say so but reviewers are sometimes bad. '"I am sure it is altitude not elevation". What's the point? "Can this app track while in the background of the iPhone (or must it's screen being showing all the time)?" Is that a review? No it's a support question. A comment. Not a review of an app.

Fourth issue is the old review system, and how it worked. See, at the beginning, anyone could review any app. You didn't have to actually buy nor test the app to give a review. Of the 5 reviews on the US AppStore, 2 admit they didn't buy the app, one is a question, so we don't know if the guy bought the app. Then, some day, Apple changed its mind and closed the review system to only the people who had bought the app. But the reviews before that were not cleaned (as you can see).

Fifth point is the nature of the iTunes/AppStore international fck?/% system. As a french citizen living in France with a a french visa card, I cannot use the US Appstore, the UK appstore, the canadian appstore : my registration is refused. So I cannot answer to reviewers or comment myself. No interaction, and I look like someone not interested by reviewers and reviews.

I asked to have all old reviews or reviews from people who said they had not bought the application deleted. Twice. The answer from Apple non-person was that as the review wasn't offensive, it wouldn't be deleted. Well, it offends my intelligence.


Some propositions to fix the system

  • put the date the comment was posted. Of course it's another info (one too much?), but it helps to know that comments talking about a missing feature are old comments when the developer says the feature is there. Who's right? Having the date helps the reader to have an opinion.
  • better fields for reviews. An empty text field is definitely not the way to provide an accurate review. A star is better, but worse. I'd personally add two checkboxes. Does the app behave like advertised (Yes/No)? Is the app working well, or did it crash too often (works well / Crashes a lot)? And no default checked box please. These are two criteria to judge the objective quality of an app and help other reviewers. Furthermore, if an app crashes too often, Apple can ask the developer to correct the issue, and take the app out of the AppStore in the meantime : the quality of the iPhone is also the quality of the apps.
  • a communication system back from developers to reviewers, protecting anonimity inside itunesconnect.apple.com. Being unable to address the issues reported by reviewers is an issue in itself. If they don't contact support and use the review system to get support, they're unhappy, and as a developer I am unhappy too.
  • scratch all reviews from before the system was working. Seriously! "Can I put shitty comments on PathTracker reviews? Yes, great I'll ask my friends to do too and direct users to my app, and to put raves for my app". This seems to have occured once too much, and no appropriate action was taken against it.
  • toss the "review when you delete" system. Final. This was a bad idea.
  • a way to ask buyers to review the app after some time, say one week, by code, and a HIG directive on how to add it to the application.

Apple's AppStore is wonderful. I'd like for the store to become even better, and putting all this effort and time to see bad sales because of inappropriate comments and reviews which I'm unable to address is really making me mad. I'd prefer not review system at all, or just a star review system (so I don't know all the bad reasons the review was bad for).

A better UISlider

Just a code Snippet and three files to improve the (broken/too small/impossible to catch) UISlider from Apple.

CGRect rect = CGRectMake (16.0, 262.0, 284.0, 35.0); //last size of cgrect is important : thumb is 34 pixels high
accuracySlider.frame = rect;
UIImage* thumbImage = UIImage imageNamed:@"thumb.png";
accuracySlider setThumbImage:thumbImage forState:UIControlStateNormal;
UIImage* leftImage = UIImage imageNamed:@"left.png";
leftImage stretchableImageWithLeftCapWidth:5 topCapHeight:0;
accuracySlider setMinimumTrackImage:leftImage forState:UIControlStateNormal;
UIImage* rightImage = UIImage imageNamed:@"right.png";
rightImage stretchableImageWithLeftCapWidth:5.0 topCapHeight:9.0;
accuracySlider setMaximumTrackImage:rightImage forState:UIControlStateNormal;

And the images:

Bigger ah?

AppSales

A great app for all iPhone developers / editors. Don't use it too often though, it gets updated only once a day.

http://code.google.com/p/appsales-mobile/

Checking email in iPhone Code

I just spent a lot of time doing something that would have been ridiculously easy with Cocoa's NSPredicate : checking an email address to know if it is valid, before sending something to it. NSPredicate is not available on the iPhone.

I used instead RegexKitLite, which in turn uses libicucore, this time available on your iPhone, to check things. I just added the core class, and the RKLMatchEnumerator too, which adds a matchEnumeratorWithRegex to NSEnumerator. Et voilà!

@@

 NSEnumerator *matchEnumerator = NULL;
 NSString    *emailRegEx = @"A-Z0-9a-z._%+-+@A-Za-z0-9.-+\\.A-Za-z{2,4}";

 matchEnumerator = emailAddress matchEnumeratorWithRegex:emailRegEx;

 //Validate email address 
 if (matchEnumerator nextObject == NULL) {
   UIAlertView *alert = [UIAlertView alloc initWithTitle:@"" message:NSLocalizedString(@"EmailNotValid", @"No search") delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
   alert show;	
   alert release;
   return;
 }

@@

Nouveau site

Il faut savoir surfer sur la vague des succès : je viens d'ouvrir un nouveau site bestiPhoneApps.eu, un site très simple, mais de parti pris. Il recense les meilleures applications pour l'iPhone, vu de mon point de vue (donc forcément parfaitement subjectif).

Je suis resté honnête : je n'ai pas encore mis mes propres applications dedans car je ne considère pas qu'elles fassent partie de ce lot de 'meilleures applications'.

Si vous pensez par contre que vous méritez d'y être, utilisez la nouvelle fonctionnalité essentielle d'itunesconnect : les bons d'achat. Vous pouvez offrir jusqu'à 50 exemplaires de votre application. Envoyez moi un de ces bons si vous voulez que je la teste (prévenez moi avant, je vous dirai si elle est susceptible de m'intéresser ;-)

Réunion de geeks, euh non de développpeurs

La semaine prochaine, le jeudi 2 octobre à 18h, j'organise une réunion de développeurs iPhone à La Cantine, un espace de travail collaboratif. Cette réunion est ouverte et participative. Ce ne sera pas un mini barcamp mais presque...

Personnellement, j'essaierai de partager mon expérience de l'AppStore avec les personnes présentes pour leur éviter les soucis que j'ai rencontré, et je ferai une présentation du travail de Jeff LaMarche avec SQLPersistentObjects.

Alors il y a un problème avec ce type de réunion : l'accord de confidentialité. Celui dont je ne peux parler en termes explicites. A priori, s'il y a accord de confidentialité, pas moyen de parler du SDK. La beauté de la chose c'est que la réunion en question parlera de choses qui ne concernent pas à proprement parler le SDK iPHone : SQLPersistentObjects est écrit pour Cocoa.

Par ailleurs, j'espère que les personnes présentes auront les mêmes relations que moi avec Apple.

Récupérer ses stats AppStore dans un mode lisible

Pour récupérer les stats de vente de mes applications sur l'AppStore (car mon application a été acceptée), j'utilise l'excellent appstorestats.py. Mais comme je suis encore plus flemmard que cela, j'ai rajouté un petit script pour traiter rapidement toutes les stats non traitées et ouvrir directement dans Numbers:

#!/bin/sh
cd /Users/cyril/iPhone/TrackMe/AppStore/iTunesConnect
gunzip *.gz
./appstorestats.py
open -a /Applications/iWork\ \'08/Numbers.app /Users/cyril/iPhone/TrackMe/AppStore/iTunesConnect/all_apps_downloads_per_day.txt

Si je pouvais en plus récupérer les stats avec curl ce serait top, mais l'application Piano ne permet pas encore cela. Ils ont promis d'y réfléchir.