美文网首页
推送时App角标显示异常的问题

推送时App角标显示异常的问题

作者: lanmoyingsheng | 来源:发表于2018-07-12 16:24 被阅读12次

    App和后台集成极光推送。
    首先应该了解:
    1、后台调用极光API推送消息时,传的角标值是"+1",而不是具体的某个值,估计极光传给Apns的值也是这样,这样就可以所有机型的不同通知数量进行累加。
    2、直接设置applicationIconBadgeNumber角标为0,会清除所有通知。

    UIApplication.shared.applicationIconBadgeNumber = 0
    

    3、当收到通知时,接受到的数据一般为:

    {
        "aps" : {
            "alert" : {
                "body" : "content通知显示的内容",
                "title" : "title通知显示的标题"
            },
            "badge" : 6,
            "extras" : { // 自定义字段
                "id" : "200",
                "types" : "2"
            },
            "sound" : "default"
        }
     }
    
    系统会获取badge的值,立刻显示为角标。因此这个字段非常重要。

    一般为了显示正确的数字,在设置applicationIconBadgeNumber后,还要将这个值传给极光。这样前后台的对每台设备的角标数是统一的。

    UIApplication.shared.applicationIconBadgeNumber = number
    JPUSHService.setBadge(number)
    

    4、App显示角标值由两个值决定:推送时接收的badge值和applicationIconBadgeNumber。

    当点击某个通知时,如果不改变applicationIconBadgeNumber值,角标是不会变得。因此每次点击通知,必须改变角标的值。

    这里有两套方案:
    1、只要点击通知,在设置applicationIconBadgeNumber为0。

    UIApplication.shared.applicationIconBadgeNumber = 0
    JPUSHService.setBadge(0)
    

    优点是逻辑简单,代码简单。缺点是体验不好,用户点击某个通知,所有的通知就消失了。。。虽然缺点很明显,但也有很多App是这样做的。

    2、准确的计算角标

    var badgeNO = UIApplication.shared.applicationIconBadgeNumber
    if badgeNO > 0 {
    
    
        badgeNO -= 1
        UIApplication.shared.applicationIconBadgeNumber = badgeNO
    
        JPUSHService.setBadge(badgeNO)
    }
    

    badgeNO -= 1和UIApplication.shared.applicationIconBadgeNumber = badgeNO,会减少一个单位的值,对通知栏的本App其他通知不产生影响。我猜测,通知系统维护底层一个数组,用于显示某个App的所有通知,而数组的长度由applicationIconBadgeNumber决定(其实这里的逻辑比较复杂,通知栏通知的个数应该小于等于角标的个数)。

    这里必须考虑到一种需求:用户清除通知栏所有的通知,而App角标不会变化。一般在App中,构建一个消息中心的模块,用于显示用户没有读取的通知,当用户查看消息后,角标在变化,例如老虎证券就是这样做的;当然比如像微信、QQ、支付宝等,它们的消息中心是整个App界面,而不是一个单独的列表页。

    相关文章

      网友评论

          本文标题:推送时App角标显示异常的问题

          本文链接:https://www.haomeiwen.com/subject/tykrpftx.html