如果用户通过多任务界面向上滑动应用程序并且设备已重启,则无法使用voip pushkit通知重新启动应用程序。
但是,在以下情况下,可以使voip pushkit通知正常工作:
应用程序被强制退出,然后pushkit通知到达。 应用程序将立即重新启动。标准推送通知不能在这种情况下唤醒应用程序。
应用程序在后台/挂起状态下,设备重启。由于Voip模式,应用程序将在设备重启时重新启动(我可以在Xcode Activity Monitor中看到该过程)。 这里需要一个技巧来正确处理pushkit通知,具体方式在http://blog.biokoda.com/post/114315188985/ios-and-pushkit中描述为“在初始化PushKit之前开始后台任务。在接收到PushKit令牌时完成此任务”
但是,当同时满足设备重启和应用程序强制退出时,pushkit通知似乎无法重新启动应用程序。在查看Xcode中的设备日志时,我没有获得apsd的任何日志,显示系统已处理通知。
这是我的代码:
@implementation AppDelegate
{
UIBackgroundTaskIdentifier bgTask;
}
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIApplication* app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(
DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
while (true) {
;
}
});
// Initialize pushkit
PKPushRegistry *pushRegistry =
[[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
pushRegistry.delegate = self;
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
return YES;
}
- (void)pushRegistry:(PKPushRegistry *)registry
didUpdatePushCredentials:(PKPushCredentials *)credentials
forType:(NSString *)type{
UIApplication* app = [UIApplication sharedApplication];
[app endBackgroundTask:bgTask];
// ... more code to read the token ...
}
- (void)pushRegistry:(PKPushRegistry *)registry
didReceiveIncomingPushWithPayload:(PKPushPayload *)payload
forType:(NSString *)type {
// ... logging to check if notification is received ...
}
同时,在后台模式中我开启了"语音通话"和"远程通知"。
我知道其他应用程序,如WhatsApp,在这种情况下可以重新启动,所以我不明白我做错了什么。
另外,以下操作并不能解决问题:1)强制退出2)发送pushkit通知(将被接收到)3)重启。该应用程序将不会被重新启动,新的推送通知也无法将其重新启动。