2013-08-01 3 views
10

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

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

- (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:. 
} 

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

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

ответ

3

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

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

От Apple documentation:

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

+0

то как другие приложения, такие как сон, если и можно это сделать? – Swati

+0

Не уверен, я просто знаю, что когда система убивает приложение, об этом не сообщается, и процесс просто прекращается, и память очищается. – rckoenes

+0

что такое applicationWillTerminate? – Swati

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 
} 

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

W

+2

верен. Вы можете просто добавить sleep (2) в applicationWillTerminate: – imcc

10

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

Это работает в моем приложении, которое использует/требует 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]; 
    } 

} 
+0

Привет, У меня есть аналогичное приложение, где я работаю с BLE. Но метод applicationWillTerminate никогда не вызван. Любой совет? – Amit

+0

Как вы тестируете это приложениеWillTerminate? Как выйти из приложения? –

+0

Работал для меня. Спасибо. – viral

0

Из приложения двойным нажатием на домашней кнопки и салфетки, чтобы убить приложение всегда вызывает 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. 
} 
0

Я был в состоянии планировать местное уведомление в 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() 
Смежные вопросы