当app处于后台并且设备被锁定时处理推送通知

时间:2014-09-16 12:23:00

标签: ios iphone apple-push-notifications

我正在开发一个企业应用程序,其中维护用户会话与设备会话同步是一项关键且必需的功能。

基本要求是在用户杀死应用程序后立即从服务器终止用户会话,但是因为我们知道我们可以在代码中获得应用程序终止事件(除了启动可以最多运行10分钟的后台任务),服务器仍然没有意识到app kill。

我做了一些解决方法来解决这个问题。

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

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中的应用但设备未锁定

  • 应用程序启动
  • 用户已登录
  • App进入了BG
  • 已通知服务器该应用已在BG中。
  • 服务器启动计时器。
  • 此设备的服务器上的已用时间超过5分钟(因为应用仍在BG中)。
  • 服务器发送通知。
  • 应用程序在BG中收到远程推送通知。
  • 应用程序将其状态通知给BG中的服务器(因此服务器知道它没有被终止,用户会话不应该被清除)

这个循环的远程通知和从BackGround设备回复服务器的过程一直持续到应用再次激活或终止为止。

按预期完美地运作。

案例2 :BackGround中的应用和设备已锁定

  • 应用推出
    • 用户已登录
    • App进入了BG
    • 已通知服务器该应用已在BG中。
    • 服务器启动计时器。
    • 设备已锁定
    • 此设备的服务器上的已用时间超过5分钟(因为应用仍在BG中)。
    • 服务器发送通知。
    • 设备接收通知,设备显示通知横幅。
    • 但非活动模式的应用程序未在BG中收到远程推送通知。
    • 结果应用程序无法回复服务器

整个周期都需要折腾。

最终的问题是如何在设备被锁定时使其工作。

1 个答案:

答案 0 :(得分:-1)

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

NSLog(@“user info%@”,userInfo); }

通过这种委托方法,您可以从服务器接收字典。并且可以相应地完成您的工作。此方法将在您点击通知托盘中的通知后调用您的应用程序。