Безшумне push-повідомлення в iOS 7 не працює


87

У презентації WWDC 2013 «Що нового в багатозадачності» є розділ про безшумні push-сповіщення. Здається, прямо вперед. Відповідно до презентації, якщо ви надішлете корисне навантаження APS із встановленим лише вмістом, встановленим на 1, користувачі не отримають повідомлення про сповіщення.

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

Моє тестування показує, що це не працює, оскільки жодного натискання не надходить. Але якщо я включаю атрибут звуку, але виключаю атрибут сповіщення, він працює (хоча більше не мовчить).

// 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, де вам потрібен атрибут звуку)? Якщо так, це означає, що ставка не обмежена, як це Тихі натискання ... що Apple, швидше за все, виправить. Тож я, мабуть, не повинен на це покладатися.
  3. Яким є обмеження швидкості (N штовхає кожні X секунди тощо)?

Заздалегідь спасибі.

Редагуйте з додатковою інформацією

Для А стан заявки не має значення. Повідомлення ніколи не отримується.

Здається, B і C працюють лише в тому випадку, якщо ви додаєте атрибути та значення в лапки, як показано нижче.

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

І сповіщення надходить у програмі: didReceiveRemoteNotification: fetchCompletionHandler: незалежно від стану.


Це не працює в будь-якому стані програми? Для мене " А " працює до тих пір, поки додаток працює на передньому плані (викликається didReceiveRemoteNotification). Але коли додаток не запущений, додаток не отримує сповіщення (я просто чую звук, коли намагаюся " В "). Ваш додаток прокидається у фоновому режимі (didReceiveRemoteNotification) у фоновому режимі, коли ви використовуєте " B " або " C "?
DerBernie

Я бачу подібну поведінку, я думаю, що це могло бути тому, що я намагався це деякий час, і спочатку у мене не було правильно налаштовано програму, тому Apple, можливо, задушила мене, перш ніж я правильно налаштував.
nickthedude

4
Чувак ... Я хотів би дати вам 10 голосів
Michael Wiles

Перевірте, чи встановите Background fetchпрапорець Project Capabilities>, Background Modesоскільки перший варіант повинен працювати. Безшумне натискання не потребує атрибута звуку і завжди надходить, application:didReceiveRemoteNotification:fetchCompletionHandler:навіть якщо програма працює у фоновому режимі / передньому плані або не працює.
IgniteCoders

Відповіді:


73

Це також працює і не відтворює звук, коли надходить:

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

РЕДАГУВАТИ

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


Дякую за посилання. Існує кілька тем, які обговорюють це на форумах ADC. Підсумок: є помилка - після перезапуску пристрою - яку представник Apple визнав, що її слід виправити в оновленні (з часом).
SG1,

3
У iOS7 він чудово працює навіть без клавіш звуку / попередження. Доступний вміст - це достатній ключ! Але в iOS8 ми маємо справді дивну поведінку, коли навіть ми встановлюємо клавішу попередження з непорожнім рядком на додаток до "content-available": 1 ми отримуємо лише банер з "alert" рядком, але "content-available" ігнорується з деяких причин
malex

Я мав успіх із запуском програми із сповіщення з доданим звуком або без нього. Можливо, встановлення звуку, попередження чи значка (порожнього чи ні) підвищує пріоритет сповіщення за замовчуванням до 10, тим самим підвищуючи його надійність. Подивіться, що Apple говорить про пріоритет pans: developer.apple.com/library/ios/documentation/ ... Пріоритет за замовчуванням - 10 (високий), але помилково використовувати це для push-сповіщення лише з ключем, доступним для вмісту. Тож, можливо, за замовчуванням встановлено значення 5, якщо встановлено лише доступний вміст ключ.
emem

1
не працює на iOS10. Я повинен щось штовхнути, щоб "прозвучало".
Stony

Працював на iOS10 для мене. Але зараз це не працює на iOS11
Слав

30

Тож я щойно зіткнувся з цією проблемою вчора, і після спроби надіслати корисне навантаження зі звуком, встановленим на порожній рядок, воно все ще спричиняло вібрацію / звук на пристрої. Врешті-решт, я натрапив на допис у блозі від 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;
    };

Чудова відповідь Дейв! Допускається пріоритет 5, тоді як "помилка використовувати цей пріоритет [10] для натискання, яке містить лише доступний вміст ключ". developer.apple.com/library/ios/documentation/…
rjobidon

4
Чи має пріоритет бути включеним у корисне навантаження? ІМО - це один байт при натисканні, яке ви відправляєте.
Форігер

6
Пріоритет не встановлюється в корисному навантаженні. Це встановлюється у двійковому повідомленні.
Сенді Д.

10

Я спробував встановити порожній рядок як атрибут alert, і він також працював:

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

Здається, APNS перевіряє наявність цих атрибутів з метою перевірки корисного навантаження. Цікаво, що вони не перевіряють фактичний вміст. Здається, це трохи хакерсько ...


Це рішення з alert=""корисним навантаженням працювало і на мене iOS 9.0. Натомість sound=""це не спрацювало.
loretoparisi

5

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

Це виглядає як: введіть тут опис зображення

Потім я спробував цей приклад.

Вони всі працюють! Але ви повинні встановити пріоритет 10!

Отже, якщо ви не використовуєте інструмент, ви це також зазначаєте.


приклади:

  • ні оповіщення, ні звуку

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

  • лише попередження

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

  • лише звук

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


4

Це працює для мене:

{ 
  aps: { 
          content-available: 1 
       }
}

Перевірте, чи встановлено Background fetchпрапорець у Project Capabilities>Background Modes


2

Я бачу ту саму проблему. Якщо я надсилаю push із "доступним вмістом": 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 - останній з більшою кількістю параметрів (новий)


0

Ага! Також висмикування волосся - це не стільки відповідь, скільки черговий приклад корисного навантаження, яке НЕ працює. Метод didReceiveRemoteNotification ніколи не викликається, хоча, якщо пристрій перебуває в режимі сну, відображається текст попередження.

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

"apt" - це спеціальне поле, яке ми використовуємо для позначення типу сповіщення.


2
Якщо програма знаходиться у фоновому режимі, і якщо ви видалите атрибут 'alert', ви повинні отримати зворотний виклик у додатку: didReceiveRemoteNotification: fetchCompletionHandler:
mkwon

@mkwon і якщо я хочу бачити попередження (регулярне натискання), перебуваючи в BG +, викликати додаток: didReceiveRemoteNotification: fetchCompletionHand‌ ler:? Tnx
DaNLtR


0

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


0

У нас була та сама проблема, оскільки повідомлення не надходило. У нашому випадку ми використовували безшумне натискання для оновлення номера значка. Коли ми встановлюємо порожні рядки для попередження (вміст та заголовок) та звучання, це спрацьовуватиме, але якщо жодної клавіші немає, це не вдається. Ось що спрацювало, оновлення значка без звуку чи попередження (журнал отриманого словника userInfo у didReceiveRemoteNotification)

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.