Тихое push-уведомление в iOS 7 не работает

87

В презентации 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"
       }
}

Кто-нибудь знает:

  1. Если это ошибка?
  2. И правильно ли предположить, что B или C обрабатываются как удаленное уведомление (а не ошибка с Silent Push, где вам нужен атрибут звука)? Если это так, это означает, что он не ограничен по скорости, как Silent Push ... что Apple, вероятно, исправит. Так что полагаться на это, наверное, не стоит.
  3. Каков предел скорости (N нажатий каждые X секунд и т. Д.)?

Заранее спасибо.

Редактировать с дополнительной информацией

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

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

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

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

mkwon
источник
Это не работает ни в одном состоянии приложения? Для меня « А » работает, пока приложение работает на переднем плане (вызывается didReceiveRemoteNotification). Но когда приложение не запущено, оно не получает уведомления (я просто слышу звук, когда пытаюсь " B "). Ваше приложение просыпается (didReceiveRemoteNotification) в фоновом режиме, когда вы используете « B » или « C »?
DerBernie 08
Я наблюдаю подобное поведение, я думаю, это может быть потому, что я пробовал это некоторое время, и у меня сначала не было правильно настроено приложение, поэтому Apple, возможно, задушила меня, прежде чем я правильно настроил.
nickthedude
4
Чувак ... Хотел бы я дать тебе 10 голосов
Майкл Уайлс
Посмотрите, если вы установите Background fetchфлажок в Project Capabilities>, Background Modesпотому что первый вариант должен работать. Для тихого нажатия не требуется атрибут звука, и он всегда поступает, application:didReceiveRemoteNotification:fetchCompletionHandler:даже если приложение работает в фоновом / переднем плане или не работает.
IgniteCoders 03

Ответы:

73

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

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

РЕДАКТИРОВАТЬ

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

CMVR
источник
Спасибо за ссылку. На форумах ADC есть несколько тем, обсуждающих это. Итог: после перезапуска устройства есть ошибка, которую, как признал представитель Apple, следует исправить в обновлении (в конечном итоге).
SG1
3
В iOS7 он отлично работает даже без клавиш звука / оповещения. Content-avalable - достаточный ключ! Но в iOS8 у нас действительно странное поведение, когда даже мы устанавливаем ключ предупреждения с непустой строкой в ​​дополнение к «доступный контент»: 1 мы получаем только баннер со строкой «предупреждение», а «доступный контент» по некоторым причинам игнорируется
malex
Мне удалось запустить приложение из уведомления с добавленным звуком или без него. Возможно, установка звука, предупреждения или значка (пустого или нет) повысит приоритет уведомления по умолчанию до 10, что повысит его надежность. Посмотрите, что Apple говорит о pans-priority: developer.apple.com/library/ios/documentation/ ... По умолчанию приоритет 10 (высокий), но использовать его для push-уведомлений только с ключом, доступным для содержимого, является ошибкой. Так что, возможно, по умолчанию установлено значение 5, если установлен только ключ доступного содержимого.
emem 08
1
не работает на iOS10. Я должен что-то подтолкнуть, чтобы "звучало"
Stony
У меня работал на iOS10. Но сейчас не работает на iOS11
Slav
30

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

{ priority: 5 }

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

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

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

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

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

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

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

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

    aps =     {
        badge = 7;
        "content-available" = 1;
        priority = 5;
    };
Дэйв Лайон
источник
Отличный ответ, Дэйв! Разрешен приоритет 5, в то время как «использование этого приоритета [10] для push, содержащего только ключ доступного содержимого, является ошибкой». developer.apple.com/library/ios/documentation/…
rjobidon
4
Следует ли включать приоритет в полезную нагрузку? IMO это отдельный байт в push, который вы отправляете.
Foriger
6
Приоритет не устанавливается в полезной нагрузке. Это устанавливается в двоичном уведомлении.
Сэнди Д.
10

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

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

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

JaimeFBC
источник
Это решение с alert=""полезной нагрузкой сработало и у меня iOS 9.0. sound=""Не работать вместо этого.
loretoparisi
5

Я использую инструмент - Knuff отправляет мое push-уведомление на мое устройство.

Это выглядит как: введите описание изображения здесь

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

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

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


Примеры:

  • без предупреждения, без звука

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

  • только предупреждение

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

  • только звук

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

Wenghengcong
источник
4

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

{ 
  aps: { 
          content-available: 1 
       }
}

Посмотрите, поставите ли вы галочку Background fetchв Project Capabilities>Background Modes

IgniteCoders
источник
2

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

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

Дайте мне знать, если вы нашли лучшее решение.

Джон С
источник
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 - последний с большим количеством параметров (новый)

dev03
источник
0

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

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

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

программное обеспечение развивалось
источник
2
Если приложение работает в фоновом режиме и если вы удалите атрибут «предупреждение», вы должны получить обратный вызов в приложении: didReceiveRemoteNotification: fetchCompletionHandler:
mkwon
@mkwon, и если я хочу увидеть предупреждение (обычное нажатие) в BG +, вызовите приложение: didReceiveRemoteNotification: fetchCompletionHand‌ ler:? Tnx
DaNLtR
0

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

Алекс Зак
источник
0

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

Радим
источник
0

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

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}
Даруй удачу
источник