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

В чем разница между удаленным уведомлением и тихим уведомлением в iOS?

Когда я читаю Apple Docs, они упоминают 3 типа уведомлений: локальное, удаленное и беззвучное.

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

Однако в чем отличие двух других типов?

4b9b3361

Ответ 1

ОБНОВЛЕНИЕ: Хотя этот ответ полностью применим, в iOS 12 есть некоторые дополнения (не изменения) к уведомлениям. Я настоятельно рекомендую посмотреть WWDC 2018: что нового в уведомлениях пользователей и посмотреть здесь.

Основные изменения:

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

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

В целом, несколько вещей важны.

  • общая разница между тихим и пользовательским уведомлением
  • различные типы пользовательских уведомлений
  • как удаленное уведомление, то есть полезная нагрузка, настраивается с вашего сервера
  • как включить push-уведомления и удаленные уведомления из фоновых режимов в вашем проекте
  • как зарегистрировать свой токен для удаленных и тихих уведомлений
  • как запросить разрешение на уведомления пользователя
  • включение "фонового обновления приложения" и "уведомлений" с устройства
  • что такое content-available
  • понимание того, что iOS является восходящим потоком для вашего приложения, когда дело доходит до получения удаленного уведомления
  • что происходит, когда ОС получает уведомления, когда приложение было закрыто пользователем
  • Замечание о надежности и архитектуре APNs

Я настоятельно рекомендую всем посмотреть первые 7 минут: WWDC 2015: что нового в уведомлениях. Оттуда ведущий упоминает, что существует 2 основных типа уведомлений:

Тихие уведомления

Они происходят на заднем плане, поэтому вы никогда не увидите никаких предупреждений/значков/звуков. Вещи загружаются без вашего ведома.

iOS 11 bug

Смотрите здесь. Первоначальные выпуски iOS 11 содержали ошибки для тихих уведомлений. Убедись у вас есть последняя версия для тестирования, в противном случае она может не работать


Уведомления пользователей

Как следует из названия, это как-то связано с пользователем. То есть пользователь увидит предупреждение/значок или услышит звук. Имеет 2 типа.

Локальные уведомления

Локальное уведомление может быть запущено тремя различными способами:

  • UNLocationNotificationTrigger: Вы видите предупреждение, когда находитесь рядом с магазином Walmart.

  • UNTimeIntervalNotificationTrigger: например, Вы видите предупреждение каждые 10 минут.

  • UNCalendarNotificationTrigger, как 1 декабря 13:00 2017 года.

Удаленные уведомления

Они похожи на локальные уведомления, но запускаются с сервера, например сообщение WhatsApp с полем От (Мама) и полем тела (я люблю тебя!).

Несколько случайных заметок:

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

application.registerForRemoteNotifications() 

👆 Регистрация НЕ требует разрешения пользователя. Это делает тихие уведомления, чтобы стать бесшовным. Смотрите этот момент на видео WWDC

Тихие уведомления включены по умолчанию. Пользователю не нужно одобрить ваше - не дает разрешение вашему приложению использовать их, и вы можете просто начать использовать их, не спрашивая пользователя разрешение.

From WWDC

Чтобы показывать значки/оповещения/звуки, необходимо запросить разрешение у пользователя:

UNUserNotificationCenter.current().requestAuthorization([.alert, .badge, .sound]) { (granted, error) in

    guard error == nil else {
        //Display Error.. Handle Error.. etc..
        return
    }

    if granted {
        //Do stuff here..

        //Register for RemoteNotifications. Your Remote Notifications can display alerts now :)
        application.registerForRemoteNotifications()
    }
    else {
        //Handle user denying permissions..
    }
}

Вопрос: Нужно ли запрашивать доступ один раз для локальных уведомлений и один раз для удаленных уведомлений?

Нет. Просто напишите фрагмент кода выше, и он запросит доступ как для удаленного, так и для локального.

Теперь давайте перейдем к хитрой части: D


Нужно ли включать что-то для получения тихих уведомлений?

  1. Вы должны включить Push-уведомления из своих возможностей XCode:

enter image description here

 Если вы не включите это, ваше приложение не получит токен. И без токена сервер не узнает вас.

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

Чтобы включить backgroundModes, вы можете сделать это, используя plist или возможности Xcode.

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

PLIST:

enter image description here

Элемент 0 - это просто индекс, а не ключ словаря (то, что вы обычно видите в plist), UIBackgroundModes - это array строк. Строки должны исходить только из принятого значения из массива UIBackgroundModes.

Возможности Xcode:

Проверьте Remote Notification в XCode в фоновых режимах, как показано ниже:

enter image description here

Если вы не выполните ничего из вышеперечисленного, отключите уведомления с помощью:

enter image description here

убьет пульт & Локальные уведомления


Однако, если вы включите включение фонового обновления приложения с помощью возможностей plist или Xcode, то даже при отключенных уведомлениях для приложения вы все равно будете получать уведомления без вывода сообщений!

Если пользователь хочет отключить уведомления без вывода сообщений, ему придется отключить оба уведомления и отключить "фоновое обновление приложения" для вашего приложения/во всей системе. Чтобы отключить "фоновое обновление приложения" в вашей системе, вы должны сделать это:

enter image description here

Почему я все это говорю? Чтобы объяснить вам, что настройки молчания и push-уведомлений различны для пользователя и ограничения для их отправки различны. Подробнее см. этот момент из видео WWDC. Смотрите здесь вместо (предыдущая ссылка была неактивной):

Тихие уведомления включены по умолчанию.

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

Но тихие уведомления являются механизмом фонового приложения. обновить.

В любой момент вы знаете, что пользователь может зайти в настройки и отключить им.

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

Вы не знаете, выключил ли пользователь их, и вы не получаете уведомление больше.

Это также означает, что тихие уведомления доставляются с лучшими усилия.

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

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

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

Также смотрите здесь.

CAVEAT: Даже если вы отключите фоновое обновление приложения и отключите разрешения на уведомления, вы все равно можете получать уведомления без вывода сообщений, если ваше приложение находится в FOREGROUND. Если ваше приложение работает в фоновом режиме, оно не будет доставлено.


Нужно ли что-то включать для получения удаленных уведомлений?

Вам просто нужно включить Push-уведомления из ваших возможностей XCode:

enter image description here

 Если вы не включите это, ваше приложение не получит токен. И без токена сервер не узнает вас.


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

Я настоятельно рекомендую вам ознакомиться с документацией Apple § documentation. Это очень ясно.

Спасибо, но не могли бы вы рассказать мне важные части?

хм... хорошо, но вы знаете, что это по ссылке, которую я только что сказал:

Для тихих уведомлений существует два критерия:

  • Словарь полезной нагрузки aps должен включать клавишу content-available со значением 1.
  • Словарь полезной нагрузки aps не должен содержать Клавиши alert, sound или badge.

Пример полезной нагрузки будет выглядеть следующим образом:

{
    "aps" : {
        "content-available" : 1
    },
    "acme1" : "bar",
    "acme2" : 42
}

acme1, acme2 или просто некоторые пользовательские данные! Но для клавиши aps вы ДОЛЖНЫ следовать структуре Apple, иначе она не будет правильно отображаться и вы не сможете правильно читать данные.

Для удаленных уведомлений:

Вам нужен ключ alert внутри вашего aps.

Как пример:

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9,
        "sound" : "bingbong.aiff"
    },
    "acme1" : "bar",
    "acme2" : 42
}

Существует также третий вариант, о котором я расскажу ниже.

Что касается фиксированных ключей словаря aps и alert, см. эти документы Apple.

Хорошо понял. Что такое content-available?

Очень простой. Это просто флаг, который говорит вашему приложению, что вам нужно проснуться и загрузить что-то, потому что у меня есть контент, доступный для загрузки! Для получения дополнительной информации см. этот точный момент.

По умолчанию флаг content-available не включен, то есть по умолчанию отправляемые вами уведомления не будут вызывать application(_:didReceiveRemoteNotification:fetchCompletionHandler:) или что-то делать в вашем приложении. Было бы просто показать уведомление. Если вы хотите разбудить приложение (сделать что-то в фоновом режиме), вам нужно включить content-available и установить для него 1.

§: Если вы используете Firebase, структура полезных данных и ключи могут немного отличаться. Например, ключ content-available заменяется на content_available. Дополнительную информацию смотрите в документации Firebase, а также здесь.


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

Да, но затем, аналогично уведомлению в режиме без вывода сообщений, вы также должны установить флаг content-available на 1, чтобы он мог проснуться и загрузить что-то. В противном случае он просто выскочит и выдаст предупреждение/значок/звук, но ничего не загрузит.

ВАЖНЫЕ ЗАМЕЧАНИЯ:

  • Если ваше приложение имеет только тихие уведомления, просто включите "push-уведомления" + "удаленные уведомления" из возможностей и установите для content-available значение 1 для каждой полезной нагрузки.
  • Если ваше приложение имеет только удаленные уведомления, просто включите "push-уведомления" из возможностей. Ничего не поделаешь для content-available.
  • Однако если вы хотите, чтобы ваши уведомления отображали предупреждение/значок/звук, а также загружали что-то в фоновом режиме, вы должны включить и "удаленные уведомления", и "push-уведомления" + установите content-available на 1.

(ТРЕТИЙ ВАРИАНТ)

{
    "aps" : {
        "content-available" : 1 
        "alert" : "You got your emails.",
        "badge" : 9,
        "sound" : "bingbong.aiff"
    },
        "acme1" : "bar",
        "acme2" : 42
}

Вэтот момент из видео WWDC упоминается 👆


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

например в этот момент:

enter image description here

  • Ваш iPhone только что получил удаленное уведомление с телом "нет отправителя". Для этого WhatsApp не нужно запускать в фоновом режиме, т.е. вам не нужно включать "Удаленные уведомления" из BackgroundModes. Вы все равно получите уведомление, даже если ваше приложение было принудительно завершено или приостановлено, поскольку процесс управляется ОС, а не приложением WhatsApp. Однако, если вы хотите иметь возможность загружать реальное сообщение или его изображение/видео в WhatsApp (чтобы после того, как ваш пользователь откроет WhatsApp, видео будет сидеть там в ожидании пользователя), тогда ваше приложение должно стать активным., Для этого вам нужно content-available : 1 и внедрить application(_:didReceiveRemoteNotification:fetchCompletionHandler:) .

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

  • Или, что касается другого подобного сценария, если сервер/точка доступа, к которой вы подключены, имеет ограниченный доступ, скажем, для WhatsApp, он все равно позволит вам получать уведомления APN. Однако, нажав на это уведомление, пользователь не сможет отправлять сетевые запросы для этого приложения. Они смогут открыть только приложение.

CAVEAT: Если приложение было принудительно завершено пользователем, то, хотя вы и получаете уведомление по вышеупомянутым причинам, вы ничего не можете сделать, чтобы вывести приложение из завершенного состояния автоматически (даже если вы content-available был установлен в 1). Ни один из ваших методов делегата не будет сбит. Пользователь должен открыть приложение, и только после этого будут доступны ваши методы делегирования.


Замечание о надежности и архитектуре APN: Хотя уведомления интенсивно используются для доставки реального содержимого в приложение, они НЕ предназначены для доставки содержимого в приложение. Скорее, они предназначены для уведомления пользователя о том, что "эй, что-то новое появилось (сообщение 2b или маленькое изображение 50 КБ, или изображение 10 МБ или видео 2 ГБ). Откройте приложение, если хотите. Кстати, здесь маленький кусочек (собственно само сообщение , если оно может уместиться, заголовок изображения или миниатюра, показанная в уведомлении, заголовок видео или миниатюра, показанная в видео ". см. iOS APNS "лучший из возможных" запасной вариант. Повторюсь, вы никогда не скачиваете вложение размером 40 МБ, отправленное в электронном письме. Вы просто получаете уведомление о его существовании. Вы отправляете достаточно (просмотр миниатюр вложения).), чтобы пользователь был проинформирован о том, что нового, и может решить, нужно ли ему открывать приложение для большего. Когда я был новичком в iOS, я думал, что вы на самом деле отправляете изображение/видео через push-уведомление. !

Ответ 2

Push-уведомление позволит пользователю узнать, что они получают уведомление (например, всплывающее окно уведомления). Молчаливое уведомление будет обновляться, но пользователь не получит уведомление об этом. В любом случае вы можете выполнять действия при уведомлении с помощью молчания, как если бы это было push-уведомление. Единственное различие заключается в том, что пользователь не получит уведомление со всплывающим уведомлением.

С push-уведомлением: введите описание изображения здесь

С молчаливым уведомлением: enter image description here

Разница заключается в полезной нагрузке:

Нажмите уведомление:

     aps {
       content-available: 1
       alert: {...}
     }

Беззвучное уведомление:

    aps {
      content-available: 0
      alert: {...}
    }

И вы должны установить в Возможности выбранный вами режим фона.

Ответ 3

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

Метод удаленного push-уведомления вызывается только тогда, когда ваше приложение запущено. Если приложение приостановлено или не запущено, система просыпается или запускает ваше приложение и помещает его в фоновое рабочее состояние перед вызовом метода. Этот метод предназначен для отображения обновленного контента для пользователя. Когда этот метод вызывается, ваше приложение имеет до 30 секунд времени настенных часов для выполнения операции загрузки и вызова указанного блока обработчика завершения. Если обработчик не вызван вовремя, ваше приложение будет приостановлено.

Более подробную информацию вы можете найти по ссылкам:

Уведомления Apple

Тихие уведомления