当应用程序closures时接收推送

我正在尝试保存推送通知有效内容的数据。 它运行良好时,应用程序正在运行,而不是当应用程序closures。

当应用程序完全closures而不在后台时,如何将推送通知中的数据保存到sqlite数据库中。

我需要在应用程序closures时执行此代码,并收到推送通知

- (void) application:(UIApplication *)application didReceiveRemoteNotification:NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { //save data NSLog(@" Received remote notifcation: %@", userInfo); for (NSString *key in [userInfo allKeys]) { NSString *data = [userInfo objectForKey:key]; NSLog(@"inside did register for notification .... %@ ---- > %@",key,data); } query = [NSString stringWithFormat:@"INSERT INTO accounts(email_address) VALUES ('%@')",data; sqlite3_stmt *compiledStatement; if(sqlite3_prepare_v2(mydb, [query UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK) { if(SQLITE_DONE != sqlite3_step(compiledStatement)) { NSLog( @"Error while inserting data: '%s'", sqlite3_errmsg(mydb)); } else { NSLog(@"New data inserted"); isneed=@"yes"; } sqlite3_reset(compiledStatement); } else { NSLog( @"Error while inserting '%s'", sqlite3_errmsg(mydb)); } } 

以下是从苹果文件…

使用此方法处理传入的应用程序的远程通知。 与应用程序不同的是:didReceiveRemoteNotification:只在应用程序在前台运行时调用,方法是当您的应用程序在前台或后台运行时调用此方法。 另外,如果启用了远程通知后台模式,系统将启动您的应用程序(或将其从暂停状态唤醒),并在推送通知到达时将其置于后台状态。 但是,如果用户强制退出,系统不会自动启动您的应用程序。 在这种情况下,用户必须重新启动应用程序或在系统尝试再次自动启动应用程序之前重新启动设备。

请注意突出显示的文本,如果应用程序完全closures,则该应用程序将不会启动

我不会将它们保存到CoreData,但我将它们保存到NSUserDefaults。 这个解决scheme是由苹果团队支持推荐的,它只适用于iOS 10,我实现了它,它运行良好! 我离开链接:

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ModifyingNotifications.html

这是程序:

  1. 为您的应用程序创build一个新的通知服务扩展。 打开您的项目,然后按下文件 – 新build – 目标,然后在iOS部分select“通知服务扩展”选项。 把扩展名和所需的信息。 之后,Xcode将添加Objective C语言的两个文件:.h和.m文件。

注意:请考虑使用三个标识符:1)您的应用程序的标识符(您已经拥有) 2)您的分机的标识符(您将创build) 3)应用程序组的标识符。 (你将创build)

  1. 有必要启用应用程序组以创build一个资源,您可以在其中保存和读取您的应用程序和扩展的信息。 点击“显示项目导航器”。 进入目标列表select你的主要项目。 然后,点击“Capabilities”并打开名为“App Groups”的选项。 请添加App Group的标识符以识别共享资源。 您应该为您创build的扩展目标执行相同的步骤(select扩展名的目标 – function – 在“应用程序组”中打开 – 为App组添加相同的标识符)

  2. 您应该将您的扩展程序的标识符添加到Apple开发人员站点以确定通知服务扩展,同时您还应该制作新的临时configuration文件(开发,AdHoc和/或生产)并将其与新的临时configuration文件相关联。

  3. 在这两个标识符(应用程序和扩展)你应该编辑它们,并启用“应用程序组”服务在他们两个。 您应该将“应用标识符”组添加到“应用程序组服务”中。

注意:应用程序标识符和扩展标识符应该具有APP GROUP的相同标识符。

  1. 在Xcode上下载新的临时configuration文件,并将它们与您的通知服务扩展相关联。 请确保你和他们一切正常。

  2. 之后,进入您的应用程序和扩展的“function”,打开“应用程序组”部分,并更新它们。 这三个步骤 – 1)添加应用程序组权利到您的权利文件,2)应用程序组function到您的应用程序ID和3)添加应用程序组到您的应用程序ID – 应检查。

  3. 回到项目导航器,select你的扩展名的文件夹。 打开.m文件。 您将看到一个名为didReceiveNotificationRequest的方法:(UNNotificationRequest *)请求。 在这个方法中,你将创build一个与SuiteName完全相同的NSUserDefaults,就像这样:

    NSUserDefaults * defaultsGroup = [[NSUserDefaults alloc] initWithSuiteName:@“identifier for app group”];

  4. 在这个方法中,获取通知的主体并将其保存到NSMutableArray中,然后将其保存到共享资源中。 喜欢这个:

 - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler{ self.contentHandler = contentHandler; self.bestAttemptContent = [request.content mutableCopy]; NSMutableArray *notifications = [NSMutableArray new]; NSUserDefaults *defaultsGroup = [[NSUserDefaults alloc] initWithSuiteName: @"Identifier for app group"]; notifications = [[defaultsGroup objectForKey:@"notifications"] mutableCopy]; if (notifications != nil){ [notifications addObject:self.bestAttemptContent.userInfo]; }else{ notifications = [NSMutableArray new]; [notifications addObject:self.bestAttemptContent.userInfo]; } [defaultsGroup setObject:notifications forKey:@"notifications"]; } 
  1. 最后,在您的主项目的App Delegate中,在didFinishLaunchingWithOptions方法中,使用以下代码将数组恢复到共享资源中:
 NSUserDefaults *defaultsGroup = [[NSUserDefaults alloc] initWithSuiteName: @"Identifier for app group"]; NSMutableArray *notifications = [[defaultsGroup objectForKey:@"notifications"] mutableCopy]; 
  1. 好好享受!

我希望每一步都清楚。 我要写一篇文章来实现这个解决scheme与我的网页中的图像。 另一点你应该考虑的是它不适用于无声推送通知。