Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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 苹果罐头';s静默推送通知是否在后台启动我的应用?_Ios_Apple Push Notifications - Fatal编程技术网

Ios 苹果罐头';s静默推送通知是否在后台启动我的应用?

Ios 苹果罐头';s静默推送通知是否在后台启动我的应用?,ios,apple-push-notifications,Ios,Apple Push Notifications,根据苹果的文档,我可以通过在apspayload字典中添加“content available”=1键值来注册静默通知。当静默通知到达时,我希望我的应用程序在后台唤醒。我在我的info.plist中将应用程序下载内容以响应推送通知值设置为所需的后台模式 这是我的字典 {"aps": { "alert":"Notification alert","badge":1,"sound":"default","content-available":1 } } 我在-

根据苹果的文档,我可以通过在
aps
payload字典中添加
“content available”=1
键值来注册静默通知。当静默通知到达时,我希望我的应用程序在后台唤醒。我在我的info.plist中将
应用程序下载内容以响应推送通知
值设置为
所需的后台模式

这是我的字典

{"aps":
      {
       "alert":"Notification alert","badge":1,"sound":"default","content-available":1
      }
}
我在
-(void)应用程序:(UIApplication*)应用程序didReceiveMemotentification:(NSDictionary*)用户信息fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler中收到回调
当我的应用程序处于后台时。但我的问题是,当我们的应用程序处于终止状态时,我们能得到这个或任何其他方法的回调吗

我不希望我的应用程序用户看到通知,但我希望我的应用程序通过静默通知在后台将其唤醒,从而执行某些任务


如果您有任何建议,我们将不胜感激。

当设备收到带有
可用内容设置的推送消息时,您的应用程序将由苹果在后台启动。用户不会意识到这一点:

可用内容:此键的值为1,表示新内容可用。包含此键和值意味着当您的应用程序在后台启动或恢复时,将调用-application:DidReceiveEmotentification:fetchCompletionHandler:

也来自

DidReceiveMemotentification:但是,如果用户 他已经放弃了。在这种情况下,用户必须重新启动你的应用程序 或者在系统尝试启动应用程序之前重新启动设备 又自动地


我曾经遇到过类似的情况,我编写这段代码是为了调试我的应用程序是否在静默通知中唤醒

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *str = [defaults objectForKey:@"key"];
    if (str  == nil) {
        str = @"didReceiveRemoteNotification";
    }else{
        str = [NSString stringWithFormat:@"%@, didReceiveRemoteNotification",str];
    }
    [defaults setObject:str forKey:@"key"];
    [defaults synchronize];
}
这段代码的工作原理类似于,如果你的应用程序被唤醒,那么你将在此方法中得到回调,并且方法名称将写入
NSUserDefaults
。因此,当您手动调试应用程序时,您可以看到
str
string变量的值,如果存在string
didReceiveMemotentification
,您将知道应用程序已唤醒

注意:这只在后台模式下对我有效。当我没有强制关闭(手动终止)我的应用程序时,我得到了值,但当我从应用程序切换器强制关闭我的应用程序时,我不会得到任何值


我希望这能起作用。

你是对的,但问题是,如果我的应用程序处于终止状态,并且收到一个无声通知,那么我的应用程序不会在后台启动。你确定吗?这可能很难调试。当应用程序启动时,您可能会发现最简单的方法(如果您的Xcode调试fu不是100%)是在文件中写入日志,这样您就可以看到应用程序正在激活,即使您没有使用Xcode调试程序连接到它。这项技术确实有效,但如果你的应用程序被用户手动终止,操作系统通常会认为这是用户不想让它运行的提示。当然,iOS中的其他几个“后台”进程(例如,使用NSURLSession的后台文件传输)不会像从应用程序切换器中删除应用程序那样启动应用程序。我不知道这个特殊的情况,但如果我发现一个手动终止的应用程序在用户手动重新启动之前不会在推送通知中唤醒,这并不奇怪。@MattGibson我只是按照你说的做。我正在从应用程序切换器终止我的应用程序,我实际上想要的是在后台保持套接字连接,即使用户杀死了应用程序,这也是我尝试在我的应用程序中使用静默通知的原因。这就像在不知道用户的情况下设置一段时间的静默通知,我可以在后台唤醒我的应用程序。这是否可行?还是我走错了方向?或者我的问题的任何其他解决方案?从外观上看,我正确地认为,如果应用程序已从应用程序切换器中删除,则在收到通知时不会启动。在我看来,这似乎是明智的、用户友好的行为:如果我明确地杀死你的应用程序,我希望它保持死机状态。