簡體   English   中英

在iOS中處理后台任務的正確方法是什么

[英]What is the proper way to handle background tasks in iOS

我有一個voip應用程序,它需要在后台運行。 據我了解,這些是我需要做的事情:

  1. 將應用標記為voip。
  2. 將“應用程序不在后台運行”標志設置為“否”。
  3. 設置一個過期處理程序,這是一段代碼,可以將您獲得的標准執行時間延長10分鍾。
  4. 更多?

我在info.plist文件中同時設置了兩個標志,我有10分鍾的時間。 我嘗試了這篇文章中的建議。 這是我的代碼:

//in didFinishLaunchingWithOptions:
expirationHandler = ^{
    NSLog(@"ending background task");
    [[UIApplication sharedApplication] endBackgroundTask:bgTask];

    NSLog(@"restarting background task");
    bgTask = UIBackgroundTaskInvalid;
    bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:expirationHandler];

    NSLog(@"finished running background task");
};

//in applicationDidEnterBackground
NSLog(@"entering background mode");
bgTask = UIBackgroundTaskInvalid;
bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:expirationHandler];

// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // inform others to stop tasks, if you like
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MyApplicationEntersBackground" object:self];

    //this while loop is just here for testing
    inBackground = true;
    while (inBackground) {
        NSLog(@"stayin alive!!"); //this keeps going forever
        sleep(10);
    }
});

情況:

我使用第三方庫來處理與我們的Web服務的通信。 該服務是CommuniGate pro服務器。 我通過庫收到聯系人的狀態更新(在線/離線)和即時消息。 該庫是CommuniGate的ximss庫,由他們制定的協議與xmpp相似,用於基於xml的sip請求以及IM和狀態。 當用戶登錄到該應用程序時,他會看到他的聯系人(CmmuniGate朋友列表),並且可以選擇呼叫一個。 發送ximss驗證消息並且另一方接受呼叫后,它將記錄呼叫的開始時間並開始進行面對面呼叫。

問題:

當應用程序通過按下主屏幕按鈕進入后台時,我開始在日志中看到“保持在線”消息,每隔十分鍾,我就會看到它重新啟動了后台任務。
當應用程序通過按電源按鈕進入后台時,“保持活躍”消息開始顯示十分鍾,此后它將重新啟動后台任務,並大約每50-100毫秒開始重新啟動它。
我現在就可以了,即使它消耗了電池,因為我有時間進行更新,而我們的用戶並不擁有ipad,所以我們可以。 現在,對我來說,問題是ximss庫失去了它的連接(它是基於會話的)。 我可以在庫中重新啟動會話,但這意味着要進行大量數據傳輸以獲取聯系人列表,並且某些用戶使用3g。
我無法編輯該庫的源代碼,也看不到它,所以我不知道它是否以正確的方式創建了套接字。

我該怎么辦才能正確處理這兩種情況? 我什至不明白為什么會有區別。

您不能像這樣重新擴展后台任務。 您的應用可能會終止。 如果可行,那是因為您啟用了后台voip模式,而不是因為您正在重新啟動后台任務。

設置voip plist條目后,iOS將嘗試使您的應用程序盡可能長時間地處於活動狀態,並在終止時重新啟動它。 通過實施VoIP應用程序

在UIBackgroundModes鍵中包含voip值可讓系統知道它應允許應用程序根據需要在后台運行以管理其網絡套接字。 系統啟動后,具有此密鑰的應用程序也會在后台立即重新啟動,以確保VoIP服務始終可用。

除了設置此鍵外,如果需要定期運行代碼以保持voip連接保持活動狀態,則可以在UIApplication上使用setKeepAliveTimeout:handler:方法。

另請參閱開發VoIP應用程序的提示

實施VoIP應用程序有一些要求:

  1. 將UIBackgroundModes鍵添加到應用程序的Info.plist文件中。 將此鍵的值設置為包含voip字符串的數組。

  2. 配置應用程序的一個套接字以使用VoIP。

  3. 移至后台之前,請調用setKeepAliveTimeout:handler:方法以安裝要定期執行的處理程序。 您的應用程序可以使用此處理程序來維護其服務連接。

  4. 配置您的音頻會話,以處理到主動使用之間的過渡。

  5. 為了確保在iPhone上獲得更好的用戶體驗,請使用Core Telephony框架來調整與基於手機的電話有關的行為; 請參閱《 Core Telephony Framework參考》。

  6. 為確保VoIP應用程序具有良好的性能,請使用“系統配置”框架來檢測網絡變化並讓您的應用程序盡可能多地進入睡眠狀態。

您所需的幾乎所有文檔都在Apple開發人員網站上。

暫無
暫無

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

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