最近為了應(yīng)對客戶的需求,需要對群聊中根據(jù)用戶的設(shè)置進行消息免打擾晨炕。抽空又仔細看了一下iOS push的格式衫画,并且使用Knuff進行了一些實驗。蘋果官方guide其實說的還是很清楚的瓮栗。
普通的remote push notification削罩,有提示(APP在后臺或closed狀態(tài)時瞄勾,1,響一聲弥激,2进陡,手機上方出現(xiàn)橫幅,3微服,消息顯示在通知中心) 時趾疚,推送payload格式:
{
"aps":{
"alert": {
"body": "hello",
"title": "You have a new message"
},
"sound": "default",
"badge": 1
},
"custom1": "custom information"
}
其中:
body:消息的內(nèi)容;
title:消息橫幅中顯示為粗體
sound:提示音
custom1:用戶自定義的字段
badge: 紅點角標(數(shù)字以蕴,不能...盗蟆,可以很大)
如果APP在后臺或者closed狀態(tài)時,收到消息推送舒裤,不希望出現(xiàn)提示音喳资,但是出現(xiàn)消息橫幅,消息顯示在通知中心腾供,則payload里不能出現(xiàn)sound字段仆邓,為:
{
"aps":{
"alert": {
"body": "hello, no sound",
"title": "You have a new message"
}
},
"custom1": "custom information"
}
注意:沒有"sound"字段就不會響一聲提示,但是橫幅和通知中心都不會受影響伴鳖;
另外节值,iOS有一種推送,稱為 "silent push"榜聂,它的payload格式如下:
{
"aps":{
"content-available": 1
},
"custom1": "custom information"
}
silent push要求push payload必須滿足下面兩點:
1) The payload’s aps dictionary must include the content-available key with a value of 1.
必須有"content-available"搞疗,且值為1;
2) The payload’s aps dictionary must not contain the alert, sound, or badge keys.
一定不能包含alert须肆,sound 和 badge
當用戶設(shè)備收到silent push后匿乃,它會在后臺調(diào)起app并運行30秒,調(diào)用的delegate:
application:didReceiveRemoteNotifiacation:fetchCompletionHandler:
與收到普通remote push notification后豌汇,在通知中心(或橫幅)點消息后幢炸,調(diào)起APP,系統(tǒng)調(diào)用的delegate一致拒贱。
但是開啟silent push宛徊,必須給APP設(shè)置相應(yīng)的capability:
在Xcode中,工程Targets->Capabilities->Background Modes 設(shè)置為ON逻澳,并且勾選 Remote notifications
但是需要注意的一點闸天,在guide中也被標記為IMPORTANT,silent push不是用來保持APP在后臺awake的斜做,也不具有高優(yōu)先級苞氮。APNs把silent push視為低優(yōu)先級,并且如果消息總數(shù)過多陨享,可能會限制其傳送葱淳。實際的限制是動態(tài)且根據(jù)具體情況變化的,但是請不要在一小時內(nèi)傳送過多的數(shù)據(jù)抛姑。
但是赞厕,更重要的一點是,APP收到silent push后定硝,調(diào)用delegate的前提條件是APP沒有沒殺死皿桑,比如:用戶手動劃走,被系統(tǒng)回收或者手機重啟蔬啡。在這3種情況下诲侮,silent push并不能喚醒APP并執(zhí)行一段代碼。