ios - Расписание неограниченного количества локальных уведомлений - PullRequest
2 голосов
/ 04 апреля 2020

У меня есть приложение, которое позволяет пользователям создавать повторяющиеся события. Каждое из событий может иметь или не иметь напоминания / предупреждения в определенное время c. Если это так, приложение отправляет локальное уведомление в это время суток.

События хранятся в CoreData .

Event(name: "Go to London", 
  date: 2020-04-03 21:40:55.419925+0200, 
  reminders: [2020-04-03 20:00:00.419925+0200, 
  2020-04-03 10:00:00.419925+0200, 
  2020-04-03 12:00:00.419925+0200]
)

Событие может происходить в каждый день года или каждый день в течение следующих X лет.

Пользователь может создавать неограниченное количество событий в день. И, следовательно, общее количество отправляемых уведомлений может легко превысить 64 (общее количество локальных уведомлений, которое вы можете запланировать в iOS). Поэтому я не могу запланировать все уведомления, пока приложение находится на переднем плане.

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

Буду рад, если вы предоставите решение или поможете мне найти решение для этого сценария.

info

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

Ответы [ 2 ]

2 голосов
/ 11 апреля 2020

Я не уверен, правильно ли я понимаю вашу проблему. Но у меня сложилось такое впечатление:

Ваши пользователи настраивают и обновляют базу данных событий, в которой каждое событие имеет определенную дату и время.
Они делают это, просто вводя новые события в базу данных. Тогда легко получить первые n (скажем, 10) события из базы данных. Требуется выбрать более одного, так как доставка локального уведомления не гарантируется, см. документы :

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

Зарегистрируйте эти n локальные уведомления в центре уведомлений и отмените любые уведомления о событиях, которых больше нет среди следующих n. Документы говорят:

Как правило, вы отменяете запрос при изменении условий и вам больше не нужно уведомлять пользователя. Например, если пользователь заполняет напоминание, вы отменяете любые активные запросы, связанные с этим напоминанием. Чтобы отменить активный запрос уведомления, вызовите метод UNUserNotificationCenter removePendingNotificationRequests(withIdentifiers:) или removePendingNotificationRequests(withIdentifiers:).

Так что, даже если ваше приложение находится в фоновом режиме или приостановлено, локальное уведомление разбудит его, обработайте событие, удалите его из базы данных и обновите следующие события n. Даже если уведомление не может быть доставлено (что, вероятно, но возможно), вы можете обработать пропущенное событие и запланировать следующие.
Надеюсь, это соответствует вашим требованиям!

1 голос
/ 07 апреля 2020

Вы пробовали использовать функцию фоновой выборки? Официальная ссылка на документ здесь .

И, на мой взгляд, было бы лучше использовать удаленное уведомление, просто настройте простой сервер для хранения данных пользователей.

...