极光推送 用户切换怎么收集用户反馈的错误信息

匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
如何取出极光推送的通知的内容,我试了好久,找不到怎么取出来,我是想取出所有的消息的内容,保存到本地自定义的消息中心。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我也遇到了这个问题,是这样取出通知的内容的:String result = bundle.getString(JPushInterface.EXTRA_ALERT);
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:& & & & &最近一直在做后台开发,但心里还是总惦记着Android,感觉还是Android有意思。正好项目中要用到极光推送,今天抽空来记录下这两天的研究成果。
& & & & &我们知道IOS有自己的推送服务,但很遗憾Android没有原生的推送服务,现在有很多第三方的推送服务,比如个推、极光、亚马逊、百度云、聚能等。今天我们就来研究下极光推送的后台服务器如何实现。
& & & & &关键点:
& & & & 1.首先最好是把极光官网java后台服务器的demo下载下来,里面有我们需要的jar包,以及example.
& & & & 2.极光推送的关键jpushClient = new JPushClient(masterSecret, appKey, 3);就是这个类。其中的参数需要我们从极光官网注册开发者,然后创建具体项目获取相应的两 & & & & & & & & 个key值。其中appKey值就是我们手机端对应的key值
& & & & 3.极光推送给我们提供了很多种推送的方式,我们可以选择某一个平台进行推送(Android ,IOS ,Windows Phone),也可以全部推送;我们可以针对某个特别的用户进行推送(设置alisa),也可以针对特别的群体进行推送(设置tag),第三个参数是设置推送保留的时间,只要在有效时间内上线就可以收到推送信息
& & & & 4. 极光推送现在都用https连接,提交请求是post,获取数据为get
& & & & ok 接下来就看服务端的实现(JAVA),JdPush推送方法+一个Servlet
package com.weiwend.
import org.slf4j.L
import org.slf4j.LoggerF
import cn.jpush.api.JPushC
import cn.mon.resp.APIConnectionE
import cn.mon.resp.APIRequestE
import cn.jpush.api.push.PushR
import cn.jpush.api.push.model.M
import cn.jpush.api.push.model.O
import cn.jpush.api.push.model.P
import cn.jpush.api.push.model.PushP
import cn.jpush.api.push.model.audience.A
import cn.jpush.api.push.model.audience.AudienceT
import cn.jpush.api.push.model.notification.AndroidN
import cn.jpush.api.push.model.notification.IosN
import cn.jpush.api.push.model.notification.N
public class Jdpush {
protected static final Logger LOG = LoggerFactory.getLogger(Jdpush.class);
// demo App defined in resources/jpush-api.conf
public static final String TITLE = &申通快递&;
public static final String ALERT = &祝大家新春快乐&;
public static final String MSG_CONTENT = &申通快递祝新老客户新春快乐&;
public static final String REGISTRATION_ID = &ef&;
public static final String TAG = &tag_api&;
static JPushClient jpushClient=
public static void testSendPush(String appKey ,String masterSecret) {
jpushClient = new JPushClient(masterSecret, appKey, 3);
// HttpProxy proxy = new HttpProxy(&localhost&, 3128);
// Can use this https proxy: /Exa-Networks/exaproxy
// For push, all you need do is to build PushPayload object.
//PushPayload payload = buildPushObject_all_all_alert();
//生成推送的内容,这里我们先测试全部推送
PushPayload payload=buildPushObject_all_alias_alert();
System.out.println(payload.toString());
PushResult result = jpushClient.sendPush(payload);
System.out.println(result+&................................&);
(&Got result - & + result);
} catch (APIConnectionException e) {
LOG.error(&Connection error. Should retry later. &, e);
} catch (APIRequestException e) {
LOG.error(&Error response from JPush server. Should review and fix it. &, e);
(&HTTP Status: & + e.getStatus());
(&Error Code: & + e.getErrorCode());
(&Error Message: & + e.getErrorMessage());
(&Msg ID: & + e.getMsgId());
public static PushPayload buildPushObject_all_all_alert() {
return PushPayload.alertAll(ALERT);
public static PushPayload buildPushObject_all_alias_alert() {
return PushPayload.newBuilder()
.setPlatform(Platform.all())//设置接受的平台
.setAudience(Audience.all())//Audience设置为all,说明采用广播方式推送,所有用户都可以接收到
.setNotification(Notification.alert(ALERT))
public static PushPayload buildPushObject_android_tag_alertWithTitle() {
return PushPayload.newBuilder()
.setPlatform(Platform.android())
.setAudience(Audience.all())
.setNotification(Notification.android(ALERT, TITLE, null))
public static PushPayload buildPushObject_android_and_ios() {
return PushPayload.newBuilder()
.setPlatform(Platform.android_ios())
.setAudience(Audience.tag(&tag1&))
.setNotification(Notification.newBuilder()
.setAlert(&alert content&)
.addPlatformNotification(AndroidNotification.newBuilder()
.setTitle(&Android Title&).build())
.addPlatformNotification(IosNotification.newBuilder()
.incrBadge(1)
.addExtra(&extra_key&, &extra_value&).build())
public static PushPayload buildPushObject_ios_tagAnd_alertWithExtrasAndMessage() {
return PushPayload.newBuilder()
.setPlatform(Platform.ios())
.setAudience(Audience.tag_and(&tag1&, &tag_all&))
.setNotification(Notification.newBuilder()
.addPlatformNotification(IosNotification.newBuilder()
.setAlert(ALERT)
.setBadge(5)
.setSound(&happy&)
.addExtra(&from&, &JPush&)
.setMessage(Message.content(MSG_CONTENT))
.setOptions(Options.newBuilder()
.setApnsProduction(true)
public static PushPayload buildPushObject_ios_audienceMore_messageWithExtras() {
return PushPayload.newBuilder()
.setPlatform(Platform.android_ios())
.setAudience(Audience.newBuilder()
.addAudienceTarget(AudienceTarget.tag(&tag1&, &tag2&))
.addAudienceTarget(AudienceTarget.alias(&alias1&, &alias2&))
.setMessage(Message.newBuilder()
.setMsgContent(MSG_CONTENT)
.addExtra(&from&, &JPush&)
可以看到上面我们推送平台设置的是所有平台,Audience设置为all(所有用户),这里key值和masterSecret值放在servlet中了。
servlet很简单,只要传入两个key值,调用该方法就可以
package com.weiwend.jdpush.
import java.io.IOE
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import com.sun.org.apache.xml.internal.serializer.utils.U
import com.weiwend.jdpush.J
import com.weiwend.jdpush.utils.Base64U
* Servlet implementation class tuisong
public class tuisong extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String appKey =&84cf5eea5d70&;
private static final String masterSecret = &7cf23f25ae3c5&;
public tuisong() {
// TODO Auto-generated constructor stub
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Jdpush.testSendPush(appKey,masterSecret);
System.out.println(&sucess&);
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
最后来看下运行的结果,可以看到,提交数据是以json格式。如果返回{&msg_id&:,&sendno&:}这样数据说明推送已经成功发送
{&platform&:&all&,&audience&:&all&,&notification&:{&alert&:&祝大家新春快乐&},&options&:{&sendno&:,&apns_production&:false}}
{&msg_id&:,&sendno&:}................................
源码分析:
&JPushClient jpushClient = new JPushClient(masterSecret, appKey, 3);实际上是实例化了一下三个类
public JPushClient(String masterSecret, String appKey, int maxRetryTimes) {
_pushClient = new PushClient(masterSecret, appKey, maxRetryTimes);
_reportClient = new ReportClient(masterSecret, appKey, maxRetryTimes);
_deviceClient = new DeviceClient(masterSecret, appKey, maxRetryTimes);
}PushPayload payload = buildPushObject_all_all_alert();,PushPayload类里包含了传递和返回的所有数据
public class PushPayload implements PushModel {
private static final String PLATFORM = &platform&;
private static final String AUDIENCE = &audience&;
private static final String NOTIFICATION = &notification&;
private static final String MESSAGE = &message&;
private static final String OPTIONS = &options&;
private static final int MAX_GLOBAL_ENTITY_LENGTH = 1200;
// Definition acording to JPush Docs
private static final int MAX_IOS_PAYLOAD_LENGTH = 220;
// Definition acording to JPush Docs
private static Gson _gson = new Gson();
private final P
private final A
private final Notif
private final M
private PushPayload(Platform platform, Audience audience,
Notification notification, Message message, Options options) {
this.platform =
this.audience =
this.notification =
this.message =
this.options =
&PushResult result = jpushClient.sendPush(payload);可以看到就是sendPost方法,然后接受返回的数据
public PushResult sendPush(PushPayload pushPayload) throws APIConnectionException, APIRequestException {
Preconditions.checkArgument(! (null == pushPayload), &pushPayload should not be null&);
if (_globalSettingEnabled) {
pushPayload.resetOptionsTimeToLive(_timeToLive);
pushPayload.resetOptionsApnsProduction(_apnsProduction);
ResponseWrapper response = _httpClient.sendPost(_baseUrl + PUSH_PATH, pushPayload.toString());
return BaseResult.fromResponse(response, PushResult.class);
另外我专门找了下sendNo如何生成的,其实就是随机生成的一个数字
public static Options sendno() {
return newBuilder().setSendno(ServiceHelper.generateSendno()).build();
public static int generateSendno() {
return RANDOM.nextInt((MAX - MIN) + 1) + MIN;
大家有兴趣也可以详细看一下代码的实现.
& & & & &刚开始值直接下载的demo运行,一直提示Audience没有对应的用户,是引文Audience设置了别名alias,而用户里面并没有设置对应的alias,所以找不到对应的用户。
最后我们来看一张图,再深入理解下极光推送的原理
本文已收录于以下专栏:
相关文章推荐
使用可以分一下七个步骤:
1.把架包拷过来到libs里面(add)
2.在main下面建一个jniLibs(名字不可以错),粘贴几个项目过来,原来在eclipse的libs里面的
3.把Exam...
简介在Android开发中,服务器有时候会向客户端推送一些用户可能感兴趣的消息,比如:淘宝,网易新闻,美团等都会向我们客户端推送消息.今天我就介绍一个第三方免费推送消息的服务:极光推送官方资源官方文档...
极光推送使用方法:
1.在极光推送上注册并新建应用,包名自定义,以com.xxx命名。
2.下载demo。
3.将下载好的demo解压并将文件中lib文件夹的所有文件复制到自己的工程libs文件夹中(...
1.JPush的简单介绍
JPush是一种专业而免费的第三方云推送推送平台,又名极光推送,在同行中开发者对JPush较为青睐,哈哈,不仅仅是因为它是免费的,服务也是非常到位的。
首先进入官网/,先注册一个账号。
注册号以后,创建应用
1、点击右上角进入个人中心
2、点击创建应用
3、在创建应用界面输入自己项目的应用名和应...
个人代码例子
package com.lchy.mon.J
import java.util.HashM
import java.util.M
cn.jpush.api
jpush-clien
[java] view
个人代码例子
package com.lchy.mon.J
import ...
现在的移动应用中消息推送已经成为不可或缺的功能了,这样可以增加与用户的交互。
使用消息推送的方法有很多,原理大致是:移动端与消息服务器保持一个长连接,一旦服务器有消息就推给客户端,客户端收到消息做...
前言如果你还没有搭建极光推送服务器,建议你根据情况,先从服务器搭建开始。 前文标题:《【极光推送】jpush服务端开发详尽过程》链接:http://ningmengjiabing.blog.163.c...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)原创作品,可以转载,但是请标注出处地址
Java后台实现极光推送有两种方式,一种是使用极光推送官方提供的推送请求API:/v3/push,另一种则是使用官方提供的第三方Java SDK,这里先进行第一种方式推送的实现代码:
import org.apache.http.HttpR
import org.apache.http.client.HttpC
import org.apache.http.client.methods.HttpP
import org.apache.http.entity.StringE
import org.apache.http.impl.client.DefaultHttpC
import org.apache.http.util.EntityU
import org.slf4j.L
import org.slf4j.LoggerF
import com.alibaba.fastjson.JSONA
import net.sf.json.JSONO
import sun.misc.BASE64E
* java后台极光推送方式一:使用Http API
* 此种方式需要自定义http请求发送客户端:HttpClient
@SuppressWarnings({ "deprecation", "restriction" })
public class JiguangPush {
private static final Logger log = LoggerFactory.getLogger(JiguangPush.class);
private String masterSecret = "xxxxxxxxxxxxxxxxxxxx";
private String appKey = "xxxxxxxxxxxxxxxxxxx";
private String pushUrl = "/v3/push";
private boolean apns_production = true;
private int time_to_live = 86400;
private static final String ALERT = "推送信息";
* 极光推送
public void jiguangPush(){
String alias = "123456";//声明别名
String result = push(pushUrl,alias,ALERT,appKey,masterSecret,apns_production,time_to_live);
JSONObject resData = JSONObject.fromObject(result);
if(resData.containsKey("error")){
("针对别名为" + alias + "的信息推送失败!");
JSONObject error = JSONObject.fromObject(resData.get("error"));
("错误信息为:" + error.get("message").toString());
("针对别名为" + alias + "的信息推送成功!");
}catch(Exception e){
log.error("针对别名为" + alias + "的信息推送失败!",e);
* 组装极光推送专用json串
* @param alias
* @param alert
* @return json
public static JSONObject generateJson(String alias,String alert,boolean apns_production,int time_to_live){
JSONObject json = new JSONObject();
JSONArray platform = new JSONArray();//平台
platform.add("android");
platform.add("ios");
JSONObject audience = new JSONObject();//推送目标
JSONArray alias1 = new JSONArray();
alias1.add(alias);
audience.put("alias", alias1);
JSONObject notification = new JSONObject();//通知内容
JSONObject android = new JSONObject();//android通知内容
android.put("alert", alert);
android.put("builder_id", 1);
JSONObject android_extras = new JSONObject();//android额外参数
android_extras.put("type", "infomation");
android.put("extras", android_extras);
JSONObject ios = new JSONObject();//ios通知内容
ios.put("alert", alert);
ios.put("sound", "default");
ios.put("badge", "+1");
JSONObject ios_extras = new JSONObject();//ios额外参数
ios_extras.put("type", "infomation");
ios.put("extras", ios_extras);
notification.put("android", android);
notification.put("ios", ios);
JSONObject options = new JSONObject();//设置参数
options.put("time_to_live", Integer.valueOf(time_to_live));
options.put("apns_production", apns_production);
json.put("platform", platform);
json.put("audience", audience);
json.put("notification", notification);
json.put("options", options);
* 推送方法-调用极光API
* @param reqUrl
* @param alias
* @param alert
* @return result
public static String push(String reqUrl,String alias,String alert,String appKey,String masterSecret,boolean apns_production,int time_to_live){
String base64_auth_string = encryptBASE64(appKey + ":" + masterSecret);
String authorization = "Basic " + base64_auth_
return sendPostRequest(reqUrl,generateJson(alias,alert,apns_production,time_to_live).toString(),"UTF-8",authorization);
* 发送Post请求(json格式)
* @param reqURL
* @param data
* @param encodeCharset
* @param authorization
* @return result
@SuppressWarnings({ "resource" })
public static String sendPostRequest(String reqURL, String data, String encodeCharset,String authorization){
HttpPost httpPost = new HttpPost(reqURL);
HttpClient client = new DefaultHttpClient();
HttpResponse response = null;
String result = "";
StringEntity entity = new StringEntity(data, encodeCharset);
entity.setContentType("application/json");
httpPost.setEntity(entity);
httpPost.setHeader("Authorization",authorization.trim());
response = client.execute(httpPost);
result = EntityUtils.toString(response.getEntity(), encodeCharset);
} catch (Exception e) {
log.error("请求通信[" + reqURL + "]时偶遇异常,堆栈轨迹如下", e);
client.getConnectionManager().shutdown();
/**     * BASE64加密工具    */
public static String encryptBASE64(String str) {
byte[] key = str.getBytes();
BASE64Encoder base64Encoder = new BASE64Encoder();
String strs = base64Encoder.encodeBuffer(key);
  以上代码中使用的是第一种方式实现推送,下面介绍第二种方式:使用java SDK
import org.slf4j.L
import org.slf4j.LoggerF
import mon.ClientC
import mon.resp.APIConnectionE
import mon.resp.APIRequestE
import cn.jpush.api.JPushC
import cn.jpush.api.push.PushR
import cn.jpush.api.push.model.O
import cn.jpush.api.push.model.P
import cn.jpush.api.push.model.PushP
import cn.jpush.api.push.model.audience.A
import cn.jpush.api.push.model.notification.AndroidN
import cn.jpush.api.push.model.notification.IosN
import cn.jpush.api.push.model.notification.N
* java后台极光推送方式二:使用Java SDK
@SuppressWarnings({ "deprecation", "restriction" })
public class JiguangPush {
private static final Logger log = LoggerFactory.getLogger(JiguangPush.class);
private static String masterSecret = "xxxxxxxxxxxxxxxxx";
private static String appKey = "xxxxxxxxxxxxxxxx";
private static final String ALERT = "推送信息";
* 极光推送
public void jiguangPush(){
String alias = "123456";//声明别名
("对别名" + alias + "的用户推送信息");
PushResult result = push(String.valueOf(alias),ALERT);
if(result != null && result.isResultOK()){
("针对别名" + alias + "的信息推送成功!");
("针对别名" + alias + "的信息推送失败!");
* 生成极光推送对象PushPayload(采用java SDK)
* @param alias
* @param alert
* @return PushPayload
public static PushPayload buildPushObject_android_ios_alias_alert(String alias,String alert){
return PushPayload.newBuilder()
.setPlatform(Platform.android_ios())
.setAudience(Audience.alias(alias))
.setNotification(Notification.newBuilder()
.addPlatformNotification(AndroidNotification.newBuilder()
.addExtra("type", "infomation")
.setAlert(alert)
.addPlatformNotification(IosNotification.newBuilder()
.addExtra("type", "infomation")
.setAlert(alert)
.setOptions(Options.newBuilder()
.setApnsProduction(false)//true-推送生产环境 false-推送开发环境(测试使用参数)
.setTimeToLive(90)//消息在JPush服务器的失效时间(测试使用参数)
* 极光推送方法(采用java SDK)
* @param alias
* @param alert
* @return PushResult
public static PushResult push(String alias,String alert){
ClientConfig clientConfig = ClientConfig.getInstance();
JPushClient jpushClient = new JPushClient(masterSecret, appKey, null, clientConfig);
PushPayload payload = buildPushObject_android_ios_alias_alert(alias,alert);
return jpushClient.sendPush(payload);
} catch (APIConnectionException e) {
log.error("Connection error. Should retry later. ", e);
return null;
} catch (APIRequestException e) {
log.error("Error response from JPush server. Should review and fix it. ", e);
("HTTP Status: " + e.getStatus());
("Error Code: " + e.getErrorCode());
("Error Message: " + e.getErrorMessage());
("Msg ID: " + e.getMsgId());
return null;
  可以看出使用Java SDK实现推送的方式很简单,代码量也少,理解起来也不难,官方提供的SDK中将很多内容都实现了,我们只是需要配置一下信息,然后发起推送即可。需要注意的是使用第二种方式,需要导入极光官网提供的jar包。
  直接在maven中的pom文件中加入:
&dependency&
&groupId&cn.jpush.api&/groupId&
&artifactId&jpush-client&/artifactId&
&version&3.2.15&/version&
&/dependency&
  注意:在这里极有可能会出现jar包冲突:具体哪个包我也忘记了,好像是个日志包,找到后删除即可,我曾经记录过这个jar包冲突问题,详见。
  原本我们项目中也是采用第二种方式实现的,但是最后在提交代码时发现一个问题,那就是虽然我们只是带导入了官网提供的那个jar包,但是最后一统计,竟然无缘无故增多了80+个jar包,如此多的jar包提交过于臃肿,而且不现实,所以才临时改变方案,采用第一种方式进行编码。
  代码中采用的是别名方式进行推送,需要在在手机APP端进行别名设置,最好就是在用户登录之后就设置好,这样只要用户登录一次,它的绑定别名就可以保存到极光服务器,而我们推送时,指定这个别名,就能将信息推送到对应用户的手机上。
  其实我们发起推送请求,只是将信息发送到了极光服务器之上,这个信息有一个保存时限,默认一天,只要用户使用手机APP登录系统,极光服务器就会将信息自动推送到对应别名的手机上,由此可见,信息并非由我们后台直接推送到手机,而是通过极光服务器这个中转站,而这正式极光的工作。
  注意:这里告知一个技巧,这个别名设置的时候,其实直接将用户ID设置为别名即可,既方便,又安全,不用再去想办法生成一个唯一的串来进行标识,甚至需要在后台数据库中用户表中新增字段。
阅读(...) 评论()

我要回帖

更多关于 极光推送目标用户为0 的文章

 

随机推荐