Silent Push Notification w iOS 7 nie działa

87

W prezentacji „Co nowego w wielozadaniowości” WWDC 2013 znajduje się sekcja dotycząca cichych powiadomień push. Wydaje się proste. Zgodnie z prezentacją, jeśli wyślesz ładunek APS tylko z dostępną zawartością ustawioną na 1, użytkownicy nie zostaną powiadomieni o powiadomieniu.

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

Moje testy pokazują, że to nie działa, ponieważ nie jest odbierany żaden push. Ale jeśli dołączę atrybut dźwięku, ale wykluczę atrybut alertu, działa (choć już nie jest cichy).

// B. This works
{ 
  aps: {
          content-available: 1,
          sound: "default"
       }
}

Jeśli jednak zmienię atrybut dźwięku, aby odtwarzać cichy dźwięk, mogę naśladować ciche pchnięcie.

// C. This works too.
{ 
  aps: {
          content-available: 1,
          sound: "silence.wav"
       }
}

Czy ktoś wie:

  1. Jeśli to błąd?
  2. A czy słuszne jest założenie, że B lub C jest traktowane jako zdalne powiadomienie (a nie błąd w Silent Push, gdzie potrzebujesz atrybutu dźwięku)? Jeśli tak, oznacza to, że nie ma ograniczenia szybkości, tak jak Silent Push ... które Apple prawdopodobnie naprawi. Więc prawdopodobnie nie powinienem na tym polegać.
  3. Jaki jest limit szybkości (N przesuwa co X sekund itp.)?

Z góry dziękuję.

Edytuj, podając więcej informacji

W przypadku A stan aplikacji nie ma znaczenia. Powiadomienie nigdy nie zostało odebrane.

Wygląda na to, że B i C działają tylko wtedy, gdy umieścisz atrybuty i wartości w cudzysłowach, jak poniżej.

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

Powiadomienie dociera do aplikacji: didReceiveRemoteNotification: fetchCompletionHandler: niezależnie od stanu.

mkwon
źródło
Czy to nie działa w żadnym stanie aplikacji? Dla mnie „ A ” działa tak długo, jak długo aplikacja działa na pierwszym planie (wywoływana jest funkcja didReceiveRemoteNotification). Ale kiedy aplikacja nie jest uruchomiona, aplikacja nie otrzymuje powiadomienia (po prostu słyszę dźwięk, gdy próbuję „ B ”). Czy Twoja aplikacja jest wybudzana (didReceiveRemoteNotification) w tle, gdy używasz „ B ” lub „ C ”?
DerBernie
Widzę podobne zachowanie, myślę, że może to być spowodowane tym, że próbowałem tego od jakiegoś czasu i na początku nie miałem poprawnie skonfigurowanej aplikacji, więc Apple mógł mnie dławić, zanim poprawiłem konfigurację.
nickthedude
4
Stary ... Chciałabym dać ci 10 głosów
Michael Wiles,
Spójrz, jeśli zaznaczysz Background fetchpole wyboru w Project Capabilities>, Background Modesponieważ pierwsza opcja powinna działać. Ciche wypychanie nie wymaga atrybutu dźwięku i zawsze pojawia się, application:didReceiveRemoteNotification:fetchCompletionHandler:nawet jeśli aplikacja działa w tle / na pierwszym planie lub nie jest uruchomiona.
IgniteCoders

Odpowiedzi:

73

Działa to również i nie odtwarza dźwięku, gdy nadejdzie:

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

EDYTOWAĆ

Osoby mające ten problem mogą chcieć sprawdzić ten link . Brałem udział w wątku na forum deweloperów Apple, który omawia wszystkie stany aplikacji i kiedy są odbierane i nie odbierane ciche naciśnięcia.

CMVR
źródło
Dzięki za link. Jest wiele wątków omawiających to na forach ADC. Podsumowując: jest błąd - po ponownym uruchomieniu urządzenia - który, zgodnie z potwierdzeniem przedstawiciela Apple, powinien zostać naprawiony w aktualizacji (ostatecznie).
SG1
3
W iOS7 działa świetnie nawet bez klawiszy dźwiękowych / alarmowych. Dostępna zawartość jest wystarczającym kluczem! Ale w iOS8 mamy naprawdę dziwne zachowanie, gdy nawet ustawiamy klucz alertu z niepustym ciągiem oprócz "content-available": 1 otrzymujemy tylko baner z ciągiem "alert", ale "content-available" ignoruje z pewnych powodów
malex
Udało mi się uruchomić aplikację z poziomu powiadomienia z lub bez dodatkowego dźwięku. Być może ustawienie dźwięku, alertu lub plakietki (pustej lub nie) podnosi domyślny priorytet powiadomienia do 10, zwiększając w ten sposób jego niezawodność. Zobacz, co Apple mówi o pans-priority: developer.apple.com/library/ios/documentation/… Domyślny priorytet to 10 (wysoki), ale błędem jest używanie tego do powiadomień push z kluczem dostępnym tylko w zawartości. Więc może domyślną wartością jest 5, jeśli ustawiony jest tylko klucz dostępności treści.
emem
1
nie działa na iOS10. Muszę coś naciskać, żeby „zabrzmiało”.
Stony
Pracował dla mnie na iOS10. Ale teraz nie działa na iOS11
Slav
30

Właśnie wczoraj natknąłem się na ten problem i po próbie wysłania ładunku z dźwiękiem ustawionym na pustą strunę nadal powodował wibracje / dźwięk w urządzeniu. W końcu natknąłem się na wpis na blogu Urban Airship, który sugerował, że muszę wysłać:

{ priority: 5 }

w powiadomieniu push, którego nigdy nie widziałem. Po przejrzeniu dokumentów Apple pod kątem powiadomień push natknąłem się na tę stronę:

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

Co wskazuje, że priorytet należy ustawić na „5” lub „10” i wyjaśnia:

Priorytet powiadomienia. Podaj jedną z następujących wartości:

10 Wiadomość push jest wysyłana natychmiast.

Powiadomienie push musi wyzwalać alert, dźwięk lub znaczek na urządzeniu. Użycie tego priorytetu w przypadku wypychania zawierającego tylko klucz dostępnej zawartości jest błędem.

5 Wiadomość push jest wysyłana w czasie, który oszczędza energię urządzenia, które ją odbiera.

Ostatecznie udało nam się uzyskać ciche powiadomienia push działające z liczbą odznak (i ​​podejrzewam, że można to zrobić nawet z alertem) w następującym formacie:

    aps =     {
        badge = 7;
        "content-available" = 1;
        priority = 5;
    };
Dave Lyon
źródło
Świetna odpowiedź Dave! Dozwolony jest priorytet 5, podczas gdy „błędem jest używanie tego priorytetu [10] dla wypychania, które zawiera tylko klucz dostępnej zawartości”. developer.apple.com/library/ios/documentation/…
rjobidon
4
Czy priorytet powinien być uwzględniony w ładunku? IMO to oddzielny bajt w wysyłaniu.
Foriger
6
Priorytet nie jest ustawiany w ładunku. Jest to ustawiane w powiadomieniu binarnym.
Sandy D.
10

Próbowałem ustawić pusty ciąg jako atrybut alertu i również zadziałało:

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

Wygląda na to, że APNS sprawdza istnienie tych atrybutów w celu sprawdzenia poprawności ładunku wypychanego. Co ciekawe, nie sprawdzają rzeczywistej treści. Wydaje się jednak trochę hakerskie ...

JaimeFBC
źródło
To rozwiązanie z alert=""ładunkiem zadziałało również dla mnie iOS 9.0. sound=""Nie działa zamiast.
loretoparisi
5

Używam narzędzia - Knuff wysyła moje powiadomienie push na moje urządzenie.

To wygląda jak: wprowadź opis obrazu tutaj

Następnie wypróbowałem ten przykład.

Wszystkie działają! Ale musisz ustawić priorytet 10!

Więc jeśli nie używasz tego narzędzia, również to zauważasz.


przykłady:

  • bez alarmu, bez dźwięku

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

  • tylko czujny

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

  • tylko dźwięk

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

wenghengcong
źródło
4

To działa dla mnie:

{ 
  aps: { 
          content-available: 1 
       }
}

Spójrz, jeśli zaznaczysz Background fetchpole wyboru w Project Capabilities>Background Modes

IgniteCoders
źródło
2

Widzę ten sam problem. Jeśli wyślę push z „content-available”: 1 i bez ustawionych innych atrybutów, powiadomienie nigdy nie zostanie odebrane. Kiedy dodam inne atrybuty, działa idealnie.

W ramach tymczasowego rozwiązania dodaję atrybut odznaki, ponieważ nie ostrzega to użytkownika w żaden sposób poza dodaniem odznaki do ikony.

Daj mi znać, jeśli znalazłeś lepsze rozwiązanie.

Jon C.
źródło
1

Priorytet powinien być ustawiony jako jeden element w strumieniu binarnym, ale nie w ciągu JSON ładunku. Najwyraźniej tylko najnowszy format typu 2 może być używany do ustawiania priorytetów w następujący sposób:

$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;

Typy formatów (pierwszy bajt) dla wiadomości binarnej powiadomienia zdalnego:

0 - proste (stare) 1 - rozszerzone (stare) 2 - najnowsze z większą liczbą parametrów (nowe)

dev03
źródło
0

Argh! Również wyrywanie włosów - to nie tyle odpowiedź, ile kolejny przykład ładunku, który NIE DZIAŁA. Metoda didReceiveRemoteNotification nigdy nie jest wywoływana, chociaż jeśli urządzenie śpi, wyświetlany jest tekst alertu.

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

„apt” to niestandardowe pole, którego używamy do wskazania typu powiadomienia.

oprogramowanie ewoluowało
źródło
2
Jeśli aplikacja działa w tle i usuniesz atrybut „alert”, powinieneś otrzymać oddzwonienie w aplikacji: didReceiveRemoteNotification: fetchCompletionHandler:
mkwon
@mkwon i jeśli chcę zobaczyć alert (zwykłe wypychanie) w BG + wywołać aplikację: didReceiveRemoteNotification: fetchCompletionHand‌ ler:? Tnx
DaNLtR
0

Ustawienie `` dźwięku '' na 0 zadziałało dla mnie ... :)

Alex Zak
źródło
0

ustawienie priorytetu na 5 nie działało u mnie, ale ustawienie dźwięku lub alertu na pusty ciąg sprawiło, że powiadomienie było traktowane jako powiadomienie o wysokim priorytecie

Radim
źródło
0

Mieliśmy ten sam problem bez dostarczenia powiadomienia. W naszym przypadku używaliśmy cichego naciśnięcia, aby zaktualizować numer odznaki. Kiedy ustawimy puste ciągi znaków alert (treść i tytuł) i dźwięk, to zadziała, ale jeśli któryś z kluczy nie będzie obecny, to nie zadziała. Oto, co zadziałało, aktualizacja plakietki bez dźwięku lub alertu (dziennik wynikowego słownika userInfo w didReceiveRemoteNotification)

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}
Przyznaj szczęście
źródło