La notifica push silenziosa in iOS 7 non funziona


87

Nella presentazione "Novità del multitasking" del WWDC 2013, c'è una sezione sulle notifiche push silenziose. Sembra semplice. Secondo la presentazione, se invii il payload APS con solo il contenuto disponibile impostato su 1, gli utenti non verranno avvisati della notifica.

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

I miei test mostrano che questo non funziona in quanto non viene ricevuto alcun push. Ma se includo l'attributo sound ma escludo l'attributo alert, funziona (sebbene non sia più silenzioso).

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

Tuttavia, se cambio l'attributo sound per riprodurre un audio silenzioso, posso imitare una spinta silenziosa.

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

Qualcuno sa:

  1. Se questo è un bug?
  2. E se è corretto presumere che B o C venga trattato come una notifica remota (e non un bug con Silent Push in cui è necessario un attributo audio)? Se è così, questo significa che non è limitato alla velocità come lo sono i Silent Pushes ... che Apple probabilmente risolverà. Quindi probabilmente non dovrei fare affidamento su di esso.
  3. Qual è il limite di velocità (N push ogni X secondi, ecc.)?

Grazie in anticipo.

Modifica con più informazioni

Per A, lo stato dell'applicazione non ha importanza. La notifica non viene mai ricevuta.

Sembra che B e C funzionino solo se racchiudi attributi e valori tra virgolette, come di seguito.

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

E la notifica arriva nell'applicazione: didReceiveRemoteNotification: fetchCompletionHandler: indipendentemente dallo stato.


Non funziona in nessuno stato dell'app? Per me, " A " funziona finché l'app è in esecuzione in primo piano (viene chiamato didReceiveRemoteNotification). Ma quando l'app non è in esecuzione, l'app non riceve la notifica (sento solo il suono, quando provo " B "). La tua app viene svegliata (didReceiveRemoteNotification) in background quando usi " B " o " C "?
DerBernie

Sto vedendo un comportamento simile, penso che potrebbe essere perché lo provo da un po 'e all'inizio non avevo l'app configurata correttamente, quindi Apple potrebbe avermi limitato prima che avessi la configurazione corretta.
nickthedude

4
Amico ... vorrei poterti dare 10 voti
Michael Wiles

Guarda se selezioni la Background fetchcasella di controllo Project Capabilities> Background Modesperché la prima opzione dovrebbe funzionare. Il push silenzioso non necessita di un attributo audio e arriva sempre application:didReceiveRemoteNotification:fetchCompletionHandler:anche se l'applicazione è in esecuzione in background / in primo piano o non è in esecuzione.
IgniteCoders

Risposte:


73

Funziona anche e non riproduce un suono quando arriva:

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

MODIFICARE

Le persone che hanno questo problema potrebbero voler controllare questo link . Ho partecipato a un thread sul forum degli sviluppatori di Apple che esamina tutti gli stati delle app e quando vengono ricevuti e non ricevuti push silenziosi.


Grazie per il collegamento. Ci sono più thread che discutono di questo nei forum di ADC. In conclusione: c'è un bug - dopo il riavvio del dispositivo - che un rappresentante Apple ha riconosciuto dovrebbe essere corretto in un aggiornamento (eventualmente).
SG1 del

3
In iOS7 funziona alla grande anche senza i tasti audio / di avviso. La disponibilità di contenuti è una chiave sufficiente! Ma in iOS8 abbiamo un comportamento davvero strano quando anche impostiamo la chiave di avviso con una stringa non vuota oltre a "contenuto disponibile": 1 otteniamo solo banner con stringa "avviso", ma "contenuto disponibile" ignora per alcuni motivi
Malex

Ho avuto successo con l'avvio dell'app dalla notifica con o senza l'audio aggiunto. Forse, impostando un suono, un avviso o un badge (vuoto o meno) aumenta la priorità di notifica predefinita a 10, aumentandone così l'affidabilità. Guarda cosa dice Apple sulla priorità pans: developer.apple.com/library/ios/documentation/… La priorità predefinita è 10 (alta), ma è un errore usarla per le notifiche push con solo la chiave disponibile per il contenuto. Quindi forse il valore predefinito è impostato su 5 se è impostata solo la chiave di contenuto disponibile.
emem

1
non funziona su iOS10. Devo spingere qualcosa per "suonare".
Stony

Ha funzionato su iOS10 per me. Ma ora non funziona su iOS11
Slav

30

Quindi mi sono imbattuto in questo problema ieri e dopo aver provato a inviare un payload con un suono impostato su una stringa vuota, stava ancora causando vibrazioni / suoni sul dispositivo. Alla fine, sono incappato in un post sul blog di Urban Airship che suggeriva di inviare:

{ priority: 5 }

nella notifica push, che non avevo mai visto. Dopo aver esaminato i documenti di Apple per le notifiche push, sono incappato in questa pagina:

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

Che indica che la priorità deve essere impostata su "5" o "10" e spiega:

La priorità della notifica. Fornisci uno dei seguenti valori:

10 Il messaggio push viene inviato immediatamente.

La notifica push deve attivare un avviso, un suono o un badge sul dispositivo. È un errore utilizzare questa priorità per un push che contiene solo la chiave di contenuto disponibile.

5 Il messaggio push viene inviato in un momento che conserva l'energia sul dispositivo che lo riceve.

Alla fine, siamo stati in grado di ricevere notifiche push silenziose che funzionano con un conteggio di badge (e sospetto che potresti anche fare lo stesso con un avviso) con il seguente formato:

    aps =     {
        badge = 7;
        "content-available" = 1;
        priority = 5;
    };

Ottima risposta Dave! È consentita una priorità di 5 mentre "è un errore utilizzare questa priorità [10] per un push che contiene solo la chiave di contenuto disponibile". developer.apple.com/library/ios/documentation/…
rjobidon

4
La priorità dovrebbe essere inclusa nel carico utile? IMO è un byte separato in push che invii.
Foriger

6
La priorità non viene impostata nel payload. Questo viene impostato nella notifica binaria.
Sandy D.

10

Ho provato a impostare una stringa vuota come attributo di avviso e ha anche funzionato:

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

Sembra che APNS stia verificando l'esistenza di questi attributi allo scopo di convalidare il payload push. È interessante notare che non stanno controllando il contenuto effettivo. Sembra un po 'hacky però ...


Questa soluzione con alert=""nel payload ha funzionato anche per me iOS 9.0. Il sound=""non ha funzionato, invece.
loretoparisi

5

Uso lo strumento: Knuff invia la mia notifica push al mio dispositivo.

Sembra: inserisci qui la descrizione dell'immagine

Quindi, ho provato questi esempi.

Sono tutti lavoro! Ma devi impostare la priorità 10!

Quindi, se non utilizzi lo strumento, lo noti anche.


esempi:

  • nessun avviso, nessun suono

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

  • solo allerta

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

  • solo suono

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


4

Questo funziona per me:

{ 
  aps: { 
          content-available: 1 
       }
}

Guarda se selezioni la Background fetchcasella di controllo in Project Capabilities>Background Modes


2

Sto riscontrando lo stesso problema. Se invio un push con "contenuto disponibile": 1 e nessun altro attributo impostato, la notifica non viene mai ricevuta. Quando aggiungo altri attributi funziona perfettamente.

Come soluzione temporanea, sto aggiungendo l'attributo badge in quanto ciò non avvisa l'utente in alcun modo a parte l'aggiunta del badge all'icona.

Fammi sapere se hai trovato una soluzione migliore.


1

La priorità deve essere impostata come un elemento nel flusso binario ma non nella stringa json del payload. Apparentemente solo l'ultimo formato di tipo 2 può essere utilizzato per impostare la priorità come segue:

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

Tipi di formato (primo byte) per messaggio binario di notifica remota:

0 - semplice (vecchio) 1 - migliorato (vecchio) 2 - più recente con più parametri (nuovo)


0

Argh! Anche strapparmi i capelli - questa non è tanto una risposta quanto un altro esempio di carico utile che NON funziona. Il metodo didReceiveRemoteNotification non viene mai chiamato, sebbene se il dispositivo è in sospensione, viene visualizzato il testo dell'avviso.

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

"apt" è un campo personalizzato che utilizziamo per indicare il tipo di notifica.


2
Se l'app è in background e se rimuovi l'attributo "alert", dovresti ricevere la richiamata nell'applicazione: didReceiveRemoteNotification: fetchCompletionHandler:
mkwon

@mkwon e se voglio vedere l'avviso (push regolare) mentre in BG + richiamo l'applicazione: didReceiveRemoteNotification: fetchCompletionHand‌ ler:? TNX
DaNLtR

0

L'impostazione del "suono" su 0 ha funzionato per me ... :)


0

l'impostazione della priorità su 5 non ha funzionato per me, ma l'impostazione del suono o dell'avviso su una stringa vuota ha causato la gestione della notifica come una priorità alta


0

Abbiamo avuto lo stesso problema senza che venisse recapitata alcuna notifica. Nel nostro caso abbiamo utilizzato una pressione silenziosa per aggiornare il numero del badge. Quando impostiamo stringhe vuote per avviso (corpo e titolo) e suono funzionerebbe, ma se una qualsiasi delle chiavi non fosse presente fallì. Ecco cosa ha funzionato, aggiornando il badge senza suono o avviso (registro del dizionario userInfo risultante in didReceiveRemoteNotification)

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.