Приложение потеряло контроль над локальными уведомлениями после обновления с App Store
У меня есть приложение с локальным уведомлением в App Store.
В последних 4 версиях обновлений к моему приложению были клиенты, которые испытали что-то странное: приложение потеряло контроль над предыдущими уведомлениями, они продолжали получать все уведомления, запланированные до обновления, хотя они должны были быть отменены с помощью [[UIApplication sharedApplication] cancelAllLocalNotifications]
!
Во время общения с этими клиентами я сказал им отключить напоминания, что-то, что выполняет cancelAllLocalNotifications
, но они утверждают, что продолжают получать напоминания.
Кроме того, переустановка приложения не избавляет от старых уведомлений! Как будто iOS думает, что это другое приложение.
Это не происходит с большинством моих клиентов, только до редких, но все же, это происходит каждое обновление!
Как это может быть?
Обновление
3 года спустя, и это все еще происходит.
Каждое обновление некоторых клиентов продолжает получать локальные уведомления, но приложение не может их видеть и не может контролировать.
Может ли кто-нибудь решить эту проблему или доказать, что это ошибка iOS?
Ответы
Ответ 1
Вы проверили Как UIApplication cancelAllLocalNotifications работает между обновлениями приложений?
У него нет окончательных ответов, но, возможно, это было бы полезно.
Попробуйте выяснить, что особенно важно для клиента, который испытывает это:
- Всегда ли такие клиенты испытывают такое поведение?
- Какую версию iOS они используют?
- Как они используют ваше приложение по-другому? У вас запланировано много уведомлений?
- Как они делают обновление? (эфир, синхронизация и т.д.).
Ответ 2
У меня были подобные проблемы с уведомлениями. Моим решением на самом деле было указать конкретную дату и только один раз уведомить об этом. Строка applicationIconBadgeNumber = 0 удаляет уведомление из списка уведомлений. Номер значка устанавливается только тогда, когда пользователь вошел в приложение. В случае, когда пользователь еще не видел это сообщение, вы можете просто добавить проверку в applicationWillEnterForeground и отобразить правильный UIAlertView с тем же сообщением, что и уведомление, и вы можете получить последнее уведомление аналогичным образом, используя notificationArray. Когда вам нужно установить новое уведомление, "isNotified" требует setValue: @ "0" и быть синхронизированным. Когда я использую несколько уведомлений, я сохраняю состояния следующим образом:
[userDefaults setValue:@"1" forKey:[NSString stringWithFormat:@"notification-%@", @"12"]];
NSInteger number = [[userDefaults objectForKey:[NSString stringWithFormat:@"notification-%@", @"12"]] integerValue];
В MainViewController.m
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSInteger alreadyNotified = [[userDefaults objectForKey:@"isNotified"] integerValue];
if (alreadyNotified == 0) {
NSInteger seconds = 60;
NSString *message = @"Just testing!";
UILocalNotification *notification = [[UILocalNotification alloc] init];
UIUserNotificationSettings *currentSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];
BOOL allowNotif = (currentSettings.types != UIUserNotificationTypeNone);
BOOL allowsSound = (currentSettings.types & UIUserNotificationTypeSound) != 0;
BOOL allowsBadge = (currentSettings.types & UIUserNotificationTypeBadge) != 0;
BOOL allowsAlert = (currentSettings.types & UIUserNotificationTypeAlert) != 0;
if (notification)
{
if (allowNotif)
{
NSDate *now = [NSDate date];
if (seconds > 0) {
now = [now dateByAddingTimeInterval:seconds];
}
notification.fireDate = now;
notification.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
notification.repeatInterval = 0;
NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"id", message, @"message", nil];
notification.userInfo = userInfo;
}
if (allowsAlert)
{
notification.alertBody = message;
}
if (allowsBadge)
{
notification.applicationIconBadgeNumber = 1;
}
if (allowsSound)
{
notification.soundName = UILocalNotificationDefaultSoundName;
}
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setValue:@"1" forKey:@"isNotified"];
[userDefaults synchronize];
}
} else {
UIApplication *app = [UIApplication sharedApplication];
NSArray *notificationArray = [app scheduledLocalNotifications];
for (int i=0; i<[notificationArray count]; i++)
{
UILocalNotification *notification = [notificationArray objectAtIndex:i];
[app cancelLocalNotification:notification];
}
}
В AppDelegate.m
- (void)applicationWillEnterForeground:(UIApplication *)application {
application.applicationIconBadgeNumber = 0;
}
Ответ 3
Добавьте в приложение следующий код: didFinishLaunchingWithOptions: метод для удаления всех уведомлений.
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
После выполнения вы можете добавить новые уведомления.
Ответ 4
Эй, это то, что также происходит с моим приложением. Мои локальные уведомления запускаются в следующих сценариях:
1. пользователь удалил приложение
- Используя то же приложение на одном устройстве, но с другим именем пользователя, они получают предупреждения для последнего зарегистрированного пользователя.
- Фактически его UILocalNotification
ведет себя, мы должны отменить их, иначе IOS сохранит их в течение хотя бы некоторого времени (не уверен, как долго), когда приложение будет удалено, и они были запланированы приложением во время удаления и не были отменены.
Поэтому всегда проверяйте, когда происходит установка вашего приложения, сохраняйте чек и отменяйте все запланированные уведомления.
like
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
if(//its a fresh install){
[[UIApplication sharedApplication] cancelAllLocalNotifications];
}
}
cancelAllLocalNotifications
отменяет все существующие уведомления.
Надеюсь, это поможет.