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:
- Jeśli to błąd?
- 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ć.
- 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.
źródło
Background fetch
pole wyboru wProject Capabilities
>,Background Modes
ponieważ 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.Odpowiedzi:
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.
źródło
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:
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; };
źródło
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 ...
źródło
alert=""
ładunkiem zadziałało również dla mnieiOS 9.0
.sound=""
Nie działa zamiast.Używam narzędzia - Knuff wysyła moje powiadomienie push na moje urządzenie.
To wygląda jak:
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:
źródło
To działa dla mnie:
{ aps: { content-available: 1 } }
Spójrz, jeśli zaznaczysz
Background fetch
pole wyboru wProject Capabilities
>Background Modes
źródło
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.
źródło
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)
źródło
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.
źródło
Ustawienie `` dźwięku '' na 0 zadziałało dla mnie ... :)
źródło
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
źródło
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 = ""; }; }
źródło