Уведомление 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-уведомление все равно не будет перезапущено.

Ответы на вопрос(1)

Ваш ответ на вопрос