A server can be down (unreachable) for one or multiple reasons. I am assuming that you're right that it's due to high Server Workload.
-On Client side, it may be due to methods overloading. And the fix need to be done on the application level. Hence we should implement application logic to restrict the number of request client can send per second.
As well, we need make sure your apps don't abuse the Heavens-Above server. Don't download more information than the user is likely to need and try to spread the loading in time. For example, programming your app to fetch data at a predefined time is very bad, fetching data at a random time of day is much better.
-On Server side, we may need to use Sysstat to help with server overloads. Whereas Sysstat keeps track of performance metrics which can make troubleshooting system freezes easier. The historical data can be cross referenced with the logs you keep about server freezes to better pinpoint the cause.
Another way, Handling requests slower is a bit more work, because it requires separating the servlet handling the requests from the class doing the work in a different thread. You can have a larger number of servlets than worker bees. When a request comes in it accepts it, waits for a worker bee, grabs it and uses it, frees it, then returns the results.
It will be great if we can get source code for Android and iOS to check at least whether it comes from server side or client side.