iOS遠(yuǎn)程推送之(二):角標(biāo)applicationIconNumber設(shè)置

導(dǎo)讀鏈接:

iOS遠(yuǎn)程推送之(一):APNs原理和基本配置

我們?cè)谕晟仆扑凸δ艿臅r(shí)候不光考慮能不能完成功遠(yuǎn)程推送疆柔,還要注意的是用戶的體驗(yàn)問題,首先最需要關(guān)注的就是應(yīng)用角標(biāo)問題牵辣。

應(yīng)用角標(biāo)

1>何為應(yīng)用角標(biāo)
應(yīng)用角標(biāo)就是底下截圖這哥們,本初截圖是MAC上截的躺枕,手機(jī)上也是一樣的效果:

Snip20170627_36.png

2>應(yīng)用角標(biāo)原理
應(yīng)用角標(biāo)其實(shí)是由系統(tǒng)設(shè)置的服猪,APNs將推送的消息傳送到系統(tǒng)的時(shí)候根據(jù)上面的消息payload內(nèi)容中的badge數(shù)值來給應(yīng)用的圖標(biāo)賦值,這樣應(yīng)用的HomeScreen上顯示的圖標(biāo)右上角就會(huì)出現(xiàn)相應(yīng)的數(shù)字拐云,不管你應(yīng)用啟動(dòng)沒啟動(dòng)都會(huì)顯示相應(yīng)的數(shù)字。所以如果是我們自己后臺(tái)來實(shí)現(xiàn)這個(gè)推送功能的話近她,那么就需要一套角標(biāo)邏輯來完善用戶體驗(yàn)了叉瘩。
推送消息的標(biāo)準(zhǔn)格式如下:

{"aps":
    {"alert":"I'm a very handsome boy! Nice IT guys!",
     "badge":6,
     "sound": "default"
    }
}

自定義推送消息的格式如下:

{"aps":
    {"alert":"I'm a very handsome boy! Nice IT guys!",
     "badge":6,
     "sound": "default"
    },
 "custom":"http://www.baidu.com"http://這就是自定義的設(shè)置,key也可以改
}

3>應(yīng)用角標(biāo)設(shè)置
那么既然能顯示粘捎,那么也應(yīng)該要能消除吧薇缅,或者說可以設(shè)置這個(gè)值,要不然用戶進(jìn)去應(yīng)用了或者查看了相關(guān)功能之后你的角標(biāo)數(shù)按道理就應(yīng)該減少攒磨,所以這就涉及到了角標(biāo)的設(shè)置了泳桦。
那么角標(biāo)是屬于UIApplication的一個(gè)NSInteger屬性,如下:

// set to 0 to hide. default is 0. In iOS 8.0 and later, your application must register for user notifications using -[UIApplication registerUserNotificationSettings:] before being able to set the icon badge.
@property(nonatomic) NSInteger applicationIconBadgeNumber;  

意思是說:當(dāng)這個(gè)角標(biāo)的值為0就是隱藏角標(biāo)娩缰,默認(rèn)是隱藏的灸撰;并且在iOS8之后你如果要設(shè)置角標(biāo)就需要通過-[UIApplication registerUserNotificationSettings:]此方式注冊(cè)通知

設(shè)置角標(biāo)的代碼:

[UIApplication sharedApplication].applicationIconBadgeNumber = 5;

4>應(yīng)用角標(biāo)處理
我只是簡(jiǎn)單的把所有的圖標(biāo)改成0隱藏,如果需要更細(xì)節(jié)處理自己思考下或者給我簡(jiǎn)書留言,處理代碼如下:

if (application.applicationIconBadgeNumber > 0) {  
        application.applicationIconBadgeNumber = 0; 
}

應(yīng)用角標(biāo)處理邏輯有以下幾種情況:
①當(dāng)我們用戶處于前臺(tái)的時(shí)候拼坎,通知橫幅不會(huì)彈出浮毯,但是依然會(huì)調(diào)用以下的方法:

//iOS6及以下(前臺(tái)是直接走這個(gè)方法不會(huì)出現(xiàn)提示的,后臺(tái)是需要點(diǎn)擊相應(yīng)的通知才會(huì)走這個(gè)方法的)
- (void)DSPushApplication:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    //handle code here...
}

//iOS7及以上
- (void)DSPushApplication:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    //handle code here...
}

那么我們就需要在這個(gè)里面相應(yīng)的把代碼角標(biāo)設(shè)置為0泰鸡,因?yàn)槟阋呀?jīng)在前臺(tái)了所以不需要出現(xiàn)角標(biāo)债蓝,表明告訴用戶沒有新的內(nèi)容,而且也要說一個(gè)問題就是某些童鞋說在某一個(gè)界面里面的消息通知該怎么辦盛龄?那我只能說這個(gè)涼拌!當(dāng)然是根據(jù)業(yè)務(wù)需求來辦咯饰迹,我沒法給出更多實(shí)際的代碼,因?yàn)闆]法給余舶。

②當(dāng)我們的應(yīng)用處于后臺(tái)的時(shí)候啊鸭,接收到了通知,我們是通過點(diǎn)擊應(yīng)用圖標(biāo)的方式來激活應(yīng)用程序的欧芽,那么這個(gè)時(shí)候也應(yīng)該要做下處理莉掂,在以下代理方法里面添加處理代碼:

- (void)applicationDidBecomeActive:(UIApplication *)application 
{
   //handle code here...
}

③當(dāng)我們應(yīng)用處于未啟動(dòng)狀態(tài)時(shí),接受到了通知但是是通過點(diǎn)擊應(yīng)用圖標(biāo)來啟動(dòng)應(yīng)用程序的話千扔,那么此種情況的處理同第②種情況處理憎妙,因?yàn)橐矔?huì)調(diào)用applicationDidBecomeActive:這個(gè)代理方法

④當(dāng)我們應(yīng)用程序處于后臺(tái)時(shí)库正,此時(shí)接收到通知之后,點(diǎn)擊了橫幅進(jìn)入的應(yīng)用厘唾,那么此時(shí)的做法同①褥符,具體是接著會(huì)進(jìn)入哪個(gè)界面那么根據(jù)推送來的消息里面的自定義字段我們來跳轉(zhuǎn)不同的界面的需求,順帶加上角標(biāo)處理代碼即可抚垃。
PS: 如何處理自定義字段喷楣,請(qǐng)參考iOS之遠(yuǎn)程推送APNs中的DSPushService類中對(duì)應(yīng)處的處理,這里還是貼上吧,代碼如下:

#pragma mark - 收到遠(yuǎn)程推送通知的相關(guān)方法
//iOS6及以下(前臺(tái)是直接走這個(gè)方法不會(huì)出現(xiàn)提示的鹤树,后臺(tái)是需要點(diǎn)擊相應(yīng)的通知才會(huì)走這個(gè)方法的)
- (void)DSPushApplication:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    [self DSPushApplication:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:nil];
}

//iOS7及以上
- (void)DSPushApplication:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"%@", userInfo);
   
    
    //注意HomeScreen上一經(jīng)彈出推送系統(tǒng)就會(huì)給App的applicationIconBadgeNumber設(shè)為對(duì)應(yīng)值
    if (application.applicationIconBadgeNumber > 0) {
        application.applicationIconBadgeNumber = 0;
    }
    
   
    
    NSLog(@"remote notification: %@",[userInfo description]);
    NSDictionary *apsInfo = [userInfo objectForKey:@"aps"];
    
    NSString *alert = [apsInfo objectForKey:@"alert"];
    NSLog(@"Received Push Alert: %@", alert);
    NSString *sound = [apsInfo objectForKey:@"sound"];
    NSLog(@"Received Push Sound: %@", sound);
    NSString *badge = [apsInfo objectForKey:@"badge"];
    NSLog(@"Received Push Badge: %@", badge);
    
    //這是播放音效
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
    
    //處理customInfo
    if ([userInfo objectForKey:@"custom"] != nil) {
        //custom handle code here...
    }
    completionHandler(UIBackgroundFetchResultNoData);
}

⑤當(dāng)我們的應(yīng)用程序處于未啟動(dòng)狀態(tài)铣焊,然后接收到通知,點(diǎn)擊通知橫幅進(jìn)入應(yīng)用罕伯,此時(shí)按照以下做處理:

- (BOOL)Application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //當(dāng)應(yīng)用程序未啟動(dòng)的時(shí)候曲伊,點(diǎn)擊橫幅來啟動(dòng)應(yīng)用可以做如下處理
    NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
    if (userInfo != nil) {
        //如果有值,說明是通過遠(yuǎn)程推送來啟動(dòng)的
        //code here...
    }
    return YES;
}

5>角標(biāo)相關(guān)問題
①問題一:
Q:如何做到角標(biāo)的逐步增加追他,比如說用戶一直沒有打開相應(yīng)的應(yīng)用坟募,但是呢需要角標(biāo)相應(yīng)的增加,比如說QQ邑狸、微信等此類應(yīng)用是需要和會(huì)話內(nèi)容一致的懈糯,那么這個(gè)怎么做呢?
A:這個(gè)是需要后臺(tái)服務(wù)器來支持的单雾,因?yàn)橹灰到y(tǒng)接收到這個(gè)通知之后就會(huì)根據(jù)里面的消息內(nèi)容的badge值設(shè)置為角標(biāo)值赚哗,那這樣的話也就只能是服務(wù)器來控制器了,也就是把這個(gè)角標(biāo)加值邏輯交給后臺(tái)了铁坎。當(dāng)然也不只是后臺(tái)的事兒蜂奸,因?yàn)橛袝r(shí)候我們處理角標(biāo)的時(shí)候不會(huì)一進(jìn)入到應(yīng)用就把角標(biāo)值設(shè)置為0,而是進(jìn)入到某一個(gè)界面或者點(diǎn)擊了某一個(gè)頁面或者按鈕這樣就把相應(yīng)的角標(biāo)數(shù)給減少掉硬萍,那么我們?cè)邳c(diǎn)擊完相應(yīng)界面后就應(yīng)該發(fā)送一個(gè)角標(biāo)處理請(qǐng)求給后臺(tái)告訴后臺(tái)要減少多少角標(biāo)數(shù)扩所,這樣就能夠做到下次服務(wù)器發(fā)送通知的時(shí)候?qū)?yīng)上了。
②問題二:
Q:我有一位朋友問過我一個(gè)奇葩的需求就是他們的產(chǎn)品要求他們把角標(biāo)數(shù)統(tǒng)一改成99+這種情況朴乖,然后他跟我說別的APP實(shí)現(xiàn)了祖屏,問我怎么修改?
A:我是這么回答的买羞。首先這么考慮這個(gè)問題袁勺,暫時(shí)先不考慮能不能改的問題,如果能用代碼改也是沒用的畜普,如果不能用代碼改那么要改也是在系統(tǒng)設(shè)置那兒改期丰,據(jù)我所知設(shè)置是沒有相應(yīng)的改動(dòng)的位置的。那么說說代碼改動(dòng)為什么不行呢,當(dāng)我們的程序處于后臺(tái)或者壓根沒有啟動(dòng)的時(shí)候钝荡,這個(gè)時(shí)候通知照樣要接收街立,而且要遞增,你程序內(nèi)部的代碼根本不起作用埠通,所以這個(gè)只能是根據(jù)系統(tǒng)的不同版本來定的赎离。據(jù)我所知,目前的版本都是數(shù)字沒有限制端辱,但是呢如果超過999999梁剔,會(huì)將中間的數(shù)字以...處理,如果要實(shí)現(xiàn)99或者999這種效果舞蔽,只能是服務(wù)器那邊設(shè)定推送消息中badge字段設(shè)置為99或者999即可荣病。我試過了直接將badge設(shè)置為99+是不能正常接收到推送的。
以下是設(shè)置的截圖:

1.jpg
2.jpg
4.jpg
5.jpg
6.jpg
7.jpg

iOS遠(yuǎn)程推送之(一):APNs原理和基本配置
iOS遠(yuǎn)程推送之(三):點(diǎn)擊通知橫幅啟動(dòng)應(yīng)用

有問題歡迎留言簡(jiǎn)書評(píng)論喷鸽,以上众雷!

逗比.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市做祝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸡岗,老刑警劉巖混槐,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異轩性,居然都是意外死亡声登,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門揣苏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悯嗓,“玉大人,你說我怎么就攤上這事卸察「” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵坑质,是天一觀的道長(zhǎng)合武。 經(jīng)常有香客問我,道長(zhǎng)涡扼,這世上最難降的妖魔是什么稼跳? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮吃沪,結(jié)果婚禮上汤善,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好红淡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布不狮。 她就那樣靜靜地躺著,像睡著了一般锉屈。 火紅的嫁衣襯著肌膚如雪荤傲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天颈渊,我揣著相機(jī)與錄音遂黍,去河邊找鬼。 笑死俊嗽,一個(gè)胖子當(dāng)著我的面吹牛雾家,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绍豁,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芯咧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了竹揍?” 一聲冷哼從身側(cè)響起敬飒,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芬位,沒想到半個(gè)月后无拗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昧碉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年英染,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片被饿。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡四康,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狭握,到底是詐尸還是另有隱情闪金,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布哥牍,位于F島的核電站毕泌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嗅辣。R本人自食惡果不足惜撼泛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澡谭。 院中可真熱鬧愿题,春花似錦损俭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仔夺,卻和暖如春琐脏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缸兔。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工日裙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惰蜜。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓昂拂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親抛猖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子格侯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 極光推送: 1.JPush當(dāng)前版本是1.8.2,其SDK的開發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋果官方的步伐财著,SD...
    Isspace閱讀 6,719評(píng)論 10 16
  • 一联四、前言 iOS中消息推送有兩種方式,本地推送和遠(yuǎn)程推送撑教。本地推送在iOS中使用本地通知為你的APP添加提示用戶功...
    KODIE閱讀 12,735評(píng)論 1 45
  • WWDC session - Notifications 學(xué)習(xí)總結(jié)廉嚼,如有不妥之處玫镐,望請(qǐng)指正???? pusher工具[...
    kurt_wang閱讀 5,004評(píng)論 12 28
  • 前言 本文是一篇轉(zhuǎn)載文章,在這一篇實(shí)用的文章里怠噪,你可以按照上面的步驟實(shí)現(xiàn)不借助第三方和服務(wù)器端恐似,自己給自己的設(shè)備發(fā)...
    進(jìn)無盡閱讀 1,668評(píng)論 6 6
  • 攜友驅(qū)車向金陽,快步甩手在湖旁傍念。 微風(fēng)拂面皺湖水矫夷,柳搖花笑在兩旁。 綠絲帶上萬步走憋槐,相談甚歡聊健康双藕。 吾從健康自由...
    書山路上閱讀 289評(píng)論 0 0