大概是国庆放假的时候,回到家出于无聊,不小心点进去了极光兑换的活动,里面最高奖品当时是iPhone12或iPhone13,每日做任务获取极光值,获取了要记得点领取,不然次日就作废了,任务的话大部分是20极光值,就是浏览一些指定页面25秒即可获得;此外如果当天在指定商品内下单能获得200的极光值,还有就是分享、收藏、观看视频以及点赞,这些大致是60极光值左右,但数量很少,基本每种只有一次,最高级别的奖品需要43000极光值兑换,每个月的极光值次月10号零点过期作废,说到这里其实明白的人就已经明白了,明摆着的画大饼,除非一个月30天,每天都在得物上面买东西,领取相应极光值,不然就是绝无可能。最最重要的问题是,像我这种人不是冲着最高奖品去的,就想着拿个小奖品就差不多了,上个月辛辛苦苦攒了将近29000的极光值,其实也只能兑换一顶匡威的帽子(得物价格:¥109),谁
在app的后端设计中,免不了消息的推送,短信,邮件等服务,下面就个人的开发经验谈谈这方面。
(1)最重要的是,各种推送一定要放在队列系统中处理,不然会严重影响api的响应时间。
(2)短信方面
以前我们是用亿美软通的短信服务,但在三大运营商收紧了短信服务后,亿美软通的短信延迟非常厉害,后来我们找到了这家短信服务商 >
我们的项目中集成了极光推送,将用户id设置为别名,方便服务端对某个用户发送自定义消息。前几天遇到了一个用户反应无法收到推送,经过调试发现在设置别名时返回了错误码6009,极光官网的说明如下:
然后设置为debug模式,依然不知道是什么原因。于是先想到的就是升级一下SDK。升到最新版340之后,错误码变成了6017。错误原因如下:
然后在极光官方文档上发现了这样一句话:
RegistrationID就算作一个设备,即使我们是同一个手机,在卸载重装之后如果RegistrationID发生变化,就会算作一个新的设备,当重复卸载重装就会出现别名绑定失败,导致接收不到推送。
什么情况下RegistrationID会发生变化
然后我就尝试卸载重装,发现RegistrationID并未发生变化,这就很奇怪了。又是一通查找,找到了 这篇文章
里面有提到极光内部的一些处理,极光会将数据保存到粘贴板,如果重装时发现粘贴板有数据,RegistrationID就跟上次一样,如果没有数据,就会生成新的RegistrationID。
然后尝试卸载APP后关机重启,再安装。RegistrationID果然发生了变化。
到现在知道了收不到推送的原因了,极光官方提倡我们去充钱,能将设备上限提升到100个。但是无法从根本上解决问题,所以继续寻找解决方案。
在极光服务端的API文档中找到了 这一部分
我们可以在客户端通过调用极光服务端的API,解除别名绑定的设备。
具体解决思路如下:
极光在2020/03/10对别名绑定的设备数做了限制,在之前接入极光SDK的APP,使用别名功能时应该都存在这个问题的隐患,在此记录一下。
不得不吐槽一下极光的文档,对于设备也就是RegistrationID是否发生变化说的并不准确,而且iOS的SDK里并未提供批量解除别名绑定的API。
至于这个API到底是由客户端去调用还是服务端去调用,就仁者见仁智者见智了。
应用场景:在我们的项目中我们用的是创建视频会议和预警消息通知推送这两种情况,首先创建视频会议和中途邀请人参加会议我采用的是自定义推送消息,因为此应用场景传递的参数比较多,在推送过去之后android和ios可以很方便的将参数传递过去,但是我们考虑到邀请的所有人都在登录状态的时候才可以创建会议房间,我们采用的是腾讯视频会议的sdk,因为我们采用的是别名推送,当用户在登录的时候安卓端将用户uuid设置为别名,退出时取消别名,我在服务端根据传递过来的uuid利用别名查询registration_ids的数组大小是否为空判断当前用户是否设置别名,当邀请的所有人都设置了别名之后我才调用创建会议房间的接口。而预警消息推送我采用的是通知推送,当气象预警触发的时候我会采用通知推送的方式推送给app,这种方式比较简单。
极光推送是给app推送消息的,我们首先需要在服务端集成maven依赖
<!-- 极光推送 -->
<groupId>cnjpushapi
<artifactId>jpush-client
<version>323
</dependency>
接着我们需要了解极光推送有哪些推送方式,对于安卓和ios都适用的情况,我在项目中使用的是别名推送alias,(还有标签推送tag),推送方式又分为通知推送和自定义推送,通知推送能够显示在手机提示框中,而自定义推送却不能,我看安卓他们做的能跟微信视频一样的d出一个会话框,看着挺不错的,这跟微信不同的是可以邀请多个,之前用阿里云的好像只能一对一,所以才换成腾讯视频会议的,好了,废话不多说,上我写的一个工具类,
package comjpxxhomepagehomePageserviceutils;
import cnjpushapiJPushClient;
import cnjpushapipushPushResult;
import cnjpushapipushmodelOptions;
import cnjpushapipushmodelPlatform;
import cnjpushapipushmodelPushPayload;
import cnjpushapipushmodelaudienceAudience;
import cnjpushapipushmodelnotificationNotification;
import cnjpushapipushmodelMessage;
import cnjpushapipushmodelPushPayloadBuilder;
public class SendMessageUtils {
private static StringAppKey="8a7880c6fb81ad494b224078";
/
JPush MasterSecret 极光推送平台生成的密钥
/
private static StringMasterSecret="c0fc675c4c48f9bf35269cf4";
//两个参数分别填写你申请的masterSecret和appKey
private static JPushClientjPushClient=new JPushClient(MasterSecret,AppKey);
/
通知推送
备注:推送方式不为空时,推送的值也不能为空;推送方式为空时,推送值不做要求
@param type 推送方式:1、“tag”标签推送,2、“alias”别名推送
@param value 推送的标签或别名值
@param alert 推送的内容
/
public static StringpushNotice(String type,String title,String value,String alert,int roomId,String MessageType,String name,String promoterAdavter,String meetingTitle,String sig){
Builder builder= PushPayloadnewBuilder();
buildersetPlatform(Platformall());//设置接受的平台,all为所有平台,包括安卓、ios、和微软的
//设置如果用户不在线、离线消息保存的时间
Options options=Optionssendno();
optionssetTimeToLive(86400l); //设置为86400为保存一天,如果不设置默认也是保存一天
buildersetOptions(options);
buildersetMessage(MessagenewBuilder()
setMsgContent(value)
setTitle(title)
addExtra("roomId",roomId)
addExtra("MessageType",MessageType)
addExtra("name",name)
addExtra("promoterAdavter",promoterAdavter)
addExtra("meetingTitle",meetingTitle)
addExtra("userSig",sig)
build());
//设置推送方式
if(typeequals("alias")){
buildersetAudience(Audiencealias(value));//根据别名推送
}else if(typeequals("tag")){
buildersetAudience(Audiencetag(value));//根据标签推送
}else{
buildersetAudience(Audienceall());//Audience设置为all,说明采用广播方式推送,所有用户都可以接收到
}
//设置为采用通知的方式发送消息
buildersetNotification(Notificationalert(alert));
PushPayload pushPayload=builderbuild();
Systemoutprintln("ggggggg"+pushPayload);
try{
//进行推送,实际推送就在这一步
//Systemoutprintln("zzzzzzzzz "+jPushClientsendPush(pushPayload));
PushResult pushResult=jPushClientsendPush(pushPayload);
return "success";
}catch(Exception e){
Systemoutprintln("异常 "+e);
eprintStackTrace();
return "fail";
}
}
/
自定义消息推送
备注:推送方式不为空时,推送的值也不能为空;推送方式为空时,推送值不做要求
@param type 推送方式:1、“tag”标签推送,2、“alias”别名推送
@param value 推送的标签或别名值
@param alert 推送的内容
/
public static StringpushMsg(String type,String title,String value,String alert,int roomId,String MessageType,String name,String promoterAdavter,String meetingTitle,String sig){
Builder builder= PushPayloadnewBuilder();
buildersetPlatform(Platformall());//设置接受的平台
if(typeequals("alias")){
buildersetAudience(Audiencealias(value));//别名推送
}else if(typeequals("tag")){
buildersetAudience(Audiencetag(value));//标签推送
}else{
buildersetAudience(Audienceall());//Audience设置为all,说明采用广播方式推送,所有用户都可以接收到
}
MessageBuilder newBuilder=MessagenewBuilder();
newBuildersetMsgContent(alert);//消息内容
newBuildersetTitle(title);
newBuilderaddExtra("roomId",roomId);
newBuilderaddExtra("MessageType",MessageType);
newBuilderaddExtra("name",name);
newBuilderaddExtra("promoterAdavter",promoterAdavter);
newBuilderaddExtra("meetingTitle",meetingTitle);
newBuilderaddExtra("userSig",sig);
Message message=newBuilderbuild();
buildersetMessage(message);
PushPayload pushPayload=builderbuild();
try{
PushResult pushResult=jPushClientsendPush(pushPayload);
Systemoutprintln(pushResultisResultOK());
return "success";
}catch(Exception e){
eprintStackTrace();
return "fail";
}
}
public static void main(String[] args) {
//给标签为kefu的用户进行消息推送
//SendMessageUtilspushMsg("alias","标题","5b9022746e284ea0992e3baa983035dc","你有新的任务,请及时处理",111,"meetingType","name","avater","meetingTitle","");
//sendNotificationWirhAlias_Ios("zzzzzzzzzzzz","uuid");
//String result = SendMessageUtilspushNotice("alias","标题","5b9022746e284ea0992e3baa983035dc","你有新的任务,请及时处理",111,"meetingType","name","avater","meetingTitle","");
//Systemoutprintln("返回结果"+result);
/String result = SendMessageUtilspushNotice("alias","预警标题","5b9022746e284ea0992e3baa983035dc","dddd",0,"warnType","","","",""); //userDtogetUuId()
Systemoutprintln("result "+result);/
//根据uuid查询别名信息是否存在
String result = >
基础不过关哦,朋友。
<table>里肯定是要加<tr></tr>的,而且<tr></tr>里面肯定也是需要<td></td>的。
所以你现在是缺少了<td></td>,而且第一个<tr>丢了</tr>结束标签。
这样是标准的:
<table width="100%" border="1" class="table_sum"><tr class="jisuan">
<td>
<select>
<option value="无">无</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">半年</option>
</select>
</td>
</tr>
<tr>
<td>
<input type="text" name="data_" id='aa' class="he" />
</td>
</tr>
<tr>
<td>
<input type="text" name="data_" id='bb' class="he" />
</td>
</tr>
<tr>
<td>
<input type="text" name="data_" id='cc' class="he" />
</td>
</tr>
</table>
改好后再试试吧。
你这是用服务器控件的id,而js只认得html控件的id,这两个id是不同的,你可以把服务器控件改为html控件,或者使用<%=CheckBox7ClientID %>获取服务器控件的html页面Id
以上就是关于得物极光兑换物品抢不到全部的内容,包括:得物极光兑换物品抢不到、移动应用后端开发经验3-短信,邮件,推送服务、iOS极光推送别名限制问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)