关于 iOS 角标的问题


(北执) #1

只有ios才有setBadge 角标么,安卓的怎么办?


ios [JPUSHService setBadge:0]报错send badge:0 parameter check failed!
#2

Android 的自己实现


(北执) #3

ios的badge,使用你们极光后台在badge填写数字推送会,app对应的角标就是多少。
但为什么我在Java sdk代码那边使用 .setBadge(num) 却无效,都是角标+1?

Notification
.newBuilder()
.addPlatformNotification(
IosNotification.newBuilder()
.setAlert(iosAlert)//notification
.setSound(“default”)
.setBadge(666) //推送成功后角标并非666
.addExtras(pushMsg.getExtras())//extras
.build())
.addPlatformNotification( .build())


#4

这需要你们检查代码,是否实际推送的内容并不是你上述所传的值。

官方示例没有什么问题


(北执) #5

午休重新推了下又可以了,我发誓没有改过代码。为什么会这样


(北执) #6

如果想让角标保持原状,是不是推送0就可以了?


#7

「Java SDK 推送消息时不设置角标」需要调 disableBadge

设置为 0 是清除了角标


(北执) #8

{“platform”:[“ios”,“android”],“audience”:{“alias”:[“1768128”]},“notification”:{“ios”:{“alert”:{“title”:“你对此问题的回答因违规已被屏蔽”,“body”:“5.12测试”},“extras”:{“id”:“144”,“type”:“2”},“badge”:“94”,“sound”:“default”},“android”:{“alert”:“5.12测试”,“extras”:{“id”:“144”,“type”:“2”},“title”:“你对此问题的回答因违规已被屏蔽”}},“options”:{“sendno”:103248163,“apns_production”:true}}

由于我是用的阿里mq异步调用Java sdk,如果打断点的话 传入94 那么角标就是94,
如果不打断点进入,那么这个94很大几率会+1。
是不是因为异步没同步的原因?
你们sdk有办法解决同步的问题吗。


(北执) #9

就很奇怪,打断点进去数据能确保正确,不开badge会+1,因为这是在后台查的数字传入到setBadge的。
后来直接在Java SDK 的setBadge写死值 666,不打断点有时候还会+1,后来改成参数传,从1开始。按理说推送角标就是1,结果变成了667,你们极光是否有缓存机制?不然没道理在我改完代码后没有666的前提下变成667呀。:cry:


#10

不应该存在这种情况

你调了 API 传的什么值,就是什么值,这种情况应该是你们传值出现的问题,你可以在官网推送历史里面对比一下,你推送完这条消息,在推送历史里面找到这条消息,详情里面对 badge 估计就是传的 +1 。

Java SDK +1 的方法是autoBadge或者incrBadge,看看你有没有调用


(北执) #11
  public boolean sendNotificationWithAlias(com.wybs.bbs.dal.model.JPushMsg pushMsg){
       try {
           JPushClient jpushClient = new JPushClient(masterSecret, appKey);
           String authCode = ServiceHelper.getBasicAuthorization(appKey, masterSecret);
           ApacheHttpClient httpClient = new ApacheHttpClient(authCode, null, ClientConfig.getInstance());
           jpushClient.getPushClient().setHttpClient(httpClient);
           
           IosAlert iosAlert = IosAlert.newBuilder()
               .setTitleAndBody(pushMsg.getTitle(), "", pushMsg.getAlert())
               .build();
           
           PushPayload payload = PushPayload  
           .newBuilder()  
           .setPlatform(Platform.android_ios())  
           .setAudience(Audience.alias(pushMsg.getAlias()))
           .setNotification(  
                   Notification  
                           .newBuilder()  
                           .addPlatformNotification(  
                                   IosNotification.newBuilder()  
                                           .setAlert(iosAlert)//notification
                                           .setSound("default")
                                           .setBadge(pushMsg.getBadge())
                                           .addExtras(pushMsg.getExtras())//extras
                                           .build())
                           .addPlatformNotification(  
                                   AndroidNotification.newBuilder()  
                                           .setAlert(pushMsg.getAlert())//notification
                                           .setTitle(pushMsg.getTitle())
                                           .addExtras(pushMsg.getExtras())//extras
                                           .build())
                           .build())
                                   .setOptions(Options.newBuilder()
                                   .setApnsProduction(true)
                                   .build()).build();  
           PushResult result = jpushClient.sendPush(payload);
           logger.debug("sendNotificationWithAlias() - push all - msgId={}, title={}, notification={}, alias={}, badge={}, payload={}",result.msg_id, pushMsg.getTitle(), pushMsg.getAlert(), pushMsg.getAlias(), pushMsg.getBadge(), payload);
           return result.isResultOK();
       } catch (APIConnectionException e) {
           logger.debug("APIConnectionException:"+e.getMessage());
           e.printStackTrace();
       } catch (APIRequestException e) {
           logger.debug("APIConnectionException:"+e.getMsgId());
           e.printStackTrace();
       }
       return false;
  }

并没有调用autoBadge或incrBadge,这是我全部的方法了。


(Josh Lipan) #12

极光SDK没有缓存机制,即使有缓存也应该是之前设置过的值而不是加一;我在myeclipse上执行测试了很多次,控制台打印和终端表现都是正常的,建议您再检查下开发环境和代码