收到静默推送通知且应用在后台运行时执行几行代码,ios

Posted

技术标签:

【中文标题】收到静默推送通知且应用在后台运行时执行几行代码,ios【英文标题】:Execute few lines of code when received silent push notification and app is running in background, ios 【发布时间】:2015-01-05 10:06:39 【问题描述】:
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary     *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    NSLog(@"PUSH NOTIFICATION %@",userInfo);


    if([userInfo[@"aps"][@"content-available"] intValue] == 1)

        NSLog(@"SILENT PUSH NOTIFICATION");

        //Here I'm inserting a flag value to my DB.

        completionHandler(UIBackgroundFetchResultNewData);

    
    else

        NSLog(@" GENERAL PUSH NOTIFICATION ");

        completionHandler(UIBackgroundFetchResultNoData);

    


My silent notification payload is 
        aps =     
            "content-available" = 1;
            sound = "";
        ;
    

为了支持,我在 info.plist 中的“必需的后台模式”中添加了一个键

item 0 = 应用下载内容以响应推送通知

此外,在功能部分中,我的后台模式已打开,并选择了远程通知复选标记。

现在我的问题是,当我运行我的应用程序时,我能够接收静默以及一般推送通知,并且代码在前台模式下成功执行,但是当我按下主页按钮时(不是通过滑动它强行退出,也设备的密码锁已打开)我的应用程序将进入后台模式,然后我的代码未执行,即使我能够接收具有警报和声音的推送通知,但应用程序未在后台模式下启动。

我在想,对于前台和后台模式,每当我的应用程序收到任何推送通知时,不管是静默还是一般推送通知,我第一次登录委托方法都应该在控制台上打印,即 NSLog( @"推送通知 %@",userInfo);

请帮助我自过去 2-3 天以来一直在努力解决这个问题。

我的 info.plist

【问题讨论】:

你的代码应该总是调用completionHandler,所以你应该把completionHandler(UIBackgroundFetchResultNewData);移到两个if语句之外。您可以根据收到的消息以及是否有新数据来选择更改传递给completionHandler的值 感谢 Paulw11 的回复,但是当我在应用程序处于后台时收到推送通知时,它必须打印 NSLog(@"PUSH NOTIFICATION %@",userInfo);此日志在控制台上,但它没有打印任何日志。 有人知道我的问题的原因吗?请帮帮我。 感谢大家的宝贵反馈,我得到了解决我的问题是我用于测试的设备只是没有在后台执行。今天我在另一台设备上测试了代码,它工作正常。所以现在我必须弄清楚为什么这个特定的设备会有这样的行为而不是在后台执行代码。 【参考方案1】:

除了我在应用程序处于后台时使用静默推送通知来呈现本地通知并在应用程序处于前台时使用它来更新某些状态之外,我所做的几乎与您完全相同。我没有注册后台获取,只有“远程通知”。

@Paulw11 是正确的,每次调用 didReceiveRemoteNotification 时都需要调用 completionHandler。

我会检查您的 plist 以确保您的后台模式配置正确。也许你可以发布你的 plist 的内容。

我的通知负载看起来和你的完全一样,所以我认为这不是问题所在。最初我遇到了问题,因为有效负载不完全正确。

请记住,如果您终止应用(将其滑开),则在重新启动应用之前,您不会收到静默推送通知。

【讨论】:

感谢 tmorg,在您回答后,我用相应的更改更新了我的问题,但我认为当应用收到任何推送通知时,nslog 的第一行应该必须在控制台上打印。 @Harry 试试这个测试。总是返回 UIBackgroundFetchResultNewData。除了写入日志之外,尝试呈现本地通知。我知道这行得通。【参考方案2】:

我认为您需要在“aps”之外使用“content-available”进行一次测试,如下所示:

aps = 
            alert = "This is test alert";
            badge = 1;
       ;
"content-available" = 1;

【讨论】:

以上是关于收到静默推送通知且应用在后台运行时执行几行代码,ios的主要内容,如果未能解决你的问题,请参考以下文章

静默通知上的 iOS 后台发布请求

在 iOS 中处理静默推送通知的最佳方法是啥

收到推送通知时在后台执行代码

当应用程序未运行时,通过静默推送通知在后台更新本地数据库

推送静默远程通知:当应用程序在后台运行时取消警报

iOS 静默推送通知失败并显示消息