Уведомление Voip Pushkit не перезапустит приложение, если оно было принудительно завершено и устройство было перезагружено
Я не могу получить уведомления voip pushkit для повторного запуска приложения, если пользователь принудительно завершил работу приложения (проводя по нему в многозадачном интерфейсе) И если устройство было перезагружено.
Однако я могу заставить уведомления voip pushkit работать в следующих сценариях:
Приложение было принудительно закрыто, после чего приходит уведомление о pushkit. Приложение будет перезапущено немедленно. Стандартные push-уведомления не способны разбудить приложение в таком сценарии.
Приложение было в фоновом режиме / приостановлено и устройство перезагружено. Благодаря режиму 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 ...
}
Также у меня включены «Голос по IP» и «Удаленные уведомления» в фоновых режимах.
Я знаю, что другие приложения, такие как Whatsapp, могут быть перезапущены в этом сценарии, поэтому я не понимаю, что я делаю неправильно.
С другой стороны, это не помогает: 1) Принудительно завершить работу 2) Отправить pushkit-уведомление, которое будет получено 3) Перезагрузить компьютер. Приложение не будет перезапущено, и новое push-уведомление все равно не будет перезапущено.