it-swarm.com.ru

Silent Push Notification в iOS 7 не работает

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

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

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

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

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

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

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

85
mkwon

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

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

ПРАВКА

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

69
CMVR

Так что я только что столкнулся с этой проблемой вчера, и после попытки отправить полезную нагрузку со звуком, установленным на пустую строку, она все еще вызывала вибрацию/звук на устройстве. В конце концов, я наткнулся на сообщение в блоге от 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;
    };
29
Dave Lyon

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

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

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

10
JaimeFBC

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

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

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

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

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


примеры:

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

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

  • только оповещение

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

  • только звук

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

5
wenghengcong

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

{ 
  aps: { 
          content-available: 1 
       }
}

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

4
IgniteCoders

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

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

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

2
Jon C

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

1
dev03

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

0
Alex Zak

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

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

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

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

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

0
software evolved

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

0
Radim