Местное уведомление о прекращении подачи заявки

Я работаю над приложением, которое не будет работать, если оно завершено. Он имеет некоторые фоновые задачи. Я хочу показать локальное уведомление, если приложение будет завершено. Есть приложения, которые делают это, что означает, что это выполнимо. Но я не могу найти способ.

Я попытался настроить локальное уведомление в applicationWillTerminate: метод appdelegate, а также добавил уведомление о завершении приложения в моем диспетчере view, но ни один из методов не вызван, когда приложение фактически завершено.

- (void)applicationWillTerminate:(UIApplication *)application
{
    NSLog(@"terminated");
    UIApplication * app = [UIApplication sharedApplication];
    NSDate *date = [[NSDate date] dateByAddingTimeInterval:15];
    UILocalNotification *alarm = [[UILocalNotification alloc] init] ;
    if (alarm) {
        alarm.fireDate = [NSDate date];
        alarm.timeZone = [NSTimeZone defaultTimeZone];
        alarm.repeatInterval = 0;
        alarm.alertBody = @"This app does not work if terminated";
        alarm.alertAction = @"Open";
        [app scheduleLocalNotification:alarm];
    }

    [app presentLocalNotificationNow:alarm];
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

Любая помощь будет большой.

Спасибо заранее!

Ответ 1

Вы не получите уведомления, когда оно будет прекращено, когда ваше приложение будет приостановлено в фоновом режиме.

iOS отправит сигнал kill -9 для ваших приложений, и ваше приложение просто будет убито, это то же самое, что происходит, когда пользователь убивает ваше приложение из лотка быстрой загрузки.

Из документации Apple:

Даже если вы разрабатываете приложение с помощью iOS SDK 4 и более поздних версий, вы все равно должны быть готовым к тому, чтобы ваше приложение было убито без какого-либо уведомления. пользователь может явно убивать приложения, используя многозадачный интерфейс. К тому же, если память будет ограничена, система может удалить приложения из чтобы сделать больше места. Приостановленные приложения не уведомляются о завершение, но если ваше приложение в настоящее время работает в фоновом режиме (и не приостановлено), система вызывает applicationWillTerminate: метод вашего делегата приложения. Ваше приложение не может запросите дополнительное время выполнения фона из этого метода.

Ответ 2

Приложения могут создавать локальное уведомление в "будущую" дату и время, которые могут быть использованы для уведомления пользователя о завершении приложения. Если они затем коснутся приложения, они смогут перезагрузить приложение.

Это работает в моем приложении, которое использует/требует Bluetooth Central в info.plist(поэтому он будет работать в фоновом режиме). Я предполагаю, что вы настроили приложение для работы в фоновом режиме в вашем info.plist.

- (void)applicationWillTerminate:(UIApplication *)application
{
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    // Schedule an alarm here to warn the user that they have terminated an application and if they want to re-activate it.

    NSDate * theDate = [[NSDate date] dateByAddingTimeInterval:10]; // set a localnotificaiton for 10 seconds

    UIApplication* app = [UIApplication sharedApplication];
    NSArray*    oldNotifications = [app scheduledLocalNotifications];


    // Clear out the old notification before scheduling a new one.
    if ([oldNotifications count] > 0)
        [app cancelAllLocalNotifications];

    // Create a new notification.
    UILocalNotification* alarm = [[UILocalNotification alloc] init];
    if (alarm)
    {
        alarm.fireDate = theDate;
        alarm.timeZone = [NSTimeZone defaultTimeZone];
        alarm.repeatInterval = 0;
        alarm.soundName = @"sonar";
        alarm.alertBody [email protected]"Background uploads are disabled. Tap here to re-activate uploads." ;

        [app scheduleLocalNotification:alarm];
    }

}

Ответ 3

У меня была такая же проблема, как и вы. Тем не менее, я обнаружил, что если я не установил firedate, он начал работать.

- (void)applicationWillTerminate:(UIApplication *)application
{
//Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
    if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1){
        //Annoy The User - Set a badge
        [application setApplicationIconBadgeNumber:1];

        //Try and alert the user
        UILocalNotification *notification = [[UILocalNotification alloc] init];
        notification.alertBody = @"Tracking disabled. Tap to resume.";
        notification.soundName = UILocalNotificationDefaultSoundName;
        [application scheduleLocalNotification:notification];
    }
#endif
}

Я должен предупредить вас, но это не работает в пустом приложении. Он работает над моим приложением, которое имеет много просмотров в памяти, поэтому оно должно быть связано с количеством времени, которое требуется для освобождения памяти.

Ш

Ответ 4

Из приложения дважды нажмите кнопку "домой" и проведите по экрану, чтобы убить приложение, всегда вызывает applicationWillTerminate. Если вы нажмете и отправьте приложение в фоновом режиме, а затем дважды нажмите еще раз, чтобы провести и убить приложение, applicationWillTerminate не может вызываться каждый раз.

- (void)applicationWillTerminate:(UIApplication *)application
{
        UILocalNotification *notification = [[UILocalNotification alloc] init];
        notification.userInfo =  [NSDictionary dictionaryWithObject:@"killed.app" forKey:@"Killed"];
        notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:2]; // Give some time for firing the notification at least 2 seconds.
        notification.alertBody = @"App is killed.";
        notification.soundName = UILocalNotificationDefaultSoundName;
        notification.timeZone = [NSTimeZone systemTimeZone];
        [[UIApplication sharedApplication] scheduleLocalNotification:notification];
        sleep(1); // I noticed that adding sleep is required as it makes sure the notification is set before the app exits.
}

Ответ 5

Мне удалось запланировать локальное уведомление в appWillTerminate, используя ниже код:

    let localNotification = UILocalNotification.init()
    localNotification.fireDate = Date.init(timeIntervalSince1970: Date().timeIntervalSince1970 + 1.5)
    localNotification.timeZone = TimeZone.current
    localNotification.repeatInterval = NSCalendar.Unit(rawValue: 0)
    localNotification.alertBody = "Did terminate app"
    localNotification.soundName = "sonar"
    UIApplication.shared.scheduleLocalNotification(localNotification)
    // block main thread
    DispatchQueue.global().async {
        sleep(1)
        DispatchQueue.main.sync {
            CFRunLoopStop(CFRunLoopGetCurrent())
        }
    }
    CFRunLoopRun()