#ios #cocoa-touch #uilocalnotification
#iOS #cocoa-touch #uilocalnotification
Вопрос:
Я создаю приложение для iPhone, в котором я реализовал концепцию локального уведомления, чтобы предупредить пользователя о приеме лекарств.
Но в iOS мы не можем запланировать более 64 уведомлений одновременно. Но у меня есть несколько записей даты и времени в базе данных. Как я могу запланировать более 64 уведомлений?
Ответ №1:
Как вы уже знаете, вы можете запланировать максимум 64 уведомления для каждого приложения. Если вы добавите больше, чем это, система сохранит самые быстрые 64 уведомления и отбросит остальные.
Один из способов убедиться, что все уведомления будут запланированы, — это сначала запланировать первые 64 уведомления, а затем через регулярные промежутки времени (может быть при каждом запуске приложения или при каждом запуске уведомления) проверять количество запланированных уведомлений, и если их меньше 64, допустим, n уведомлений, затем запланируйте следующие (64 — n) уведомления.
int n = [[[UIApplication sharedApplication] scheduledLocalNotifications] count];
int x = 64 - n;
// Schedule the next 'x' notifications
Комментарии:
1. Я предполагаю, что это означает 64 уведомления на приложение на устройство, или всего 64 уведомления на приложение? Например, если я использую 2 разных телефона, могу ли я получать 64 уведомления на каждом из них, всего 128?
2. это означает 64 уведомления на приложение на устройство
Ответ №2:
Я создал приложение с локальными уведомлениями, и в этом случае пользователь получал уведомления каждые 20/40/60 минут за заданный интервал времени (например, 8:00-20:00). Решение состояло в том, чтобы генерировать до 64 уведомлений в течение всего дня и устанавливать повторное значение UILocalNotification на NSCalendarUnitDay. Конечно, если вам нужно использовать более сложный шаблон уведомлений, это не тот путь.
Также стоит упомянуть, что с iOS7 мне пришлось, из-за требований клиента, реализовать перепланирование уведомлений в фоновом обновлении приложения.
Ответ №3:
Основным решением этой проблемы является использование repeatInterval для уведомлений, появляющихся через определенные промежутки времени. Это уменьшит количество избыточных уведомлений. Но все же, если число превышает 64, вы можете использовать одну стратегию для использования словаря userInfo и передать в нем время и сообщение следующего уведомления и запланировать его при - (void) application:(UIApplication *)application didReceiveLocalNotification: (UILocalNotification *)notification
вызове метода. Это может быть немного сложно, поэтому вы должны следить за тем, чтобы в словаре userInfo передавались правильные данные, а уведомления устанавливались точно. Надеюсь, это поможет.
Комментарии:
1. Это также создаст проблему, когда приложение находится в фоновом режиме или неактивно, и уведомление запускается, и пользователь нажимает кнопку «Отмена». в этом случае ваш
didReceiveLocalNotification
метод не будет вызван, поэтому в этом случае нам потребуется лучшая стратегия. Скажите мне, если вы найдете что-то лучше.
Ответ №4:
Я не знаю другого способа, кроме как сначала запланировать первые 64 уведомления, а затем при запуске, настройке и запуске уведомлений проверьте, не меньше ли количество уведомлений, чем 64, если затем перенести ваши уведомления.
Я не понимаю, почему реализация уведомлений Apple ооочень хромает. Если кто-нибудь может придумать лучший способ, дайте мне знать.
Ответ №5:
Я нашел эту библиотеку Swift, которая делает почти то же самое, что мы ищем. Я собираюсь попробовать это и подтвердить, как это работает:
Ответ №6:
В документе Apple говорится:
Приложение может иметь только ограниченное количество запланированных уведомлений; система сохраняет самые ранние — запускает 64 уведомления (с автоматически перенесенными уведомлениями, учитываемыми как одно уведомление) и отбрасывает остальные.