Подтвердить что ты не робот

Приложение потеряло контроль над локальными уведомлениями после обновления с App Store

У меня есть приложение с локальным уведомлением в App Store.

В последних 4 версиях обновлений к моему приложению были клиенты, которые испытали что-то странное: приложение потеряло контроль над предыдущими уведомлениями, они продолжали получать все уведомления, запланированные до обновления, хотя они должны были быть отменены с помощью [[UIApplication sharedApplication] cancelAllLocalNotifications]!

Во время общения с этими клиентами я сказал им отключить напоминания, что-то, что выполняет cancelAllLocalNotifications, но они утверждают, что продолжают получать напоминания.

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

Это не происходит с большинством моих клиентов, только до редких, но все же, это происходит каждое обновление!

Как это может быть?

Обновление

3 года спустя, и это все еще происходит.

Каждое обновление некоторых клиентов продолжает получать локальные уведомления, но приложение не может их видеть и не может контролировать.

Может ли кто-нибудь решить эту проблему или доказать, что это ошибка iOS?

4b9b3361

Ответ 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. пользователь удалил приложение

  1. Используя то же приложение на одном устройстве, но с другим именем пользователя, они получают предупреждения для последнего зарегистрированного пользователя.

- Фактически его UILocalNotification ведет себя, мы должны отменить их, иначе IOS сохранит их в течение хотя бы некоторого времени (не уверен, как долго), когда приложение будет удалено, и они были запланированы приложением во время удаления и не были отменены.

Поэтому всегда проверяйте, когда происходит установка вашего приложения, сохраняйте чек и отменяйте все запланированные уведомления.

like

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    if(//its a fresh install){

     [[UIApplication sharedApplication] cancelAllLocalNotifications];

    }


    }

cancelAllLocalNotifications отменяет все существующие уведомления.

Надеюсь, это поможет.