Местное уведомление о прекращении подачи заявки
Я работаю над приложением, которое не будет работать, если оно завершено. Он имеет некоторые фоновые задачи. Я хочу показать локальное уведомление, если приложение будет завершено. Есть приложения, которые делают это, что означает, что это выполнимо. Но я не могу найти способ.
Я попытался настроить локальное уведомление в 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()