Как подойти к обнаружению ошибок, когда локальные уведомления iOS перестают отображаться «через некоторое время»? - PullRequest
0 голосов
/ 06 мая 2019

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

Я запрограммировал приложение (Swift 5.0 для iOS 12), которое,среди других задач, напоминает пользователю три раза в день, чтобы сделать задачу.Три раза генерируются случайным образом (с некоторыми правилами распространения) и планируются как локальные уведомления в фиксированные даты, не повторяясь, в течение следующих двух недель, следовательно, всего 42.Уведомления получают расписания после того, как приложение запущено , остановлено , пользователь изменил некоторые данные , сервер синхронизации загрузил новые данные и после фоновой выборки .

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

Как мне найти эту ошибку?

Для меня уведомления появляютсяпо назначению (три раза в день, каждый день, в течение нескольких недель).Также я проверил фоновую выборку вручную через XCode (запуск из-за фоновой выборки).

Я дважды проверил свой код (генератор для дат уведомления и мой алгоритм планирования).Код никогда не падает, и используя вывод консоли, я проверил в Xcode, что уведомления были запланированы.

Мои лучшие догадки, кроме того, что я запрограммировал что-то не то, что он обновил приложение или iOS и не открывал приложение впоследствии - я слышал, что это может быть причиной.Но, честно говоря, я почти ничего не знаю об этом.: (

Планирование (LocalNotification содержит информацию для уведомления):

private static func schedule(localNotification: LocalNotification, withBadge badge: NSNumber? = nil) {
        // Create the notification content.
        let content = UNMutableNotificationContent()
        content.title = localNotification.title
        content.subtitle = localNotification.subtitle
        content.body = localNotification.body
        content.categoryIdentifier = localNotification.categoryIdentifier
        content.userInfo = localNotification.userInfo
        content.sound = UNNotificationSound.default
        content.badge = badge

        // Create the notification trigger.
        let trigger = UNCalendarNotificationTrigger(
            dateMatching: Calendar.current.dateComponents(
                [.year, .month, .day, .hour, .minute, .second],
                from: localNotification.date
            ),
            repeats: localNotification.repeats
        )

        // Create the request.
        let request = UNNotificationRequest(
            identifier: localNotification.identifier,
            content: content,
            trigger: trigger
        )

        // Add the request.
        UNUserNotificationCenter.current().add(request) {
            (error: Error?) in
        }
    }

Мой метод вывода на консоль:

UNUserNotificationCenter.current().getPendingNotificationRequests {
                        (notificationRequests: [UNNotificationRequest]) in
                        print(#function + " - numberPendingNotificationRequests: \(notificationRequests.count)")
                        for notificationRequest in notificationRequests {
                            print(" - \(notificationRequest.content.title)")
                            print("   - Identifier: \(notificationRequest.identifier)")
                            print("   - UserInfo: \(notificationRequest.content.userInfo)")
                            print("   - \(String(describing: notificationRequest.trigger?.description))")
                            print("   - \(notificationRequest.content.subtitle)")
                        }
                    }

Результаты в «условиях разработки»:как и ожидалось, и для меня в «режиме производства» (TestFlight) он работает, насколько я могу сказать. Тем не менее, некоторые пользователи испытывают описанную проблему.

1. Я что-то упускаю здесь очевидноеили я делаю общую ошибку (я не уверен на 100%, если планирование локальных уведомлений «разрешено» в фоновом режиме)?

2. Кто-нибудь еще здесь сталкивался с подобнымпроблемы и нашли причину или даже решение?

3. Есть ли способ воспроизвести или наблюдать эту ситуацию, не «дней ожидания, когда уведомления больше не появляются»?

PS Это мой первый пост здесь, и я также благодарен за совет относительно правильности самих постов.:)

...