Apple的无声推送通知能否在后台启动我的应用程序?

时间:2015-12-15 13:53:06

标签: ios apple-push-notifications

根据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 收到回调。但我的问题是,当我们的应用程序处于被杀死状态时,我们可以回调这个或任何其他方法吗?

我不希望我的应用用户看到通知,但我希望我的应用通过无声通知在后台唤醒来执行某项任务。

任何建议都将不胜感激。

2 个答案:

答案 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,那么您将知道应用程序已经醒来。

  

注意:这仅适用于我的后台模式。当我没有强制关闭(手动终止)我的应用程序时,我得到了价值但是当我从应用程序切换器强制关闭我的应用程序时,我将无法获得任何价值。

我希望有效。