2015-05-18 6 views
0

Я использую маяки в своем приложении (приложение установлено на фон), и я устанавливаю серию UILocalNotifications на beacon:DidExitRegion: (вид тревоги, когда маяк теряется).Отключение UILocalNotifications после закрытия приложения

Редактировать: Когда приложение находится в фоновом режиме, пользователь выходит из региона, после чего уведомления установлены правильно. Когда пользователь хочет закрыть приложение, пока он все еще находится в фоновом режиме с набором уведомлений, я хочу отключить их все./edit

Проблема в том, что я хочу отключить все эти уведомления в AppWillTerminate. Согласно documetation, когда приложение находится в состоянии ожидания (ожидание в фоновом режиме для получения сигнала от маяка - CoreLocation), appWillTerminate не вызывается. Пользователи часто закрывают приложение, когда оно находится в фоновом режиме, а сигналы тревоги - уведомления не будут удалены.

Каков возможный способ избавиться от этих уведомлений?

У меня есть 1 предложение: выполнить «искусственную» задачу конечной длиной в фоновом режиме (как here) и фактически запустить приложение после получения beacon:didExitRegion: -> он не получает приостановлено, appWillTerminate будет называться. Он будет работать, но работает не более 10 минут, и я не думаю, что это элегантная вещь.

Возможно, другие способы сделать это? Спасибо.

ответ

0

Вы не можете выполнять какие-либо действия, когда пользователь перебирает ваше приложение в коммутаторе задач. Нет обратных вызовов, appWillTerminate или иным образом. Это по дизайну.

Возможно, вы сможете переделать отложенные уведомления, чтобы они были немедленно отправлены вашим приложением после временной задержки под программным управлением. Таким образом, они отправляются только в том случае, если приложение все еще работает, когда таймер отключается. Фокус в том, что ваше приложение может быть приостановлено по другим причинам (пользователь блокирует телефон, переключается на другое приложение), поэтому вам, вероятно, понадобится фоновая задача для этого. Предел в iOS 7+, кстати, теперь составляет 3 минуты, а не 10 минут, так что это самое длинное, что вы могли бы надежно отложить оповещения.

+0

Я, это ответ, которого я больше всего боялся. Так что это будет похоже на мое предложение в конце моего вопроса. Просто чтобы сохранить его в течение определенного промежутка времени по фоновой задаче. Спасибо за предложение. – izik461

1
// Specify custom data for the notification 
NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"someValue" forKey:@"someKey"]; 
localNotif.userInfo = infoDict; 

Вы можете дать ваше уведомлению ключа, чтобы идентифицировать и удалить его

UIApplication *app = [UIApplication sharedApplication]; 
NSArray *eventArray = [app scheduledLocalNotifications]; 
for (int i=0; i<[eventArray count]; i++) 
{ 
UILocalNotification* oneEvent = [eventArray objectAtIndex:i]; 
NSDictionary *userInfoCurrent = oneEvent.userInfo; 
NSString *key=[NSString stringWithFormat:@"%@",[userInfoCurrent valueForKey:@"someKey"]]; 
if ([uid isEqualToString:uidtodelete]) 
    { 
    //Cancelling local notification 
    [app cancelLocalNotification:oneEvent]; 
    break; 
    } 
} 

От компании Apple Документов

Для приложений, которые не поддерживают выполнение фона или связаны с прошивкой 3 .x или ранее, этот метод всегда вызывается, когда пользователь выходит из приложения. Для приложений, поддерживающих фоновое выполнение, этот метод обычно не вызывается, когда пользователь выходит из приложения, потому что приложение просто перемещается в фоновый режим в этом случае. Однако этот метод можно вызвать в ситуациях, когда приложение работает в фоновом режиме (не приостановлено), и система по какой-то причине должна его прекратить.

applicationWillTerminate when is it called and when not

Если ваше приложение имеет фон включено использование:

- (void)applicationDidEnterBackground:(UIApplication *)application 

// Адрес менеджер Делегат

-(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region 
{ 
if (state == CLRegionStateInside) 
{ 
    //Start Ranging 
    [manager startRangingBeaconsInRegion:self.beaconRegion]; 
} 
else 
{ 
    //Stop Ranging here 
} 
} 
+0

Это способ отключить специальное уведомление. Я использую его для удаления уведомлений с определенного маяка. Проблема в том, что я не могу использовать ее при закрытии приложения, потому что appWillTerminate не вызывается. – izik461

+0

please chck edit answer – Mukesh

+0

Способы, о которых вы пишете, должны запускаться при нажатии кнопки «домой», когда приложение находится на переднем плане. Мое приложение находится в фоновом режиме (код на самом деле не запущен, ожидая запуска из приложения CoreLocation -> приложение приостановлено), а приостановленное приложение не будет вызывать appWillTerminate при закрытии (дважды нажмите кнопку «домой» и «проведите по экрану приложение»), в котором я хочу для удаления уведомлений. – izik461

0

Если приложение завершается с прошивкой (например, после того, как вы проводите пальцем вверх в переключателе задач), то при следующем входе/выходе из зоны маякового радиосигнала будет вызываться метод AppDelegatedidFinishLaunchingWithOptions до didEnterRegion или didExitRegion. Вы можете таким образом:

  1. Инициализировать _launchTimetimestamp в didFinishLaunchingWithOptions.

  2. В didExitRegion проверьте, не было ли в прошлом _launchTimestamp, и если да, то подавите уведомления.

+0

Я отредактировал свой вопрос. Ситуация немного отличается от того, что вы разрешили. didExitRegion не следует вызывать во второй раз (уведомления устанавливаются во время выхода из региона в первый раз), и уведомления должны быть отключены при прокрутке приложения. – izik461

+0

Вызывается ли didFinishLaunchingWithOptions до появления уведомлений в этом случае? Если это так, вы можете использовать его для их отмены. – davidgyoung

Смежные вопросы