ios - 当应用程序在后台并且设备被锁定时处理推送通知

标签 ios iphone apple-push-notifications

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

基本要求是在用户杀死应用程序后立即从服务器结束用户 session ,但是由于我们可以在代码中获取应用程序终止事件的已知方法(除了启动最多可以运行 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
}

这种方法有助于跟踪应用程序是否终止,如果服务器没有从它发送的通知中得到任何响应,它会从服务器清除用户 session 。

现在,有两种情况,第一种情况可以按预期完美运行,第二种情况则没有。

案例 1 : 后台中的应用程序,但 设备未锁定
  • 应用上线
  • 用户登录
  • 应用进入 BG
  • 已通知服务器应用程序在 BG 中。
  • 服务器启动计时器。
  • 此设备在服务器上耗时超过 5 分钟(作为应用程序仍在 BG 中)。
  • 服务器发送通知。
  • App 在 BG 中接收远程推送通知。
  • 应用程序将其状态通知给位于 BG 中的服务器(因此服务器知道它没有终止并且不应清除用户 session )

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

    按预期工作得很好。

    案例 2 : 背景中的应用程序和设备锁定
  • 应用启动
  • 用户登录
  • 应用进入 BG
  • 已通知服务器应用程序在 BG 中。
  • 服务器启动计时器。
  • 设备已锁定
  • 此设备在服务器上耗时超过 5 分钟(作为应用程序仍在 BG 中)。
  • 服务器发送通知。
  • 设备收到通知,设备显示通知横幅。
  • 但是处于非事件模式的应用程序不会在 BG 中收到远程推送通知。
  • 结果应用程序无法回复服务器

  • 整个周期都在折腾。

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

    最佳答案

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

    NSLog(@"用户信息 %@",userInfo );
    }

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

    关于ios - 当应用程序在后台并且设备被锁定时处理推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25868652/

    相关文章:

    ios - NSHashTable 保留弱引用

    iphone - 托管对象上下文保存失败怎么办?

    ios - 如何让 UILabel 显示轮廓文本?

    unicode - APNS 表情符号 unicode\u 和\U

    c# - APNS APPLE C# sslstream 响应

    ios - 应用程序关闭后如何保存引脚注释(Swift)

    ios - React Native Setup EXPO DEBUG 问题

    apple-push-notifications - 如何在 Swift 3 中将 apns 数据转换为字符串?

    ios - SKAction scaleBy : duration: SpriteKit

    iphone - zbar应用中扫描页面的自定义