現(xiàn)狀
同事反應(yīng)點(diǎn)擊其中一個(gè)通知崭歧,其他通知也被清掉了,查看了一下代碼是這樣的:
func applicationWillResignActive(_ application: UIApplication) {
UIApplication.shared.applicationIconBadgeNumber = 0
}
這樣寫(xiě)代碼的話碘赖,其實(shí)狀況是這樣的驾荣,當(dāng)app變成非活躍狀態(tài)時(shí)會(huì)角標(biāo)會(huì)被清為0(即不顯示角標(biāo))泊窘。
而如果點(diǎn)擊通知欄的其中一條通知的話衷快,表現(xiàn)是這樣的,和遠(yuǎn)端下發(fā)的payload相關(guān):
- 當(dāng)remote push的角標(biāo)badge=0時(shí),app不展示角標(biāo)数焊,并且通知欄點(diǎn)其中一個(gè)通知,其他通知還在
- 當(dāng)remote push的角標(biāo)badge>0時(shí)檀训,app展示角標(biāo)王带,并且通知欄點(diǎn)其中一個(gè)通知,其他通知消失
- 當(dāng)remote push的角標(biāo)badge<0時(shí)件炉,app不展示角標(biāo)勘究,并且通知欄點(diǎn)其中一個(gè)通知,其他通知消失
這里說(shuō)的remote push的角標(biāo)badge指的是這個(gè):
{"aps":{"alert":"Testing.. (0)","badge":1,"sound":"default"}}
預(yù)期
但是運(yùn)營(yíng)的預(yù)期其實(shí)是斟冕,無(wú)論后端下發(fā)的角標(biāo)badge是啥口糕,點(diǎn)擊其中一個(gè)通知,也不要讓其他通知消失磕蛇。那就需要修改一下代碼:
func applicationWillResignActive(_ application: UIApplication) {
//applicationIconBadgeNumber 直接設(shè)置為0景描,不僅角標(biāo)會(huì)消失,多條通知的話秀撇,點(diǎn)其中一條通知超棺,其他的通知也消失了。設(shè)置為-1呵燕,只會(huì)清除角標(biāo)棠绘,不影響其他的通知
if #available(iOS 11.0, *) {
UIApplication.shared.applicationIconBadgeNumber = -1
} else {
// 親測(cè)iOS11以下,設(shè)置上面那句話是不行的
let clearEpisodeNotification = UILocalNotification()
clearEpisodeNotification.fireDate = Date(timeIntervalSinceNow: 1)
clearEpisodeNotification.applicationIconBadgeNumber = -1
UIApplication.shared.scheduleLocalNotification(clearEpisodeNotification)
}
}