IOS 鎖屏或切入後臺後socket recvfrom失敗和sendto失敗的解決方案

IOS 鎖屏或切入後臺後socket recvfrom失敗和sendto失敗的解決方案

背景

項目中使用 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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章