Push-сервисы iOS: возможно ли невидимое push-уведомление? - PullRequest
19 голосов
/ 03 января 2012

Я создаю приложение для iPhone, которое зависит от данных из онлайн-базы данных.

Чтобы обновить данные в приложении, я мог бы через определенный промежуток времени проверить, нужно ли обновление, но было бы гораздо круче, если бы я мог использовать push-сервисы, которые отправляют в приложение уведомление, уведомляющее его о том, что пришло время Обновить.

Я не говорю о видимых push-уведомлениях, просто невидимое push-уведомление, чтобы запустить метод обновления в моем приложении.

Существует ли стандартный способ сделать это или я могу использовать для этого сервисы push-уведомлений Apple?

Другими словами: сейчас я использую pull для получения обновлений, есть ли способ, позволяющий бэкэнду моего приложения узнать, что пришло время для обновления?

Редактировать: И если это невозможно, какой будет хороший интервал времени для обновления (0,03 кб, если обновлений нет). Много ли проверять каждые 30 секунд?

Ответы [ 7 ]

29 голосов
/ 21 января 2012

В онлайн-библиотеке Apple имеется подробное описание .

. С помощью службы push-уведомлений Apple (APNS) вы можете получить ЛЮБУЮ комбинацию из:

  • Предупреждающее сообщение для пользователя
  • Число, обозначающее значок приложения значком
  • Звук для воспроизведения

Когда я говорю что-либо, я имею в виду, что нетоповещение, без значка и без звука также возможно.Удаленные уведомления доступны даже в том случае, если приложение закрыто (но хотя бы один раз выполнено, для регистрации в службе уведомлений), iOS обязана управлять отправкой и активацией приложения.

Если вы хотите использоватьAPNS вам нужен

  • веб-сервер (сгенерирует push)
  • CSR от веб-сервера
  • сертификат Apple, доверяющий вашему серверу (это причинаCSR)
  • приложение для iOS с идентификатором приложения, настроенным для уведомлений

Все, что связано с CSR и доверием к вашему серверу, подробно описано на портале обеспечения iOS, раздел «Идентификатор приложения»,Вкладка «Как».Попробуйте эту ссылку .

На вашем веб-сервере должен быть размещен провайдер APNS, который выполнит следующие два действия:

  • Зарегистрируйте токен, идентифицирующийбетонная установка на конкретном устройстве iOS.Этот токен создан для Apple APNS и будет отправлен поставщику вашим приложением.enter image description here

  • Создание push-уведомлений: будет отправлено вашим провайдером в Apple APNS, Apple APNS доставит ваше приложение (с предупреждением и / или значком и / или звуком и/ или режим молчания) enter image description here

Уведомление APNS будет доставлено в ваше приложение с помощью системы удаленных уведомлений.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

Вы можете посмотреть в Easy APNS App Delegate

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

Итак, ответ ДА,это возможно.Используя Easy APNS esamples , генерация push должна выглядеть следующим образом:

$apns->newMessage(1);
$apns->addMessageCustom('acme2', array('bang', 'whiz'));
$apns->queueMessage();
5 голосов
/ 27 апреля 2016

Да, это возможно с iOS 7 +

Вы можете получать «фоновые» push-уведомления, если переопределите этот метод UIApplicationDelegate: приложение (_: didReceiveRemoteNotification: fetchCompletionHandler:)

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)
{
    // do what you need i.e. download fresh content (max. 30 seconds)

    completionHandler(UIBackgroundFetchResult.NoData)
}

В документации этого метода говорится:

Используйте этот метод для обработки входящих удаленных уведомлений для вашего приложения. В отличие от приложения: didReceiveRemoteNotification: метод, который является вызывается только когда ваше приложение работает на переднем плане, система вызывает этот метод, когда ваше приложение работает на переднем плане или фон. Кроме того, если вы включили удаленные уведомления В фоновом режиме система запускает ваше приложение (или выводит его из приостановлено) и переводит его в фоновое состояние при удаленном уведомление приходит.

Не забудьте включить «Фоновая выборка» и «Удаленные уведомления» в фоновых режимах.

enter image description here

Подробнее о фоновом выполнении здесь.

3 голосов
/ 03 января 2012

Вы не можете отправить невидимое push-уведомление, пока приложение находится в фоновом режиме.Единственный способ - обновить данные, когда приложение выйдет на передний план.

Через определенный промежуток времени вы бы проверили, требуется ли обновление, или установите соединение с сервером по запросу.

1 голос
/ 17 января 2012

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

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

Другой вариант - отправитьвидимое уведомление, чтобы пользователь запустил приложение, а затем произойдет обновление (как описано в предыдущем абзаце)

0 голосов
/ 21 января 2012

Краткий ответ на ваш первый вопрос: Вам нужно опросить .

Почему: - Когда ваше приложение находится в фоновом режиме, оно не может знать о каких-либо push-уведомлениях, если нет предупреждения и пользователь нажимает View или Launch, что не гарантируется (и вы не предупреждение тоже).

Вы также можете отказаться от использования APNS (если это только для этой цели) из-за дополнительных затрат на настройку сервера с сертификатами Apple и всего этого джаза.

Чтобы ответить на второй вопрос: насколько часто вы хотите, чтобы ваши обновления действительно зависели от того, что делает ваше приложение. Например, если вы показываете значения «Stock», вы можете обновлять данные каждые несколько секунд. Для погоды это может быть несколько часов. Для других это могут быть дни или даже дольше. Зависит от того, насколько важны обновления для пользователя.

0 голосов
/ 21 января 2012

Я не думаю, что вы подходите правильно.Рассмотрим все вещи, которые вы создадите для простой задачи: 1) сервер для push-уведомлений 2) регистрация для уведомлений 3) переход в фоновый режим и возобновление работы (большим и сложным является сервер для push-уведомлений)

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

Таким образом, чистое решение может быть: 1) запросить сервер, используя обычный HTTP (используя асинхронный запрос NSURL ..), например: http: // ...... & lastupdate = '2012: 05: 01 18 00' перед последней датой обновления, которую мы успешно загрузили (Вы также можете использовать метку времени unicx ...)

2) сервер будет сравнивать эту дату с внутренней датой последнего обновления: если он имеет более новую дату, он ответит XML или plist (я предпочитаю plist ...)

3) приложение загружает новые данныеи обновляет дату / время.

4) если нет данных, ответом является просто пустая строка или, например, та же дата, которую мы отправили.

0 голосов
/ 18 января 2012

Используйте методы делегата applicationDidRecieveRemoteNotification, чтобы сообщить приложению о необходимости регистрации в службе обновлений. Или вы можете сделать так, чтобы приложение опрашивало службу обновлений, если вы не хотите устанавливать push-уведомления.

...