1.下面是極光文檔上面寫到的,好多同學並未好好的查看(下面我認為是角標相關的設置)
* @abstract 設置角標(到服務器)
*
* @param value 新的值. 會覆蓋服務器上保存的值(這個用戶)
*
* @discussion 本接口不會改變應用本地的角標值.
* 本地仍須調用 UIApplication:setApplicationIconBadgeNumber 函數來設置腳標.
*
* 本接口用於配合 JPush 提供的服務器端角標功能.
* 該功能解決的問題是, 服務器端推送 APNs 時, 並不知道客戶端原來已經存在的角標是多少, 指定一個固定的數字不太合理.
*
* JPush 服務器端腳標功能提供:
*
* - 通過本 API 把當前客戶端(當前這個用戶的) 的實際 badge 設置到服務器端保存起來;
* - 調用服務器端 API 發 APNs 時(通常這個調用是批量針對大量用戶),
* 使用 "+1" 的語義, 來表達需要基於目標用戶實際的 badge 值(保存的) +1 來下發通知時帶上新的 badge 值;
*/
+ (BOOL)setBadge:(NSInteger)value;(告訴極光我們app下次推送的角標基數)
+ (BOOL)setBadge:(NSInteger)value;
/*!
* @abstract 重置腳標(為0)
*
* @discussion 相當於 [setBadge:0] 的效果.
* 參考 [JPUSHService setBadge:] 說明來理解其作用.
*/
+ (void)resetBadge;
//這個我認為也是很重要的
/*!
* @abstract 關閉日志
*
* @discussion 關於日志級別的說明, 參考 [JPUSHService setDebugMode]
*
* 雖說是關閉日志, 但還是會打印 Warning, Error 日志. 這二種日志級別, 在程序運行正常時, 不應有打印輸出.
*
* 建議在發布的版本里, 調用此接口, 關閉掉日志打印.
*/
+ (void)setLogOFF;(發布時記得關閉極光打印log的功能)
2.一般小公司的App都會采用比較偷懶的設置角標的方式
就是一點擊app進入的時候,就回包通知欄的通知全部清空主要分三個步驟
一般是在這個方法里面
1.[application setApplicationBadgeNunber:0];(清空app的角標)
2.[application cancelLocalNotifcations];(清空通知欄的所有的通知)
3.[JPUSHService resetBadge];(通知極光的服務器角標清空了)
3.如果是大點點的公司就得好好的分析角標的變化過程了
這是我粗略的分析了角標的分析流程
當然這只是給大家一個分析的思路(不同的app還是要根據自己公司的產品的想法來的),如果很亂的話,不妨想我一樣畫一個流程圖
大致考慮的點就是:
1:程序在前台的時候app的角標是不是應該和極光的保持一致
2. 如果是程序的消息二級界面(一般就如此界面的時候這個分類下的消息都相當與已讀的狀態),如果這時候來的一條消息,要判斷是不是此分類下的界面(如果是相當於來的推送消息已經讀過了,如果不是這個類型的分類下面,任然是去增加角標)
3.后台進入的時候,判斷分類的消息是不是都是已讀的狀態,如果不是就角標進行-1 ,通知極光-1 通知后台此分類-1即可(當然自己的分類未讀個數的計數器還是該加加該減減)
這種實現的難度就是要判斷是不是在分類的二級列表下面
建議人力較少的公司直接點擊分類中的某個詳情界面是,才相當於查看了這條消息
還要考慮的是極光的后台有的時候會掛掉,我們的app必須有角標的自動修復機制,不要影響用戶的體驗
關於前台后台以及點擊通知欄直接進入的狀況
點擊通知欄進入會走InActive的狀態
前台和后台就很好判斷了
這里借鑒了某位大神哥的看法(多謝大神分享)