The Problem :
You are a good programmer who likes to know what the code is doing before copying and pasting it from the internet. You always write efficient code and your code never leaks memory. You use instruments and profiling to profile your leaks, zombies, allocations etc.
But shit happens! And no matter how hard you try and how good your testing team is, your app will eventually crash. I have seen all sorts of good apps crashing. Google App, Loopt, Facebook, Heytell, Instagram to name a few which have crashed on me. I am a power user though, which means I have around 70 apps easily running on my iPhone all the time. This causes apps to run out of memory and guess what..when you run out of memory–>BAD THINGS HAPPEN! = CRASH!
The Solution :
So, as a good developer, you should definitely build some error logging/reporting capabilities in your apps. Yes, Apple iTunes has the option to collect your crash logs and stuff. But hey! please leave a comment on this post; I am curious to know how many people use it.
At Loqly – http://bit.ly/e5u4jv, we use something called Hoptoad for error reporting for both our server side errors and IOS app errors. It is amazing that with a few lines of code how nicely Hoptoad takes care of everything for you. If your app crashes, the next time you run the app, Hoptoad presents this screen to the user, allowing him to send a crash report to you. The crash report has the standard stacktrace and it normally takes me 10 seconds to narrow down the culprit by looking at the report.
Yes, it is debatable if you want to admit on the user’s face that your app crashed last time. It is a little shameful yes, but hey who are we kidding here? Do you really think the user doesn’t realize that your app crashed, just because IOS simply closes your app and you don’t see the nasty Windows Dr. Watson message.
- Do not use a screenshot which shows your app running in an IPhone. App Store does not like images of their IPhone in the screenshots. They will reject it immediately. Just take a shot of your application ‘s screen only.
- Apple asks you to submit a Main Logo (512 * 512 px PNG) which shows up as the big preview in ITunes and a small logo (47 * 47 px) which should be included as part of your App Bundle. They are extremely particular about the sizes and your main logo should match the mini logo. I made the mistake of submitting two different pictures (with the same theme) but promptly got rejected.
- Make an application which at least in Apple’s eyes will serve some purpose to the public. I know that they rejected this app called “Pull my Finger” (and it farts) and it never made it to the App Store, because Apple said it serves no purpose. Although, with weird apps like Flashlight etc, I don’t know why some apps make it to the app store and some don’t.
- DO NOT use any undocumented APIs. This is a recipe for rejection right away. eg. UIProgressHUD is the most common API that people use to show hourglasses but get rejected right away.
- Do not write an app which provides competition to any built in IPhone apps. eg. Providing a much better Photos application will probably cause Apple to think that it is giving competition to their own photos app
- Do not write an app which provides functionality which is “unofficial”. You must have heard of how the app which would allow you to tether you IPhone to your computer to share internet got rejected by App Store.
- Also, make sure your app complies with the UI guidelines. For eg. if it takes too long to load or shows an hourglass for too long, it will get rejected. Why? Because Apple doesn’t want its users to perceive that the IPhone is slow just because your app is slow.
- And PLEASE FOR GOD SAKE! Don’t do this (unless your are looking for media coverage) : http://www.pcworld.com/article/163717/baby_shaker_app_approved_then_removed.html
- If your app needs an internet connection, but does not notify the user if there is no internet connection present, it will get rejected. Gracefully handle lack of internet connection and notify the user. See this Post for how to do this
- With AT&T adding 200MB and 2GB caps to the previously unlimited data plan, Apple is very mindful of the amount of data your app transmits. I don’t write media streaming apps, so no advice there. But for a typical app supported by a backend webservice, use JSON or BJSON format instead of XML. Only pass data that is required and cache on the IOS device if possible. Three20 lib has a nice TTImage which will cache images on the device and will not request them again if they haven’t changed on the server.
When we first released Loqly (http://loqly.me) in Dec 2010, we had used UIProgressHUD to show please wait type hourglass messages to the user when the app was doing something in the background. UIProgressHUD is the same API which Apple internally uses in their apps to show the nice translucent hourglass.
Unfortunately, Appstore took 5 minutes to slap us with a rejection. Worst part is, I had been coding all night and submitted the app at 5AM in the morning in the hopes of getting at least 3-4 hour nap. But 5:10 AM, my iPhone gave me the new mail sound. And there it was…the dreaded rejection email !! I was so tired by that time that I let my team know about the rejection and just passed out.
Next day after doing some research, I came across MBProgressHUD by Jonathan George. It is an excellent replacement for UIProgressHUD and in fact has much more functionality. We just added Jonathan’s code and we were approved in no time!!
Lot of times people point out that they think that Loqly – http://bit.ly/e5u4j might be sucking out their battery life because it uses their iPhone’s GPS all the time. Unfortunately, Apple hasn’t done a good job of indicating what the small purple arrow at the top means.
Apple’s official documentation says this about conserving the user’s battery life :
“In iOS 4.0 and later, you can use the significant-change location service to receive location events. This service offers a significant power savings and provides accuracy that is good enough for most applications. It uses the device’s cellular radio to determine the user’s location and report changes in that location, allowing the system to manage power usage much more aggressively than it could otherwise. This service is also capable of waking up an application that is currently suspended or not running in order to deliver new location data. “
Loqly uses the same API which delivers us your location based on cell tower triangulation. i.e We don’t even use your GPS except the first time you download and run our application. The purple arrow just means that an application has accessed your location recently. Which is what Loqly is doing. We don’t keep checking your location. We just tell your IOS device to let us know when you have traveled more than 1/2 mile from your current location. And we leave it to IOS to use cell towers and tell us if you change your location.
Bottomline for developers :
In summary, if as a developer if you want to be conscientious and conserve the user’s battery life, use the significant location changes API “[CLLocationManger startMonitoringSignificantLocationChanges]” instead of ["CLLocationManager startUpdatingLocation]“
Of course, to get the initial “fix” you will HAVE to use CLLocationManager startUpdatingLocation but once you get the location, immediately call stopUpdatingLocation and switch to startMonitoringSignificantLocationChanges.
If you have anything to add to this article or don’t agree with me, kindly leave a comment below.
EDIT: 07/12/2011 – IOS5 beta 3 has some changes specific to location services. Check this out – Basically you will see a gray arrow now if an app has accessed your location in last 24 hours and a purple arrow if it is actively accessing your location.
EDIT: 09/07/2011 - The information in this article is accurate and can be confirmed by Apple’s official docs. But due to the low awareness of the general user, we were still getting constant feedback from users that the arrow should not be there when they close the app. So, we chose to turn off the arrow by simply powering off location services by calling “CLLocationManager::StopUpdatingLocation”. As a result of this the arrow simply stays off all the time even when you are actively using the app. What all you have to do to keep your users Happy :(
The Problem :
You have tens of thousands of users and you are very happy about blowing past the chicken-egg problem of acquiring users. But now you have a new set of problems.
- You have no idea how people are using your app?
- Which screens do your users use the most?
- How often do they use your app?
- On an average how long doe they use your app for (Session length)?
- Which countries or states have the most users? etc etc etc.
These are common questions which any app developer should have. And you can always solve it by adding lot of logging and write complex SQL queries to mine this information. But don’t you think this ought to be a common problem and there ought to be a common solution for this? Just like Google Analytics and other services work for your website.
The Solution :
The answer is yes !! There are quite a few products which allow you to do this. What we have used in Loqly -bit.ly/e5u4jv is a free product called Flurry Analytics. This is an excellent product and the best part is it is free. What more can you ask for. The amount of data you can gather is mind blowing. And it presents it nicely in a graph too. Even my grandma can see those graphs and answer all the above questions for me :)
The problem :
So you worked your ass off on some cool new features in your IOS app. Submitted it to the appstore and can’t wait for it to get released. Finally, the email shows up “Your application is ready for Sale”. Yipee! you jump with joy, download the latest and greatest update from Appstore to do a smoke test to make sure it works as expected. But wait! something went wrong. You accidentally introduced a major bug in your app and it is crashing.
You know that there is nothing called a quick fix, because Appstore takes a week easily to approve your updates. You start to panic, start googling on how to rollback your update. But don’t find anything. Then you end up on my blog…..
The solution :
Don’t worry. We at Loqly – bit.ly/e5u4jv were in the same boat some time back as you are right now. And here is what I did to get my bug fix out in 4 hours !!!
- First of there is nothing called a rollback to previous version on Appstore. I have no idea why Apple has done that.
- Second and most important –> fix your bug!! I know you are panicking but please stay calm and take your time to test the app thoroughly. Lot of times developers only test new functionality but fail to regression test existing functionality. So, take a chill pill and do not repeat the mistake you made earlier. Make sure that your bug is fixed and everything else looks okay.
- Now, submit your app to itunesconnect.apple.com as a regular update.
- All done! Now send an email to App review team. Here is what I sent them when we ran into problems
- End result : The update was approved in 4 hours. Good luck !
EMAIL TO APPSTORE REVIEW TEAM
We would like to request an expedited review of XXX as there was a critical bug accidentally introduced in the last released version (xxx), which causes our app to crash (or show NULLs)