应用程序关闭时接收推送

时间:2014-10-27 11:51:55

标签: ios objective-c push-notification

我正在尝试保存推送通知有效负载附带的数据。它在应用程序运行时运行良好,但在应用程序关闭时无效。

当应用程序完全关闭而不是在后台时,如何将数据从推送通知保存到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));
    }
} 

2 个答案:

答案 0 :(得分:0)

以下摘自苹果文档......

  

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

请注意突出显示的文字,如果应用完全关闭,则不会启动该应用

答案 1 :(得分:0)

我不将它们保存到CoreData中,但我将它们保存到NSUserDefaults中。这个解决方案是由Apple Team Support推荐的,它仅适用于iOS 10,我实现了它并且运行良好!我留下链接:

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

这是程序:

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

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

    1. 必须启用应用程序组才能创建资源,您可以在其中保存和阅读应用和扩展程序的信息。单击“显示项目导航器”。进入目标列表中选择您的主项目。然后,单击“功能”并打开名为“应用程序组”的选项。请添加App Group的标识符以标识共享资源。您应该对您创建的扩展目标执行相同的步骤(选择扩展目标 - 功能 - 在“应用程序组”处启用 - 为应用程序组添加相同的标识符)

    2. 您应该将扩展的标识符添加到Apple开发者网站以识别通知服务扩展,您还应该制作新的临时配置文件(开发,AdHoc和/或生产)并将其与新的临时关联配置文件。

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

    4.   

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

      1. 在Xcode上下载新的临时配置文件,并将它们与您的通知服务扩展相关联。请确保一切顺利。

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

      3. 返回Project导航器并选择扩展程序的文件夹。打开.m文件。您将看到一个名为didReceiveNotificationRequest:(UNNotificationRequest *)请求的方法。在此方法中,您将创建一个不同的NSUserDefaults,其SuiteName与应用程序组的标识符完全相同,如下所示:

          

        NSUserDefaults * defaultsGroup = [[NSUserDefaults alloc]   initWithSuiteName:@“app group的标识符”];

      4. 在同一方法中,获取通知正文并将其保存到NSMutableArray中,然后将其保存在共享资源中。像这样:

      5. - (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方法中,使用以下代码将Array恢复到共享资源中:
        2. NSUserDefaults *defaultsGroup = [[NSUserDefaults alloc] initWithSuiteName: @"Identifier for app group"];
          NSMutableArray *notifications = [[defaultsGroup objectForKey:@"notifications"] mutableCopy];
          
          1. 享受吧!
          2. 我希望每一步都清楚。我将写一篇帖子来实现这个解决方案,并在我的页面中显示图像。您应该考虑的另一点是它不适用于静音推送通知。