我正在尝试保存推送通知有效负载附带的数据。它在应用程序运行时运行良好,但在应用程序关闭时无效。
当应用程序完全关闭而不是在后台时,如何将数据从推送通知保存到sqlite数据库。
我需要在应用程序关闭时执行此代码并收到推送通知
- (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));
}
}
答案 0 :(得分:0)
以下摘自苹果文档......
使用此方法处理应用的传入远程通知。与应用程序:didReceiveRemoteNotification:方法不同,只有当您的应用程序在前台运行时才会调用该方法,系统会在您的应用程序在前台或后台运行时调用此方法。此外,如果您启用了远程通知后台模式,系统将启动您的应用程序(或将其从暂停状态唤醒),并在推送通知到达时将其置于后台状态。 但是,如果用户强行退出,系统不会自动启动您的应用。在这种情况下,用户必须重新启动您的应用或重新启动设备,然后系统才会再次自动启动您的应用
请注意突出显示的文字,如果应用完全关闭,则不会启动该应用
答案 1 :(得分:0)
我不将它们保存到CoreData中,但我将它们保存到NSUserDefaults中。这个解决方案是由Apple Team Support推荐的,它仅适用于iOS 10,我实现了它并且运行良好!我留下链接:
这是程序:
注意:请考虑使用三个标识符: 1)您的应用的标识符(您已经拥有) 2)您的分机的标识符(您将创建) 3)应用程序组的标识符。 (您将创建)
必须启用应用程序组才能创建资源,您可以在其中保存和阅读应用和扩展程序的信息。单击“显示项目导航器”。进入目标列表中选择您的主项目。然后,单击“功能”并打开名为“应用程序组”的选项。请添加App Group的标识符以标识共享资源。您应该对您创建的扩展目标执行相同的步骤(选择扩展目标 - 功能 - 在“应用程序组”处启用 - 为应用程序组添加相同的标识符)
您应该将扩展的标识符添加到Apple开发者网站以识别通知服务扩展,您还应该制作新的临时配置文件(开发,AdHoc和/或生产)并将其与新的临时关联配置文件。
在两个标识符(应用程序和扩展程序)上,您应该编辑它们并在它们中启用“应用程序组”服务。您应该将标识符应用程序组添加到应用程序组服务中。
注意:应用程序的标识符和扩展的标识符应该有 APP GROUP的相同标识符。
在Xcode上下载新的临时配置文件,并将它们与您的通知服务扩展相关联。请确保一切顺利。
之后,在您的应用和扩展程序的“功能”中,打开“应用程序组”部分并更新它们。这三个步骤 - 1)将应用程序组权利添加到您的权利文件,2)将应用程序组功能应用到您的应用程序ID,3)将应用程序组添加到您的应用程序ID - 应该进行检查。
返回Project导航器并选择扩展程序的文件夹。打开.m文件。您将看到一个名为didReceiveNotificationRequest:(UNNotificationRequest *)请求的方法。在此方法中,您将创建一个不同的NSUserDefaults,其SuiteName与应用程序组的标识符完全相同,如下所示:
NSUserDefaults * defaultsGroup = [[NSUserDefaults alloc] initWithSuiteName:@“app group的标识符”];
在同一方法中,获取通知正文并将其保存到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"]; }
NSUserDefaults *defaultsGroup = [[NSUserDefaults alloc] initWithSuiteName: @"Identifier for app group"]; NSMutableArray *notifications = [[defaultsGroup objectForKey:@"notifications"] mutableCopy];
我希望每一步都清楚。我将写一篇帖子来实现这个解决方案,并在我的页面中显示图像。您应该考虑的另一点是它不适用于静音推送通知。