В презентации WWDC 2013 «Что нового в многозадачности» есть раздел о бесшумных push-уведомлениях. Кажется, прямолинейно. Согласно презентации, если вы отправляете полезную нагрузку APS только с доступным содержимым, установленным на 1, пользователи не будут уведомлены об уведомлении.
// A. This doesn't work
{
aps: {
content-available: 1
}
}
Мое тестирование показывает, что это не работает, так как push не поступает. Но если я включаю атрибут звука, но исключаю атрибут предупреждения, он работает (хотя больше не молчит).
// B. This works
{
aps: {
content-available: 1,
sound: "default"
}
}
Однако, если я изменю атрибут звука для воспроизведения беззвучного звука, я могу имитировать тихий толчок.
// C. This works too.
{
aps: {
content-available: 1,
sound: "silence.wav"
}
}
Кто-нибудь знает:
- Если это ошибка?
- И правильно ли предположить, что B или C обрабатываются как удаленное уведомление (а не ошибка с Silent Push, где вам нужен атрибут звука)? Если это так, это означает, что он не ограничен по скорости, как Silent Push ... что Apple, вероятно, исправит. Так что полагаться на это, наверное, не стоит.
- Каков предел скорости (N нажатий каждые X секунд и т. Д.)?
Заранее спасибо.
Редактировать с дополнительной информацией
Для A состояние приложения не имеет значения. Уведомление не получено.
Похоже, что B и C работают, только если вы заключите атрибуты и значения в кавычки, как показано ниже.
{"aps":{"content-available": 1, "sound":"silent.wav"}}
И уведомление приходит в приложение: didReceiveRemoteNotification: fetchCompletionHandler: независимо от состояния.
источник
Background fetch
флажок вProject Capabilities
>,Background Modes
потому что первый вариант должен работать. Для тихого нажатия не требуется атрибут звука, и он всегда поступает,application:didReceiveRemoteNotification:fetchCompletionHandler:
даже если приложение работает в фоновом / переднем плане или не работает.Ответы:
Это также работает и не воспроизводит звук при его поступлении:
{ aps = { "content-available" : 1, sound : "" }; }
РЕДАКТИРОВАТЬ
Люди, у которых возникла эта проблема, могут захотеть проверить эту ссылку . Я участвовал в теме на форуме разработчиков Apple, в которой рассказывается обо всех состояниях приложений и о том, когда тихие нажатия принимаются и не принимаются.
источник
Итак, я только вчера столкнулся с этой проблемой, и после попытки отправить полезную нагрузку со звуком, установленным на пустую строку, он все еще вызывал вибрацию / звук на устройстве. В конце концов, я наткнулся на сообщение в блоге Urban Airship, в котором предлагалось отправить:
{ priority: 5 }
в push-уведомлении, которого я никогда не видел. После просмотра документации Apple для push-уведомлений я наткнулся на эту страницу:
https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html
Это означает, что приоритет должен быть установлен на «5» или «10», и объясняет:
В конечном итоге мы смогли получать тихие push-уведомления, работающие с подсчетом значков (и я подозреваю, что вы могли бы сделать то же самое с предупреждением) в следующем формате:
aps = { badge = 7; "content-available" = 1; priority = 5; };
источник
Я попытался установить пустую строку в качестве атрибута предупреждения, и это также сработало:
{ aps = { "content-available" = 1; "alert" = ""; }; }
Похоже, что APNS проверяет наличие этих атрибутов с целью проверки полезной нагрузки push. Что интересно, они не проверяют фактическое содержание. Хотя это кажется немного взломанным ...
источник
alert=""
полезной нагрузкой сработало и у меняiOS 9.0
.sound=""
Не работать вместо этого.Я использую инструмент - Knuff отправляет мое push-уведомление на мое устройство.
Это выглядит как:
Затем я попробовал этот пример.
Они все работают! Но надо ставить приоритет 10!
Так что, если вы не используете инструмент, вы также заметите это.
Примеры:
источник
Это работает для меня:
{ aps: { content-available: 1 } }
Посмотрите, поставите ли вы галочку
Background fetch
вProject Capabilities
>Background Modes
источник
У меня такая же проблема. Если я отправляю push с «content-available»: 1 и без других установленных атрибутов, уведомление никогда не будет получено. Когда я добавляю какие-либо другие атрибуты, все работает отлично.
В качестве временной работы я добавляю атрибут значка, поскольку он никоим образом не предупреждает пользователя, кроме добавления значка к значку.
Дайте мне знать, если вы нашли лучшее решение.
источник
Приоритет должен быть установлен как один элемент в двоичном потоке, но не в строке json полезной нагрузки. Очевидно, только последний формат типа 2 может использоваться для установки приоритета следующим образом:
$token = chr(1) . pack('n', 32) . pack('H*', $deviceToken); $payload = chr(2) . pack('n', strlen($json)) . $json; $identifier = chr(3) . pack('n', 4) . pack('N', $notification); $expiration = chr(4) . pack('n', 4) . pack('N', time()+86400); $priority = chr(5) . pack('n', 1) . chr($priority); $frame_data = $token.$payload.$identifier.$expiration.$priority; $frame_length = strlen(bin2hex($frame_data))/2; $msg = chr(2) . pack('N', $frame_length) . $frame_data;
Типы формата (первый байт) для двоичного сообщения удаленного уведомления:
0 - простой (старый) 1 - расширенный (старый) 2 - последний с большим количеством параметров (новый)
источник
Ах! Также вытаскиваю волосы - это не столько ответ, сколько еще один пример полезной нагрузки, которая НЕ РАБОТАЕТ. Метод didReceiveRemoteNotification никогда не вызывается, хотя, если устройство находится в спящем режиме, отображается текст предупреждения.
{"aps": { "alert":"alert!", "sound":"default", "content-available" : 1}, "content-id":21482, "apt":"1" }
«apt» - это настраиваемое поле, которое мы используем для указания типа уведомления.
источник
Установка "звука" на 0 у меня сработала ... :)
источник
установка приоритета на 5 не сработала для меня, но установка звука или оповещения на пустую строку заставила уведомление обработать как высокоприоритетное
источник
У нас была такая же проблема, когда уведомление не доставлялось. В нашем случае мы использовали автоматическое нажатие для обновления номера значка. Когда мы устанавливаем пустые строки для предупреждения (тело и заголовок) и звук, он будет работать, но если какой-либо из ключей не присутствует, это не сработает. Вот что сработало: обновление значка без звука или предупреждения (журнал полученного словаря userInfo в didReceiveRemoteNotification)
{ aps = { alert = { body = ""; title = ""; }; badge = 103; "content-available" = 1; sound = ""; }; }
источник