Call are established, but voices can't be heard

Hi, I am having a little problem here and I hoped maybe I could get some help here.

I deployed a Asterisk 1.8 server of my own to make SIP calls just between my friends. The server is configured with a public IP address.
My friends and I are using “Acrobits Softphone for iPhone” as a client.
I am using its push service which is hooked up to my Asterisk server.

Now, the current situation is like this:
My friend is under a WI-FI access point at his home, so his iPhone is assigned something like 192.168.x.x.
I am using 3G network, so I have a public IP address.
Now, when I call my friend using my Asterisk server, the call is made somehow. Which is amazing. How the hell can I make a call to someone who is using a private IP address??
I don’t know how this is possible but my guess is that Acrobits’ push service is doing some kind of magic.
So the call is established and I can hear my friend’s voice. But my friend CANNOT hear MY VOICE. I figure this is because he is using a private IP address.

I just don’t get it. Calls can be established whether two people are using public IP address, or private IP addreess. But your voice can be heard only if the other person is using a public IP address.

Is there some misconfiguration with my server, or my Softphone app?
Please enlighten me. I’d really appreciate any kind of help.

Check the Audio Codes from both site. Audio codes must be match between two softphone.

Incompatible codecs will cause the call to fail, rather than simply lack audio.

If the OP doesn’t understand how the call is getting through the NAT at the other end, he needs to find out, as it is likely that NAT is working for SIP but not for RTP.