背景
项目中使用 C++ 实现的 UDP通信,并作为 so 库运行在 android 平台和 IOS 平台下。在 ios 手机锁屏再解锁后,或者从前台切换到后台后,发现recvfrom 方法不再阻塞并一直返回失败,同时 sendto 方法也返回失败,查看 errno 错误码发现也是 0(Success)。
原因
经过查询资料了解到:
一般情况下, IOS 在锁屏后,或者说进入后台后,应用程序会被系统挂起,socket 资源会被回收,此时所有的后台代码都是无法运行的。而 android 是没有这样的限制的。比如音乐类 APP 或者定位类APP,它们都需要向系统申请后台运行权限,并在上架时还要通过 app store 审核,过了的话它们就被允许在后台运行。
解决方案
网上说的各种保活方案我没有进行测试,需要 IOS 组同事去测试,但是看了之后感觉也很悬。作为 C++ 端能想到的方法就是重连了。
在应用进入后台和恢复前台时提供2个方法:
// ios 进入后台,释放掉此socket对象
m_socket.close();
------------------------