根据Apple的文档,我可以通过在"content-available" = 1
有效负载词典中添加aps
键值来注册静默通知。当安静通知到来时,我希望我的应用程序在后台唤醒。我在info.plist
App downloads content in response to push notifications
值设置为Required background modes
这是我的有效载荷词典
{"aps":
{
"alert":"Notification alert","badge":1,"sound":"default","content-available":1
}
}
当我的应用处于后台时,我正在-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
收到回调。但我的问题是,当我们的应用程序处于被杀死状态时,我们可以回调这个或任何其他方法吗?
我不希望我的应用用户看到通知,但我希望我的应用通过无声通知在后台唤醒来执行某项任务。
任何建议都将不胜感激。
答案 0 :(得分:6)
当设备收到设置为content-available
的推送消息时,Apple会在后台启动您的应用。用户不会意识到这一点。 From the docs:
content-available :为此密钥提供值1,表示新内容可用。包含此键和值意味着当您的应用在后台启动或已恢复时,会调用
-application:didReceiveRemoteNotification:fetchCompletionHandler:
。
同样来自docs
didReceiveRemoteNotification:但是,如果用户,系统不会自动启动您的应用 有力退出它。在这种情况下,用户必须重新启动您的应用 或在系统尝试启动您的应用程序之前重新启动设备 再次自动。
答案 1 :(得分:4)
我遇到过类似的情况,如果我的应用程序在静音通知中醒来,我会编写此代码进行调试。
-(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
字符串变量的值,如果有字符串didReceiveRemoteNotification
,那么您将知道应用程序已经醒来。
注意:这仅适用于我的后台模式。当我没有强制关闭(手动终止)我的应用程序时,我得到了价值但是当我从应用程序切换器强制关闭我的应用程序时,我将无法获得任何价值。
我希望有效。