簡體   English   中英

當應用程序在后台且設備被鎖定時處理推送通知

[英]Handling push notification when app is in background and device is locked

我正在開發一個企業應用程序,其中維護用戶會話與設備會話同步是一項關鍵且必需的功能。

基本要求是,一旦用戶殺死應用程序,就要從服務器終止最終用戶會話,但是由於我們知道可以通過代碼獲取應用程序終止事件(啟動后台任務最多可以運行10分鍾),因此服務器仍然沒有意識到關於應用殺滅。

我提出了一些解決方法來解決此問題。

首先,我使用了背景模式-

a)應用程序從網絡下載內容。 b)應用程序下載內容以響應推送通知。

這個想法是,當用戶通過切換到另一個應用程序或通過主頁按鈕或鎖定設備在后台發送應用程序時,該應用程序正在向服務器發送一個請求,說明該應用程序正在后台運行,而服務器知道該應用程序已在后台運行。

 -(void)applicationWillResignActive:(UIApplication *)application
 {
    // notify server that app is in background
 }

服務器一接收到請求,就會為該特定設備啟動計時器,該計時器將繼續計算應用程序在后台花費的時間。 服務器每隔五分鍾發送一次請求到處於后台的設備,以獲取其狀態。

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{

    NSDictionary *aps = [userInfo objectForKey:@"aps"];
    NSLog(@"NOTIFICATION IN BG %@",[aps objectForKey:@"message"]);

    NSString *message = [aps objectForKey:@"message"];

    if([message isEqualToString:@"Please update your status"]){
        // NOTIFY SERVER THAT APP IS IN BACKGROUND
    }

    if(application.applicationState != UIApplicationStateBackground){
        [self application:application didReceiveRemoteNotification:userInfo];
    }
    completionHandler(UIBackgroundFetchResultNewData);
}

一旦應用再次出現在前台或變為活動狀態,應用程序就會通知服務器它已變為活動狀態。

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    // notify server that app is in Foreground // server resets the background timer to 0 for corresponding device
}

此方法有助於跟蹤應用程序是否終止,如果服務器未從其發送的通知中獲得任何響應,它將清除服務器中的用戶會話。

現在,有兩種情況在第一種情況下,它可以按預期完美地工作,而在第二種情況下,它確實可以實現。

案例1 :BackGround中的應用但設備未鎖定

  • 應用啟動
  • 用戶登錄
  • 應用進入BG
  • 服務器已收到通知,告知該應用程序在BG中。
  • 服務器啟動計時器。
  • 該設備在服務器上經過的時間超過5分鍾(因為應用仍在BG中)。
  • 服務器發送通知。
  • 應用程序在BG中接收遠程推送通知。
  • 應用程序將其狀態通知給BG中的服務器(因此服務器知道它沒有終止並且不應清除用戶會話)

從BackGround從設備進行的遠程通知和從服務器回復服務器的周期一直持續到應用再次激活或終止。

如預期般完美運作。

案例2 :BackGround中的應用程序和設備已鎖定

  • 應用啟動
    • 用戶登錄
    • 應用進入BG
    • 服務器已收到通知,告知該應用程序在BG中。
    • 服務器啟動計時器。
    • 設備已被選中
    • 該設備在服務器上經過的時間超過5分鍾(因為應用仍在BG中)。
    • 服務器發送通知。
    • 設備收到通知,設備顯示通知標題。
    • 非活動模式的BUT App在BG中未收到遠程推送通知。
    • 結果是應用程序無法回復服務器

整個周期都在折騰。

當設備被鎖定時,最終問題是如何進行的。

-(void)應用程序:(UIApplication *)應用程序didReceiveRemoteNotification:(NSDictionary *)userInfo {

NSLog(@“用戶信息%@”,userInfo); }

通過此委托方法,您可以從服務器接收字典。您可以相應地執行工作。單擊通知托盤中的通知后,此方法將在您的應用中調用。

暫無
暫無

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

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