我們現(xiàn)在無(wú)論何時(shí)拿出自己的手機(jī),解鎖后的主頁(yè)上蚁鳖,總能看到一個(gè)個(gè)的小紅點(diǎn),仿佛在吶喊:有消息啦糠雨,不管重不重要才睹,快點(diǎn)我,快來(lái)消除我甘邀。
甚至曾有人掀起了一波潮流:在微信頭像上加上小紅點(diǎn)练俐。這很直接很徹底地引發(fā)了大眾的清除強(qiáng)迫癥咆畏。
這也就是為什么我們做 App 的時(shí)候屿岂,希望在收到了推送消息時(shí)作郭,App 能帶上一個(gè)小紅點(diǎn)。在使用得當(dāng)?shù)那闆r下逗抑,小紅點(diǎn)有助于增加 App 的啟動(dòng)率剧辐,保持用戶粘度寒亥。
那么 App 端怎么來(lái)實(shí)現(xiàn)呢?小紅點(diǎn)中心的數(shù)值怎么來(lái)管理呢荧关?
Android
- 角標(biāo)不是 Android 的基本功能溉奕,也就是說(shuō) Google 原生系統(tǒng)是不支持的,不過(guò)國(guó)內(nèi)某些 ROM 提供了各自的方法來(lái)支持自定義實(shí)現(xiàn)忍啤,只是跟隨系統(tǒng)更新加勤,提供的方法可能還會(huì)有所改變。因此極光推送并沒(méi)有支持 Android 的角標(biāo)同波,需要大家自己去實(shí)現(xiàn)與管理角標(biāo)值鳄梅。
- 分享幾個(gè)實(shí)現(xiàn) Android badge 的項(xiàng)目
iOS
一、客戶端設(shè)置角標(biāo)
- 設(shè)置本地顯示的角標(biāo)(Apple官方的接口)
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:(int)value];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; //清除角標(biāo)
//以上方法在任何地方均可調(diào)用未檩,根據(jù)自己的需要設(shè)定即可戴尸。譬如:
//殺死后點(diǎn)擊icon進(jìn)入時(shí)清除角標(biāo)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.applicationIconBadgeNumber = 0;
}
//從后臺(tái)點(diǎn)擊icon進(jìn)入時(shí)清除角標(biāo)
func applicationWillEnterForeground(_ application: UIApplication) {
application.applicationIconBadgeNumber = 0;
}
- 設(shè)置極光服務(wù)器存儲(chǔ)的角標(biāo)
+ (BOOL)setBadge:(int)value //value 取值范圍:[0,99999]
+ (void)resetBadge //相當(dāng)于 [setBadge:0],清空角標(biāo)
設(shè)通過(guò)調(diào)用 API 冤狡,使極光服務(wù)器為A設(shè)備存儲(chǔ)的角標(biāo)數(shù)為 P孙蒙,為 B 設(shè)備存儲(chǔ)的角標(biāo)數(shù)為 Q。
二悲雳、服務(wù)端或控制臺(tái)推送時(shí)马篮,badge可設(shè)置為 N,+N怜奖,-N
//服務(wù)端發(fā)送 json 消息串
{
"notification" : {
"ios" : {
"alert" : "hello, JPush!",
"sound" : "sound.caf",
"badge" : 1, //可傳值為N,+N翅阵,-N歪玲。
}
}
}
}
控制臺(tái)的設(shè)置 badge 的步驟:推送>發(fā)送通知>選擇一個(gè)iOS目標(biāo)平臺(tái)>展開(kāi)可選設(shè)置> iOS > badge
- N:推送時(shí)設(shè)置為固定的數(shù)值,收到時(shí)角標(biāo)便顯示該數(shù)值掷匠。
- +N 或 -N:收到時(shí)角標(biāo)值 = 極光服務(wù)器存儲(chǔ)的值 ± N:
- A 收到時(shí)角標(biāo)為 P ± N滥崩,B 收到時(shí)角標(biāo)為 Q ± N。
- 因此如果推送時(shí)使用 ± N讹语,那么客戶端就需要注意本地和極光服務(wù)器的角標(biāo)應(yīng)同步設(shè)置钙皮。
- 很多人問(wèn)咋個(gè)角標(biāo)清除不了,清除后再次推送收到的卻依舊是 清除前的值+N顽决,這就是因?yàn)?服務(wù)器存儲(chǔ)的角標(biāo)你沒(méi)同步修改咯短条。
這里應(yīng)該有注意到,極光服務(wù)器幫大家完成了每個(gè)設(shè)備的角標(biāo)的管理才菠,所以一般使用的時(shí)候只需要在客戶端預(yù)設(shè)好角標(biāo)的處理邏輯茸时,推送時(shí)固定好 + N,就可以不用再自己操心 badge 的值了赋访。
三可都、使用官方提供的服務(wù)端 SDK 各有不同
//java sdk 設(shè)置 badge+1用的不是setBadge缓待,而是autoBadge或者incrBadge
//C# SDK 設(shè)置 badge +1 用的是incrBadge
ps.ps:正經(jīng)講可能你不明白,那我再通俗點(diǎn)說(shuō):
1渠牲、官網(wǎng)-推送消息-選擇iOS平臺(tái)-可選設(shè)置-badge旋炒,設(shè)置1、2签杈、3或者N瘫镇,+1,+2之類的
2芹壕、iOS端收到消息汇四,系統(tǒng)直接就會(huì)顯示這個(gè)badge的值
3、如果你傳的+1踢涌,那么就是在極光服務(wù)器存的值里面+1后直接顯示通孽,一開(kāi)始App啥也沒(méi)做,就從0加起睁壁,你一直不setbadge背苦,就會(huì)一直+1下去,setbadge就改變這個(gè)+1起始值
4潘明、點(diǎn)擊了消息行剂,一般邏輯就是要清除、修改角標(biāo)钳降,那么調(diào)用Apple原生方法厚宰,看上面代碼,把顯示的角標(biāo)給清除了/修改了遂填,同時(shí)setbadge也附同樣的值铲觉,這樣下次+1的消息發(fā)過(guò)來(lái),就是在你當(dāng)前顯示的badge上+1顯示了吓坚,不需要你自己再管理了撵幽。
「再不行的話就測(cè)下我們的demo,多推送礁击,看效果總能明白(′?_?`)」
最后附贈(zèng)一個(gè)ps.ps.ps:JPush和JMessage的角標(biāo)是共用的盐杂,使用+1語(yǔ)義即可。
1哆窿、啟動(dòng)App链烈,成功注冊(cè)JPush和JMessage,登錄JMessage賬號(hào)
2更耻、JPush推送消息-選擇iOS平臺(tái)-可選設(shè)置-badge测垛,設(shè)置+1,極光服務(wù)器會(huì)處理你的角標(biāo)秧均,把badge值變?yōu)?「當(dāng)前存儲(chǔ)的角標(biāo)值」+1=N食侮,然后推送下去
3号涯、iOS端收到JPush消息,系統(tǒng)直接就會(huì)顯示這個(gè)badge的值锯七,暫定你現(xiàn)在App端不做處理(不清除和修改角標(biāo))
4链快、JMessage處于后臺(tái)等情況,極光有自動(dòng)的通知提醒(將你的會(huì)話消息轉(zhuǎn)為apns通知發(fā)到設(shè)備上)眉尸,發(fā)下來(lái)的消息域蜗,角標(biāo)是在N上+1后發(fā)下來(lái)并展示,發(fā)第二條消息噪猾,就是N+1+1=M霉祸。(JMessage的apns通知是我們自動(dòng)發(fā)的,所以角標(biāo)也是自動(dòng)默認(rèn)+1的語(yǔ)義)
5袱蜡、然后JPush發(fā)消息丝蹭,你后臺(tái)推送的時(shí)候也是寫的badge+1(這里JPush是可以傳固定值的,但是一旦傳了固定值坪蚁,收到消息就顯示這個(gè)固定值了奔穿,所以后臺(tái)推送一定要寫讓badge+1),那么此時(shí)收到敏晤,就展示的是M+1的角標(biāo)
6贱田、之后你點(diǎn)擊了消息等要做處理,一般邏輯就是要清除嘴脾、修改角標(biāo)男摧,那么調(diào)用Apple方法, UIApplication:setApplicationIconBadgeNumber 译打,把本地顯示的角標(biāo)給清除了/修改了彩倚,同時(shí)setbadge也附同樣的值,就是告訴極光服務(wù)器下次+1扶平,從這個(gè)值開(kāi)始+。
還不收了我去禍害處女座(o?v?)ノ