Silent Push Notification in iOS 7 does not work
In the WWDC 2013's "What's New with Multitasking" presentation, there is a section about Silent Push Notifications. It seems straight forward. According to the presentation, if you send the APS payload with just the content-available set to 1, users will not be notified of the notification.
// A. This doesn't work
{
aps: {
content-available: 1
}
}
My testing shows that this does not work as no push is received. But if I include the sound attribute but exclude the alert attribute, it works (though not silent anymore).
// B. This works
{
aps: {
content-available: 1,
sound: "default"
}
}
However, if I change the sound attribute to play a silent audio, I can mimic a silent push.
// C. This works too.
{
aps: {
content-available: 1,
sound: "silence.wav"
}
}
Does anyone know:
- If this a bug?
- And if it is correct to assume that B or C is being treated as a Remote Notification (and not a bug with Silent Push where you need a sound attribute)? If so, this means it is not rate limited like Silent Pushes are... which Apple will likely fix. So I probably should not rely on it.
- What the rate limit is (N pushes every X seconds, etc)?
Thanks in advance.
Edit with more information
For A, the state of the application does not matter. Notification is never received.
It seems like B and C only work if you enclose the attributes and values in quotes, like below.
{"aps":{"content-available": 1, "sound":"silent.wav"}}
And the notification arrives in application:didReceiveRemoteNotification:fetchCompletionHandler: regardless of state.
This works also and does not play a sound when it arrives:
{
aps = {
"content-available" : 1,
sound : ""
};
}
EDIT
People having this problem may want to check out this link. I have been participating in a thread on Apple's Developer forum that goes over all app states and when silent pushes are received and not received.
So I just came across this issue yesterday, and after trying sending a payload with a sound set to an empty string, it was still causing vibration/sound on the device. Eventually, I stumbled on a blog post from Urban Airship that suggested needing to send:
{ priority: 5 }
in the push notification, which I had never seen. After perusing Apple's docs for push notifications, I stumbled on this page:
https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html
Which indicates that priority should be set as "5" or "10", and explains:
The notification’s priority. Provide one of the following values:
10 The push message is sent immediately.
The push notification must trigger an alert, sound, or badge on the device. It is an error to use this priority for a push that contains only the content-available key.
5 The push message is sent at a time that conserves power on the device receiving it.
Ultimately, we were able to get silent push notifications working with a badge count (and I suspect you could even do the same with an alert) with the following format:
aps = {
badge = 7;
"content-available" = 1;
priority = 5;
};
I have tried setting an empty string as the alert attribute and it also worked:
{
aps = {
"content-available" = 1;
"alert" = "";
};
}
It seems like APNS is checking for the existence of this attributes for the purpose of validating the push payload. Interestingly, they are not checking the actual content. It seems a little bit hacky though...
I use the tool-Knuff send my push notification to my device.
It looks like:
Then,I tried these example.
They are all work!But you must set the priority 10!
So if you are not use the tool,you also note it.
examples:
- no alert,no sound
{
"aps":{
"content-available":1,
}
}
- only alert
{
"aps":{
"content-available":1,
"alert":""
}
}
- only sound
{
"aps":{
"content-available":1,
"sound":""
}
}