背景
項目中使用 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();
-----------------------------------------------------------------
void udp::close() //關閉連接
{
if (usock <= 0) return; //socket出錯
closesocket(usock);