[英]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中的應用但設備未鎖定
從BackGround從設備進行的遠程通知和從服務器回復服務器的周期一直持續到應用再次激活或終止。
如預期般完美運作。
案例2 :BackGround中的應用程序和設備已鎖定
整個周期都在折騰。
當設備被鎖定時,最終問題是如何進行的。
-(void)應用程序:(UIApplication *)應用程序didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@“用戶信息%@”,userInfo); }
通過此委托方法,您可以從服務器接收字典。您可以相應地執行工作。單擊通知托盤中的通知后,此方法將在您的應用中調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.