I'm glad you asked because this was the main thing we are testing in Status - the viability of Whisper.
There's many factors that come into play here. Firstly, let me describe how Whisper roughly works, how Status tries to compensate and what might be happening here.
Whisper is an identity based encrypted messaging protocol that has dark routing, to learn more about it, check out Gavin's devcon1 excellent Whisper video. Now many of the features Gavin describes do not exist in the implementation, Whisper itself is far from being complete, infact we are currently using WhisperV2 which predates devcon1, where WhisperV5 is now being implemented in
go-ethereum. WhisperV3 & 4 were implemented in the
cpp-ethereum client. WhisperV5 is even more unstable and is not backwards compatible. You might also be interested in reading the latest WhisperV5 doc here.
One interesting feature of Whisper is that it supports dark routing, that is when you send your message, and it bounces from node to node until its TTL (time to live) has expired, then it terminates. There is no guarantee your message will reach the desired node as it may expire before it does so.
Why do I mention this? Bloom filters are missing. Bloom filters are an important component in letting the peers that your node connects to, know what kind of information and topics your node is interested in. These filters are important in dark routing as it allow us to probabilistically target the general direction in which information should flow whilst minimising bandwidth, increasing the probability that your message will flow in the general direction of your target node.
Without it, your messages are wandering aimlessly in the sea of information.
To alleviate this, Status implements an application protocol ontop of Whisper for message re-transmission and delivery. That is, we will attempt to retransmit the message until we get a receipt message back from your friend contact saying that it's been delivered (and seen). Trouble is, this receipt message is also wandering aimlessly in the dark.
So in order for this to work currently, both nodes need to be online and available, we can't run geth as a background service without killing your battery. Doing push notifications is a problem yet to be solved, but we plan to support this, I outline this in the alpha blog post, we will most likely contribute to Whisper to provide inboxing directly within the protocol.
Furthermore there isn't many nodes supporting Whisper, and if you run latest geth you will be running WhisperV5 (last we checked).
You're also right in thinking it may be simply a peer connectivity problem. In Console you can type
web3.net.peerCount and hit send hopefully you'll see a number >0, and if theres no problem with geth under the hood it should respond with an answer.
If you get no response from Console, then you are seeing another bug in Status, in that go-ethereum has crashed and Status has failed to restart it and has messed up it's internal state in the process. If this is the case unfortunately it requires data to be cleared on Android or reinstall on iOS
I hope this helps, and thanks again for trying Status :)
Edit: and no you don't need ETH to use Whisper