应用关闭时接收推送

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];
    尽情享受吧!

我希望每一步都清楚。我要写一篇文章来在我的页面中使用图像来实现这个解决方案。您应该考虑的另一点是它不适用于静默推送通知。

【讨论】:

以上是关于应用关闭时接收推送的主要内容,如果未能解决你的问题,请参考以下文章

如何接收应用程序停止或设备关闭时发送的 GCM 推送通知?

应用程序关闭时如何接收推送和通知(Toast 和磁贴) windows 通用 8.1 应用程序

即使应用程序关闭,whatsapp 如何设法接收推送通知?

当应用程序处于关闭状态时,不会出现 Sinch VoIP 推送通知

Sinch - 即时消息 - 应用关闭时收到推送通知

当应用程序被杀死Android时无法接收解析推送通知