【发布时间】: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);此日志在控制台上,但它没有打印任何日志。
-
有人知道我的问题的原因吗?请帮帮我。
-
感谢大家的宝贵反馈,我得到了解决我的问题是我用于测试的设备只是没有在后台执行。今天我在另一台设备上测试了代码,它工作正常。所以现在我必须弄清楚为什么这个特定的设备会有这样的行为而不是在后台执行代码。
标签: ios objective-c iphone background notifications