当收到静默推送通知且应用程序在后台(ios)运行时,执行几行代码
为了支持,我在info.plist的“所需背景模式”中添加了一个键 项目0=应用程序下载内容以响应推送通知 此外,在“功能”部分中,我的后台模式已打开,并且选中了“远程通知”复选标记 现在我的问题是,当我运行我的应用程序时,我能够收到静默和一般推送通知,并且代码在前台模式下成功执行,但当我按下home按钮时(不是通过刷卡强制退出,而且设备的密码锁打开)我的应用程序将进入后台模式,然后即使我能够接收到具有警报和声音的推送通知,我的代码也不会执行,但应用程序不会在后台模式下启动 我认为,对于前台模式和后台模式,每当我的应用程序收到推送通知时,不管是静默推送通知还是常规推送通知,我在委托方法中的第一个日志都必须在控制台上打印,即NSLog(@“推送通知%@”,userInfo) 请帮助我,从过去2-3天以来,我一直在努力解决这个问题 我的信息列表当收到静默推送通知且应用程序在后台(ios)运行时,执行几行代码,ios,objective-c,iphone,background,notifications,Ios,Objective C,Iphone,Background,Notifications,为了支持,我在info.plist的“所需背景模式”中添加了一个键 项目0=应用程序下载内容以响应推送通知 此外,在“功能”部分中,我的后台模式已打开,并且选中了“远程通知”复选标记 现在我的问题是,当我运行我的应用程序时,我能够收到静默和一般推送通知,并且代码在前台模式下成功执行,但当我按下home按钮时(不是通过刷卡强制退出,而且设备的密码锁打开)我的应用程序将进入后台模式,然后即使我能够接收到具有警报和声音的推送通知,我的代码也不会执行,但应用程序不会在后台模式下启动 我认为,对于前台模式
我所做的几乎与您完全相同,只是我在应用程序位于后台时使用静默推送通知来显示本地通知,并在应用程序位于前台时使用它来更新某些状态。我不是注册后台获取,只是“远程通知” @Paulw11是正确的,每次调用DidReceiveEmoteNotify时都需要调用completionHandler 我会检查你的plist以确保你的背景模式配置正确。也许你可以发布你的plist的内容 我的通知负载看起来与您的完全相同,因此我认为这不是问题所在。我最初有问题,因为有效载荷不完全正确
请记住,如果您关闭应用程序(将其刷走),在应用程序重新启动之前,您将不会收到静默推送通知。我认为您需要使用“aps”之外的“内容可用”进行一次测试,如下所示:
-(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 = "";
};
}
您的代码应该始终调用
completionHandler
,因此您应该移动completionHandler(UIBackgroundFetchResultNewData)代码>在两个if语句之外。您可以根据收到的消息以及是否有新数据,选择更改传递给completionHandler的值。感谢W11的回复,但当我在应用程序处于后台时收到推送通知时,它必须打印NSLog(@“推送通知%@”,userInfo);这是控制台上的日志,但它并没有打印任何日志。有人知道我的问题的原因吗??请帮助我。感谢各位宝贵的反馈,我得到了解决方案。我的问题是,我用于测试的设备仅在后台不运行。今天我在另一台设备上测试了代码,它工作得很好。所以现在我必须弄清楚为什么这个特定的设备会这样运行,而不是在后台执行代码。谢谢tmorg,在您的回答之后,我用相应的更改更新了我的问题,但我认为当应用程序收到任何推送通知时,nslog的第一行应该必须在控制台上打印。@Harry尝试这个测试。始终返回UIBackgroundFetchResultNewData。除了写入日志,还可以尝试显示本地通知。我知道这很管用。
aps = {
alert = "This is test alert";
badge = 1;
};
"content-available" = 1;