Уведомление о бесшумном нажатии в iOS 7 не работает

В презентации WWDC 2013 "Что нового в многозадачности" есть раздел "Оповещения без звука". Это кажется прямым. Согласно презентации, если вы отправляете полезную нагрузку APS с доступным только для контента значением 1, пользователи не будут уведомлены об этом уведомлении.

// A. This doesn't work
{ 
  aps: { 
          content-available: 1 
       }
}

Мое тестирование показывает, что это не работает, так как никакого нажатия не получено. Но если я включаю звуковой атрибут, но исключаю атрибут alert, он работает (хотя и не молчит).

// 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 Pushes..., которое Apple, скорее всего, исправит. Поэтому я, вероятно, не должен полагаться на это.
  • Каков предел скорости (N нажимает каждые X секунд и т.д.)?

Спасибо заранее.

Изменить с дополнительной информацией

Для A состояние приложения не имеет значения. Уведомление никогда не принимается.

Кажется, что B и C работают только в том случае, если вы включаете атрибуты и значения в кавычки, как показано ниже.

{"aps":{"content-available": 1, "sound":"silent.wav"}}

И уведомление приходит в приложении: didReceiveRemoteNotification: fetchCompletionHandler:, независимо от состояния.

Ответ 1

Это также работает и не воспроизводит звук, когда он приходит:

{
    aps = {
        "content-available" : 1,
        sound : ""
    };
}

ИЗМЕНИТЬ

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

Ответ 2

Итак, я только что наткнулся на этот вопрос вчера, и после попытки отправки полезной нагрузки с звуком, установленным в пустую строку, он все еще вызывал вибрацию/звук на устройстве. В конце концов, я наткнулся на сообщение в блоге с Urban Airship, в котором предлагалось отправить:

{ priority: 5 }

в push-уведомлении, которого я никогда не видел. После просмотра документов Apple для push-уведомлений я наткнулся на эту страницу:

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html

Указывает, что приоритет должен быть установлен как "5" или "10", и объясняет:

Приоритет уведомлений. Укажите одно из следующих значений:

10 Точное сообщение отправляется немедленно.

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

5 Push-сообщение отправляется в то время, которое сохраняет питание устройства, принимающего его.

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

    aps =     {
        badge = 7;
        "content-available" = 1;
        priority = 5;
    };

Ответ 3

Я попытался установить пустую строку в качестве атрибута предупреждения, и он также работал:

{
    aps =     {
        "content-available" = 1;
        "alert" = "";
    };
}

Кажется, что APNS проверяет наличие этих атрибутов с целью проверки полезной нагрузки push. Интересно, что они не проверяют фактический контент. Кажется немного взломанным, хотя...

Ответ 4

Я использую tool- Knuff, чтобы отправить мое push-уведомление на мое устройство.

Это выглядит так: enter image description here

Затем я попробовал этот пример.

Они все работают! Но вы должны установить приоритет 10!

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


Примеры:

  • нет тревоги, нет звука

{
    "aps":{
        "content-available":1,
    }
}

Ответ 5

Это работает для меня:

{ 
  aps: { 
          content-available: 1 
       }
}

Посмотрите, установите флажок Background fetch в Project Capabilities > Background Modes

Ответ 6

Я вижу ту же проблему. Если я отправлю push с "content-available": 1 и никакие другие атрибуты не будут установлены, уведомление никогда не будет получено. Когда я добавляю какие-либо другие атрибуты, он отлично работает.

Как временная работа, я добавляю атрибут badge, так как это не предупреждает пользователя ничем, кроме добавления значка к значку.

Сообщите мне, если вы нашли лучшее решение.

Ответ 7

Приоритет должен быть установлен как один элемент в двоичном потоке, но не в строке jload полезной нагрузки. По-видимому, только самый последний тип 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 - последний с большим количеством параметров (новый)

Ответ 8

Argh! Также вытягивая мои волосы - это не столько ответ, сколько другой пример полезной нагрузки, которая НЕ работает. Метод didReceiveRemoteNotification никогда не вызывается, хотя, если устройство спало, отображается текст предупреждения.

 {"aps":
    {  "alert":"alert!",
       "sound":"default",
       "content-available" : 1},
    "content-id":21482,
    "apt":"1"
}

"apt" - это настраиваемое поле, которое мы используем для указания типа уведомления.

Ответ 9

Настройка "звук" на 0 сработала для меня...:)

Ответ 10

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

Ответ 11

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

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}

Ответ 12

Это 2019 год, и эта проблема все еще существует. Я также могу заставить работать тихие уведомления только тогда, когда добавляю пустой звук или значок в полезную нагрузку. Кажется, мы все упускаем что-то важное...