Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当收到静默推送通知且应用程序在后台(ios)运行时,执行几行代码_Ios_Objective C_Iphone_Background_Notifications - Fatal编程技术网

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

当收到静默推送通知且应用程序在后台(ios)运行时,执行几行代码,ios,objective-c,iphone,background,notifications,Ios,Objective C,Iphone,Background,Notifications,为了支持,我在info.plist的“所需背景模式”中添加了一个键 项目0=应用程序下载内容以响应推送通知 此外,在“功能”部分中,我的后台模式已打开,并且选中了“远程通知”复选标记 现在我的问题是,当我运行我的应用程序时,我能够收到静默和一般推送通知,并且代码在前台模式下成功执行,但当我按下home按钮时(不是通过刷卡强制退出,而且设备的密码锁打开)我的应用程序将进入后台模式,然后即使我能够接收到具有警报和声音的推送通知,我的代码也不会执行,但应用程序不会在后台模式下启动 我认为,对于前台模式

为了支持,我在info.plist的“所需背景模式”中添加了一个键

项目0=应用程序下载内容以响应推送通知

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

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

我认为,对于前台模式和后台模式,每当我的应用程序收到推送通知时,不管是静默推送通知还是常规推送通知,我在委托方法中的第一个日志都必须在控制台上打印,即NSLog(@“推送通知%@”,userInfo)

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

我的信息列表

我所做的几乎与您完全相同,只是我在应用程序位于后台时使用静默推送通知来显示本地通知,并在应用程序位于前台时使用它来更新某些状态。我不是注册后台获取,只是“远程通知”

@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;