當前位置:
首頁 > 知識 > 退到後台,線程被掛起,系統回收所有的socket資源問題及解決方案

退到後台,線程被掛起,系統回收所有的socket資源問題及解決方案

工程中使用tcp長連接來和服務端進行數據傳輸,在IOS平台上,由於蘋果的後台機制,會有以下問題:

當程序退到後台的時候,所有線程被掛起,系統會回收所有的socket資源,那麼socket連接就會被關閉,因此無法再進行數據的傳輸。

注意:系統不會回收開啟定位服務並且正在正常通信的socket資源,也不是進入後台就建立不了socket,而是進入後台斷網8分鐘左右及以後就申請不到新的socket資源了,並且你的建立socket資源的線程或守護線程,日誌線程都會被永遠掛起(和被幹掉是一樣的效果)。

當程序退到後台的時候,所有線程被掛起,系統會回收所有的socket資源,那麼socket連接就會被關閉,因此無法再進行數據的傳輸。

實際測試時,開啟後台定位的應用,當應用進入後台前長連接已經建立,切換到後台後一直有正常的網路,那並且有定位信號那麼長連接,守護線程,日誌線程都正常。

當進入的後台時正在執行connect連接時有可能永遠組賽長連接線程,斷網8分鐘以上。

當進入後台時有網路,有正常的長連接。然後斷開網路,當用戶不移動位置8分鐘,當連接上網路時,日誌線程,守護線程,長連接線程全部(注意:應用的主線程不會被蘋果系統殺死,除非出現內存的特殊情況)被ios系統殺死,無法在後台建立長連接。

咱們的應用不應該設置為voip服務,應為voip需要託管socket,最小600秒才醒來一次,讓客戶端有10秒的時間向伺服器發送請求和處理,當然當伺服器通過該通道發送消息,客戶端立即被喚醒10秒。但是咱們需要10秒向伺服器發送一次請求顯然最小600秒的限制,並且當手機斷網,這個長連接斷掉也沒有實時發現,所以實時通信應用不適合用voip服務。只能用普通socket。

解決方案:定位回掉函數,進入前台事件和用戶UI操作觸發的請求能夠發現長連接線程掛掉,並且重起長連接線程。

退到後台,線程被掛起,系統回收所有的socket資源問題及解決方案

1、 handler

需要說明的是,這個handler在後台執行的時候需要儘可能快的返回,因為系統只給了最多10s的時間去執行它。如果10s內沒有執行完,而且沒有去申請額外的執行時間,系統將會吧app掛起。

2、timeout

設置handler時,需要指定app需要的最大超時時間。IOS系統允許的最小值是600s,如果想設置個小點的值,handler的設置就會失敗。系統在執行handler內容的時候,只保證超時時間到之前會執行,而不保證準確的執行時間點,系統是會根據當時的任務情況等系統條件確定一個合適的時間點,已達到延長電池壽命的目的。

所以無網路進入後台,設置voip也不能保證,應用進入後台8分鐘後,守護線程,長連接線程,日誌線程不被掛起。 甚至應用被殺掉。所以要在進入後台時要保證有網路,進入前台時要監控守護線程和長連接線程是否還活著。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Jenkins內存溢出的處理方法
SVG實現動態模糊動畫效果

TAG:程序員小新人學習 |