应用关闭时接收推送
Posted
技术标签:
【中文标题】应用关闭时接收推送【英文标题】:Receive push when app is closed 【发布时间】:2014-10-27 11:51:54 【问题描述】:我正在尝试保存推送通知有效负载附带的数据。在应用运行时效果很好,但在应用关闭时效果不佳。
当应用程序完全关闭而不是在后台时,如何将推送通知中的数据保存到 sqlite db。
我需要在应用程序关闭并收到推送通知时执行此代码
- (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));
【问题讨论】:
你能展示你用来做这个的代码吗? - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler //保存数据 NSLog(@" 收到远程通知: %@“, 用户信息); for (NSString *key in [userInfo allKeys]) NSString *data = [userInfo objectForKey:key]; NSLog(@"inside 确实注册了通知 .... %@ ---- > %@",key,data); ...您可以显示您在问题中使用的格式化代码吗? 【参考方案1】:以下内容摘自苹果文档...
使用此方法为您的应用处理传入的远程通知。与 application:didReceiveRemoteNotification: 方法不同,该方法仅在您的应用程序在前台运行时调用,系统在您的应用程序在前台或后台运行时调用此方法。此外,如果您启用了远程通知后台模式,系统会启动您的应用程序(或将其从挂起状态唤醒)并在推送通知到达时将其置于后台状态。 但是,如果用户强制退出应用,系统不会自动启动您的应用。在这种情况下,用户必须重新启动您的应用或重启设备,然后系统才会再次尝试自动启动您的应用.
注意突出显示的文字,如果完全关闭,应用程序将不会启动
【讨论】:
这里是苹果协议参考链接developer.apple.com/library/ios/documentation/uikit/reference/…: 不确定它是否会有很大帮助,抱歉没有提供任何代码【参考方案2】:我没有将它们保存到 CoreData,而是将它们保存到 NSUserDefaults。此解决方案由 Apple 团队支持推荐,仅适用于 iOS 10,我实施了它并且效果很好!我留下链接:
https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ModifyingNotifications.html
这是程序:
-
为您的应用创建一个新的通知服务扩展。打开您的项目并按 File - New - Target 并在 iOS 部分选择“通知服务扩展”选项。输入扩展名和所需的信息。之后,Xcode 会用 Objective C 语言添加两个文件:.h 和 .m 文件。
注意:考虑您将使用三个标识符: 1) 您的应用的标识符(您已经拥有) 2) 扩展程序的标识符(您将创建) 3) 应用组标识符。 (您将创建)
需要启用 App Groups 以创建资源,您可以在其中保存和读取您的应用和扩展程序的信息。单击“显示项目导航器”。在目标列表中选择您的主项目。然后,单击“功能”并打开名为“应用程序组”的选项。请添加 App Group 的标识符以识别共享资源。您应该对您创建的扩展目标执行相同的步骤(选择扩展目标 - 功能 - 在“应用程序组”处打开 - 为应用程序组添加相同的标识符)
您应该将您的扩展的标识符添加到 Apple 开发者网站以识别通知服务扩展,您还应该创建新的临时配置文件(开发、临时和/或生产)并将其与新的临时配置文件相关联个人资料。
在两个标识符(应用程序和扩展程序)上,您应该编辑它们并在它们中启用“应用程序组”服务。您应该将应用程序组的标识符添加到应用程序组服务中。
注意:应用程序标识符和扩展程序标识符应该具有 应用组的标识符相同。
在 Xcode 上下载新的临时配置文件并将它们与您的通知服务扩展相关联。请确保您一切正常。
之后,进入您的应用和扩展程序的“功能”,打开“应用组”部分并更新它们。这三个步骤 - 1) 将 App Groups 权利添加到您的权利文件,2) 将 App Groups 功能应用到您的 App ID 和 3) 将 App Groups 添加到您的 App ID - 应该检查。
返回项目导航器并选择您的扩展文件夹。打开 .m 文件。您将看到一个名为 didReceiveNotificationRequest:(UNNotificationRequest *)request 的方法。在此方法中,您将创建一个不同的 NSUserDefaults,其 SuiteName 与应用组的标识符完全相同,如下所示:
NSUserDefaults *defaultsGroup = [[NSUserDefaults alloc] initWithSuiteName:@"应用组标识符"];
在同样的方法中,获取通知正文并将其保存到 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"];
-
最后,进入主项目的 App Delegate,在 didFinishLaunchingWithOptions 方法中,使用以下代码将 Array 恢复到共享资源中:
NSUserDefaults *defaultsGroup = [[NSUserDefaults alloc] initWithSuiteName: @"Identifier for app group"]; NSMutableArray *notifications = [[defaultsGroup objectForKey:@"notifications"] mutableCopy];
-
尽情享受吧!
我希望每一步都清楚。我要写一篇文章来在我的页面中使用图像来实现这个解决方案。您应该考虑的另一点是它不适用于静默推送通知。
【讨论】:
以上是关于应用关闭时接收推送的主要内容,如果未能解决你的问题,请参考以下文章
应用程序关闭时如何接收推送和通知(Toast 和磁贴) windows 通用 8.1 应用程序