在iOS中强行关闭应用程序时处理whatsapp等通知?

时间:2016-06-09 17:30:49

标签: ios objective-c swift push-notification whatsapp

我正在创建一个像whatsapp这样的聊天信使应用,并试图实现类似于whatsapp的通知功能。在whatsapp中,当您收到通知时,它会将数据存储在某个地方,当您关闭wifi并进入应用程序时,消息将被注入应用程序中。这意味着即使应用程序关闭,whatsapp也会以某种方式访问​​通知。

我的方法:我在后台模式下收到通知并将其保存到文件中。因此,如果用户与互联网断开连接并进入应用程序,则仍会在 applicationWillAppear 上注入消息。这是完美的,但当你强行关闭你的应用程序(双击主页并向上滑动应用程序)它不起作用。我几乎搜索了所有内容,并且如果您强行关闭应用程序,则说背景提取将无效。

那么whatsapp是如何做到的?什么是其他解决方案?

我的解决方案:

打开背景提取和XCode远程通知的后台模式。接下来在应用程序中添加以下代码:willFinishLaunchingWithOptions:

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

在AppDelegate.m文件中添加了此内容

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

  NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);

  if (0 < [paths count]) {
    NSString *documentsDirPath = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirPath stringByAppendingPathComponent:@"notification.txt"];

    NSString *content = [NSString stringWithFormat:@"%@", userInfo];
    NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:filePath]) {
      // Append text to the end of file
      NSFileHandle *fileHandler = [NSFileHandle fileHandleForWritingAtPath:filePath];
      [fileHandler seekToEndOfFile];
      [fileHandler writeData:data];
      [fileHandler closeFile];
    } else {
      // Create the file and write text to it.
      [content writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
    }
  }

  handler(UIBackgroundFetchResultNewData);

}

更新:我的通知中确实有以下标志

content-available: 1

2 个答案:

答案 0 :(得分:3)

后台推送不会传递给用户终止的应用。

除非是voip push,否则应用程序将在必要时由操作系统启动(但是,如果您的应用为用户提供了voip功能,则只能使用voip push。)

答案 1 :(得分:0)

  

您可以通过静默推送通知(即使应用程序终止也在后台运行应用程序)来实现此目的,以修改推送   有效载荷

{
    aps = {
        "content-available" : 1,
        sound : ""
    };
}