簡體   English   中英

設備休眠時的 Alamofire 請求

[英]Alamofire requests while device is sleeping

我的 iOS 應用程序收到通知以從我們的主要服務刷新其 state。 現在,我們正在使用 Alamofire 獲取最新的 state,當有更新的數據時,我們會繼續播放聲音。 我們的設備被鎖定在引導模式,以阻止它們關閉並提供信息亭體驗。

我們正在進行更改,以便設備在 xx 分鍾不活動后可以 go 進入睡眠狀態。 但是,我們遇到了一個問題,即即使請求已成功發送,設備也沒有從 Alamofire 返回結果(基於我們在 api 端的日志)。

當我使用 Alamofire 4 時,我已經設置了一個帶有backgroundsessionmanager的 singleton,這就是現在發送 AF 請求的方式。 但挑戰在於,請求是間歇性發送的,並且在設備因以下錯誤而休眠時大部分時間都會失敗:

Domain=NSURLErrorDomain Code=-997 "Lost connection to background transfer service"

這是我的 singleton 代碼(我在 AppDelegate 中有相關代碼):

class Networking {
    static let sharedInstance = Networking()
    public var sessionManager: Alamofire.SessionManager // most of your web service clients will call through sessionManager
    public var backgroundSessionManager: Alamofire.SessionManager // your web services you intend to keep running when the system backgrounds your app will use this
    private init() {
        self.sessionManager = Alamofire.SessionManager(configuration: URLSessionConfiguration.default)
        self.backgroundSessionManager = Alamofire.SessionManager(configuration: URLSessionConfiguration.background(withIdentifier: "com.test.app"))
    }
}

這是我發送請求的代碼:

let NetworkManager = Networking.sharedInstance.backgroundSessionManager

        
        DispatchQueue.main.async(execute: {
            NetworkManager.request(self.api_url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers).responseJSON{ response in
            
                switch (response.result){
                    case .success:
                        if let jsonResp = response.result.value{
                            print("got the response")
                            print(jsonResp)
                            // parse results
                        }
                    
                    case .failure:
                        print("Network Error: \(response.error)")
                    
                }
            }
        })

我希望得到一些幫助來解決這個問題,因為我無法從根本上導致不一致的行為。 我在某些地方讀到 Apple/iOS 僅在應用程序處於后台模式而不是requests時才允許上傳/下載。

是的,后台會話只允許上傳和下載任務,不允許數據任務。 它們也只允許基於委托的請求,不允許基於完成處理程序的請求。 這個答案概述了與 Alamofire 一起執行此操作時的許多注意事項。

但這引出了一個問題,即您是否真的想使用背景 session。 當您的應用程序被喚醒以進行后台獲取時,如果您能夠在合理的時間內(例如 30 秒)完成您的請求,您可能應該考慮使用標准 session,而不是后台 session。 這要簡單得多。

不要將在“后台”中運行的應用程序與“后台” URLSessionConfiguration :它們是完全不同的模式。 僅僅因為您的應用程序在后台運行,並不意味着您必須使用后台URLSessionConfiguration 如果您的應用程序正在運行(無論是在前台還是在后台),那么標准的 session 就可以了。 如果您希望它在應用程序暫停(或終止)后繼續運行,並且您願意承擔后台會話所需的所有額外開銷,則只需要后台 session。

后台會話不適用於應用程序在后台運行時執行的請求。 它們適用於在您的應用程序暫停后將繼續的請求(即使它最終在其自然生命周期中終止)。 這意味着后台會話非常適合無法在合理時間內完成的緩慢請求,例如下載視頻資產、下載許多大型圖像資產或文檔等。

但是,如果您只是執行將在合理的時間內完成的例行 GET/POST 請求,請考慮不使用后台URLSessionConfiguration ,而只是執行正常請求並在您的請求完成時調用后台獲取完成處理程序(即,在您的網絡請求的完成處理程序)。

暫無
暫無

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

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