簡體   English   中英

定期在后台模式下發送 HTTP 請求 (iOS)

[英]Send HTTP Requests in Background Mode (iOS) Periodically

我正在為我的應用程序開發一項很棒的功能,該功能需要在后台定期發送 HTTP 請求。

我已經在這里閱讀了很多文章和討論,但還沒有提出解決方案,因為我在stackoverflow.com上遇到的所有建議都只能部分解決問題。

讓我詳細解釋一下我希望我的應用程序做什么。

考慮有一個帶有 API 的網站,我想定期發送請求(當應用程序處於后台模式時)以檢查網站上的數據狀態。 如果數據狀態是可以接受的,我會向用戶發送推送通知,通知他當前數據是正確的。

有人可以提出一個解決方案如何在 iOS 應用程序中實現這個想法嗎?

正如你所描述的,在 iOS 上你不能這樣做。 當您的應用程序處於后台或未運行時,您無法安排任務定期發生。 您也無法控制 iOS 在后台運行時是否決定終止您的應用程序,因此“未運行”是您需要處理的情況(您不能只在后台運行很長時間如你所願)。

不過,我不確定我是否了解服務器端。 如果您的服務器正在處理數據直到它可以接受,並且它可以發送推送通知,為什么它需要等待來自電話的傳入請求? 為什么不在數據准備好時發送推送? 如果應用程序決定什么是“可接受的”,也許讓應用程序告訴服務器它想要什么,以便服務器知道何時發送推送。

有幾個選項可以接近您所描述的。 如果您在應用程序中實現“后台獲取”功能,iOS 將在應用程序未運行時啟動該應用程序,並讓它在后台進行網絡調用。 但是,無法保證這種情況發生的頻率。 這在Apple 的后台執行文檔中有所描述

另一個選項是“靜默”推送通知。 如果您的服務器發送其中之一,iOS 可以在后台啟動應用程序來處理通知。 如有必要,該應用程序可以進行網絡調用。 你可以在任何你喜歡的時間發送這些,但 Apple 警告不要過度發送:

靜默通知並不是為了讓您的應用在后台保持清醒,也不是為了高優先級更新。 APNs 將靜默通知視為低優先級,如果總數過多,可能會完全限制其傳遞。 實際限制是動態的,可以根據條件更改,但盡量不要每小時發送超過幾個通知。

Apple 的推送通知文檔中描述了靜默推送。

如果您的應用程序可以具有后台運行功能,那么您可以做一些事情。

  • 要定期運行,您將需要一個Timer (NSTimer)。
  • 您將需要一個方法來執行HTTP請求。

例如:

Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(handleHTTPRequest), userInfo: nil, repeats: true)

func handleHTTPRequest() {
  // fetch and change the state of data
}

另一種方法是讓delegates在發生某些事情時執行任務。 當您不想在固定時間間隔內執行時,您可以使用它。

iOS 后台執行限制

Questions

如何讓我的應用程序在后台持續運行?

如果我安排了一個計時器,如何在屏幕鎖定時觸發它?

如何每 15 分鍾在后台運行一次代碼?

如何設置在后台運行的網絡服務器?

我的應用程序如何在后台為我的另一個應用程序提供 IPC 服務?

Answer from Apple:

所有這些的簡短答案是你不能。 iOS 對后台執行有嚴格的限制。 它的默認行為是在用戶將其移至后台后不久暫停您的應用程序; 這種暫停會阻止進程運行任何代碼。

Official: https ://developer.apple.com/forums/thread/685525

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM