導(dǎo)讀鏈接:
我們?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ī)上也是一樣的效果:
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è)置的截圖:
iOS遠(yuǎn)程推送之(一):APNs原理和基本配置
iOS遠(yuǎn)程推送之(三):點(diǎn)擊通知橫幅啟動(dòng)應(yīng)用
有問題歡迎留言簡(jiǎn)書評(píng)論喷鸽,以上众雷!