iOS Voip Socket will not run in background

对着背影说爱祢 提交于 2019-11-26 23:50:40

If you want to let your VOIP application run in background , except those base settings in plist file, you need a TCP socket who's property is set to VOIP, than the iOS system will take care this socket for you, when your application enter background , every thing was 'sleep' except that tcp socket. and if VOIP server send some data thought that TCP socket, your application will be awake up for 10 secs. during this time, you can post a local notification.

Only Tcp socket can be set as VOIP Socket. But from i know , mostly VOIP application are based on UDP socket. if you do not want to separate the control socket from the data socket. you should create another tcp socket which is focus on 'awake' your application , and from my personal experience , it's very hard to keep this 'awake' signal and the real sip control signal synchronize, the application always miss the sip invite request.

So,the best way is separating the sip control single from the UDP data socket , make it as a tcp socket , this is the best solution , but never use tcp socket to transfer voice data.

Another dirty way: keep the application awake all the time. As i said , each TCP single the application received thought that 'VOIP' tcp socket , will keep application awake for 10 seconds, so at the end of this duration(after 9 secs) , you can send a response to the server to ask for another signal , when the next signal arrived, the application will be awake again,after 9 secs , send response again. keep doing this, your application will awake forever.

I was stuck with the exact same scenario.
My problem was that i've configured more than one socket as a Voip socket.

you can see at Apple's documentations about voip that they say:
"Configure one of the application’s sockets for VoIP usage"

I guess they are only waking your app according to a single socket.

all other stuff mentioned is still correct:

  • kCFStreamNetworkServiceTypeVoIP
  • 'info.plist' UIBackgroundModes: voip, audio
  • 'info.plist' UIRequiresPersistentWifi key
  • will NOT work over simulator

I'm also facing same problem. but in my case everything is working fine, unless network changes happen. I used apple "reachability" class to detect network changes. if the app is in background upto sometime my socket is working even if i manually switched my network for the following.

  1. wifi -> 3g
  2. 3g -> wifi

After sometime, let say again im trying network switch manually. nothing is happ it seems my app is not detecting network changes. I read the below apple doc. i'm sure doing wrong(or) disunderstood step 3 and 6.

There are several requirements for implementing a VoIP app:

1. Add the UIBackgroundModes key to your app’s Info.plist file. Set the value of this key to an array that includes the voip string.

  1. Configure one of the app’s sockets for VoIP usage.

  2. Before moving to the background, call the setKeepAliveTimeout:handler: method to install a handler to be executed periodically. Your app can use this handler to maintain its service connection.

  3. Configure your audio session to handle transitions to and from active use.

5. To ensure a better user experience on iPhone, use the Core Telephony framework to adjust your behavior in relation to cell-based phone calls; see Core Telephony Framework Reference.

  1. To ensure good performance for your VoIP app, use the System Configuration framework to detect network changes and allow your app to sleep as much as possible.

You might need to set <key>UIBackgroundModes</key><array><string>audio</string></array> in Info.plist, and you need to make sure that the audio session is active/running/whatever before you switch apps (the assumption is that you won't suddenly start recording/playing music/whatever when your app is in the background).

The docs say that "audio" lets you play audio in the background, but presumably this also applies to recording audio. If it doesn't work, there are a few things you could try:

  • Set both "voip" and "audio".
  • Play silence (this might be easiest to do with the Audio Queue API).

Do you have a 'applicationDidEnterBackground:' in your application delegate. I'm pretty sure that I've read somewhere (that I can't find), that you need to have it defined for ios to recognize that you support background modes. You don't need to implement anything in it.

e.g.

- (void)applicationDidEnterBackground:(UIApplication *)application
{
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!