iOS远程推送之(二):角标applicationIconNumber设置

导读链接:

iOS远程推送之(一):APNs原理和基本配置

我们在完善推送功能的时候不光考虑能不能完成功远程推送,还要注意的是用户的体验问题,首先最需要关注的就是应用角标问题。

应用角标

1>何为应用角标
应用角标就是底下截图这哥们,本初截图是MAC上截的,手机上也是一样的效果:

Snip20170627_36.png

2>应用角标原理
应用角标其实是由系统设置的,APNs将推送的消息传送到系统的时候根据上面的消息payload内容中的badge数值来给应用的图标赋值,这样应用的HomeScreen上显示的图标右上角就会出现相应的数字,不管你应用启动没启动都会显示相应的数字。所以如果是我们自己后台来实现这个推送功能的话,那么就需要一套角标逻辑来完善用户体验了。
推送消息的标准格式如下:

{"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"//这就是自定义的设置,key也可以改
}

3>应用角标设置
那么既然能显示,那么也应该要能消除吧,或者说可以设置这个值,要不然用户进去应用了或者查看了相关功能之后你的角标数按道理就应该减少,所以这就涉及到了角标的设置了。
那么角标是属于UIApplication的一个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;  

意思是说:当这个角标的值为0就是隐藏角标,默认是隐藏的;并且在iOS8之后你如果要设置角标就需要通过-[UIApplication registerUserNotificationSettings:]此方式注册通知

设置角标的代码:

[UIApplication sharedApplication].applicationIconBadgeNumber = 5;

4>应用角标处理
我只是简单的把所有的图标改成0隐藏,如果需要更细节处理自己思考下或者给我简书留言,处理代码如下:

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

应用角标处理逻辑有以下几种情况:
①当我们用户处于前台的时候,通知横幅不会弹出,但是依然会调用以下的方法:

//iOS6及以下(前台是直接走这个方法不会出现提示的,后台是需要点击相应的通知才会走这个方法的)
- (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...
}

那么我们就需要在这个里面相应的把代码角标设置为0,因为你已经在前台了所以不需要出现角标,表明告诉用户没有新的内容,而且也要说一个问题就是某些童鞋说在某一个界面里面的消息通知该怎么办?那我只能说这个凉拌!当然是根据业务需求来办咯,我没法给出更多实际的代码,因为没法给。

②当我们的应用处于后台的时候,接收到了通知,我们是通过点击应用图标的方式来激活应用程序的,那么这个时候也应该要做下处理,在以下代理方法里面添加处理代码:

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

③当我们应用处于未启动状态时,接受到了通知但是是通过点击应用图标来启动应用程序的话,那么此种情况的处理同第②种情况处理,因为也会调用applicationDidBecomeActive:这个代理方法

④当我们应用程序处于后台时,此时接收到通知之后,点击了横幅进入的应用,那么此时的做法同①,具体是接着会进入哪个界面那么根据推送来的消息里面的自定义字段我们来跳转不同的界面的需求,顺带加上角标处理代码即可。
PS: 如何处理自定义字段,请参考iOS之远程推送APNs中的DSPushService类中对应处的处理,这里还是贴上吧,代码如下:

#pragma mark - 收到远程推送通知的相关方法
//iOS6及以下(前台是直接走这个方法不会出现提示的,后台是需要点击相应的通知才会走这个方法的)
- (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上一经弹出推送系统就会给App的applicationIconBadgeNumber设为对应值
    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);
}

⑤当我们的应用程序处于未启动状态,然后接收到通知,点击通知横幅进入应用,此时按照以下做处理:

- (BOOL)Application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //当应用程序未启动的时候,点击横幅来启动应用可以做如下处理
    NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
    if (userInfo != nil) {
        //如果有值,说明是通过远程推送来启动的
        //code here...
    }
    return YES;
}

5>角标相关问题
①问题一:
Q:如何做到角标的逐步增加,比如说用户一直没有打开相应的应用,但是呢需要角标相应的增加,比如说QQ、微信等此类应用是需要和会话内容一致的,那么这个怎么做呢?
A:这个是需要后台服务器来支持的,因为只要系统接收到这个通知之后就会根据里面的消息内容的badge值设置为角标值,那这样的话也就只能是服务器来控制器了,也就是把这个角标加值逻辑交给后台了。当然也不只是后台的事儿,因为有时候我们处理角标的时候不会一进入到应用就把角标值设置为0,而是进入到某一个界面或者点击了某一个页面或者按钮这样就把相应的角标数给减少掉,那么我们在点击完相应界面后就应该发送一个角标处理请求给后台告诉后台要减少多少角标数,这样就能够做到下次服务器发送通知的时候对应上了。
②问题二:
Q:我有一位朋友问过我一个奇葩的需求就是他们的产品要求他们把角标数统一改成99+这种情况,然后他跟我说别的APP实现了,问我怎么修改?
A:我是这么回答的。首先这么考虑这个问题,暂时先不考虑能不能改的问题,如果能用代码改也是没用的,如果不能用代码改那么要改也是在系统设置那儿改,据我所知设置是没有相应的改动的位置的。那么说说代码改动为什么不行呢,当我们的程序处于后台或者压根没有启动的时候,这个时候通知照样要接收,而且要递增,你程序内部的代码根本不起作用,所以这个只能是根据系统的不同版本来定的。据我所知,目前的版本都是数字没有限制,但是呢如果超过999999,会将中间的数字以...处理,如果要实现99或者999这种效果,只能是服务器那边设定推送消息中badge字段设置为99或者999即可。我试过了直接将badge设置为99+是不能正常接收到推送的。
以下是设置的截图:

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

iOS远程推送之(一):APNs原理和基本配置
iOS远程推送之(三):点击通知横幅启动应用

有问题欢迎留言简书评论,以上!

逗比.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容