Hubilder ios推送使用个推总结
首先根据hbuilder的官方知道进行配置开发是没有任何问题的
对于ios的应用不在线情况下:推送走的是个推平台拿着deviceToken将消息发送给苹果APNS服务器,苹果服务器根据deviceToken将消息发送给对应deviceToken的设备,进行离线消息推送。
package com.fgdz.util;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.fgdz.common.WebConfig;
import com.fgdz.dao.TUserClient;
import com.gexin.rp.sdk.base.IPushResult;
import com.gexin.rp.sdk.base.ITemplate;
import com.gexin.rp.sdk.base.em.EPushResult;
import com.gexin.rp.sdk.base.impl.ListMessage;
import com.gexin.rp.sdk.base.impl.Target;
import com.gexin.rp.sdk.base.payload.APNPayload;
import com.gexin.rp.sdk.http.IGtPush;
import com.gexin.rp.sdk.template.TransmissionTemplate;
/**
* 个推的java服务端发送消息推送
*/
public class GeTuiPushUtil {
// 定义常量, appId、appKey、masterSecret 采用本文档 "第二步 获取访问凭证 "中获得的应用配置
private static String appId = " ";
private static String appKey = " ";
private static String masterSecret = " ";
private static String host = " ";
/**
*
* @param title
* 通知标题
* @param message
* APNPayload节点内容,不超过2kb
* @param transmissionContent
* 透传内容 :2048中/英字符,透传内容,不支持转义字符,
* @param offline
* 是否离线,建议设置成true
* @param offlineExpireTime
* 离线时长 单位为毫秒
* @param clientList
* 要推送给的设备用户集合
* @return
*/
public static boolean pushMessageToList(String title, String message, String transmissionContent, boolean offline,
long offlineExpireTime, List clientList) {
if (!WebConfig.isEnableJPush)
return true;
try {
// 配置推送目标
List targets = new ArrayList();
for (TUserClient client : clientList) {
// TODO: 一次建议50-100个CID
Target target = new Target();
target.setAppId(appId);// 必填,设置客户端所属应用唯一ID
target.setClientId(client.getClientId());// 必填,设置客户端身份ID
targets.add(target);
}
// 消息推送对象
IGtPush push = new IGtPush(host, appKey, masterSecret);
ListMessage listMessage = new ListMessage();
// 设置消息离线,并设置离线时间
listMessage.setOffline(offline);
// 离线有效时间,单位为毫秒,可选
listMessage.setOfflineExpireTime(offlineExpireTime);
// 可选: 1为wifi 0为不限制网络环境。根据手机处于的网络情况,决定是否下发
listMessage.setPushNetWorkType(0);
// 通知透传模板{tltle:"tltle",content:"message",payload:"transmissionContent"}
ITemplate template = getTransmissionTemplate(title, message, transmissionContent);
listMessage.setData(template);
// taskId用于在推送时去查找对应的message
String taskId = push.getContentId(listMessage);
IPushResult result = push.pushMessageToList(taskId, targets);
System.out.println(result.getResponse().toString());
return result.getResultCode() == EPushResult.RESULT_OK;
} catch (Exception e) {
Tracker.e(e);
return false;
}
}
/**
*
* 透传消息模版:在线和离线是由其SDK智能决定的
*
* @param title
* 通知标题
* @param text
* 通知内容 :不能有转义字符,大小限制2kb
* @param transmissionContent
* 透传内容 :2048中/英字符,透传内容,不支持转义字符,建议,不能有转义字符,大小限制2kb和text一样
* @return
*/
private static TransmissionTemplate getTransmissionTemplate(String title, String text, String transmissionContent) {
TransmissionTemplate template = new TransmissionTemplate();
template.setAppId(appId);
template.setAppkey(appKey);
// 透传消息设置,1为强制启动应用,客户端接收到消息后就会立即启动应用;2为等待应用启动
template.setTransmissionType(1);
template.setTransmissionContent(transmissionContent); // 2048中/英字符,透传内容,不支持转义字符
// 设置定时展示时间
// template.setDuration("2015-01-16 11:40:00", "2015-01-16 12:24:00");
// iOS推送使用该字段
APNPayload payload = new APNPayload();
payload.setAutoBadge("0");// 设置角标,还可以实现显示数字的自动增减,如"+1"、"-1"、"1"等
// 推送直接带有透传数据
// 当content-available为1时,App存活(前台或后台时),消息内容会直接透传给App。在未设置其他提醒(Alert、Sound)时,可以无提示和无声音的刷新数据。
// (支持 iOS 7.0 及以上版本。)
payload.setContentAvailable(0);
payload.setSound("default"); // 通知铃声文件名,无声设置为"com.gexin.ios.silence"
payload.setAlertMsg(getDictionaryAlertMsg(title, text)); // 字典模式使用APNPayload.DictionaryAlertMsg
template.setAPNInfo(payload);
return template;
}
/**
* ios数据封装 APNPayload节点
*
* @param title
* 通知标题
* @param text
* 通知内容 :不能有转义字符,大小限制2kb
* @return
*/
private static APNPayload.DictionaryAlertMsg getDictionaryAlertMsg(String title, String text) {
APNPayload.DictionaryAlertMsg alertMsg = new APNPayload.DictionaryAlertMsg();
alertMsg.setBody(text);// 通知文本消息字符串
alertMsg.setActionLocKey("ActionLockey");// (用于多语言支持)指定执行按钮所使用的Localizable.strings
alertMsg.setLocKey("LocKey");// (用于多语言支持)指定Localizable.strings文件中相应的key
alertMsg.addLocArg("loc-args");// 如果loc-key中使用的占位符,则在loc-args中指定各参数
alertMsg.setLaunchImage("launch-image");// 指定启动界面图片名
// iOS8.2以上版本支持
alertMsg.setTitle(title);// 通知标题
alertMsg.setTitleLocKey("TitleLocKey");// (用于多语言支持)对于标题指定执行按钮所使用的Localizable.strings,仅支持iOS8.2以上版本
alertMsg.addTitleLocArg("TitleLocArg");// 标题,如果loc-key中使用的占位符,则在loc-args中指定各参数,仅支持iOS8.2以上版本
return alertMsg;
}
public static void main(String[] args) {
// OSL-0830_936KXegPq69KferLBhwtl2
IGtPush push = new IGtPush(host, appKey, masterSecret);
Map res = (Map) push.getPushResult("OSL-0831_CjPn9d9hcl6ulwH06hhXs3")
.getResponse();
String gt = res.get("GT").toString();
System.out.println("个推报表:" + gt);
String apns = res.get("APN").toString();
System.out.println("|apns报表:" + apns);
}
}
3.1,在个推的应用配置à应用平台àios
如果打包的ipa是开发证书:需要上传的是开发的.p12推送证书
如果打包的ipa是发布证书:需要上传的是发布的.p12推送证书
3.2,如果还是没有接收到通知,可以使用个推的故障排查模块根据clentId获取设备的deviceToke,然后在3.1点中提到的上传证书位置有个测试一下,如果可以收到APNS消息,代表着个推和APNS服务器之间的deviceToke不一样,这个在百度上有解决方法,或者不处理,个推平台24小时会重新绑定cilentID和deviceToke,问题自然解决。
下面是个推ios的常见问题描述
作者:管家頗
链接:https://www.jianshu.com/p/dfc6c6250b09
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
1、提交了.p12文件后多久可以测试?
提交后10分钟左右才可以测试,并不是立即生效的。
2、应用在后台时接收不到消息,即APNS消息接收不到?
3、devicetoken和Clientid绑定错误怎么办?
原因如下:换证书环境后,devicetoken是变掉了,但是CID没变导致不会立即重新绑定devicetoken(一般是24小时后会重新绑定),服务端记录的还是原来的devicetoken。解决办法如下:需要一个gxsdkconfig.plist文件重新放在工程中,打包,卸载原来的应用并重新安装。CID变化了会重新绑定devicetoken,这样绑定就不会有问题了。
4、在发布到appstroe时,证书环境需要更换吗?
5、更换证书后,客户端隔多久会重新绑定?
6、无效的devicetoken问题
6、为什么IOS客户端会收到两条一样的消息?
7、Tcp方式和http在性能上哪个比较好,各适用与哪个场景?
tcp是长链接,吞吐量更大,性能更好一些
tcp不支持toApp群推的
群推toApp用http方式的,因为只有一个请求
8、IOS平台推送成功接收,服务端代码推送toApp却接收不到,返回AppIdNoUsers错误?
查看代码里的phoneTypeList中添加的是否为IOS。要修改为add(“IOS”)
9、IOS签名失败的解决办法:
问题描述:The applicationdoes not have a valid signature.
解决办法:把BundleIdentifier 改成你自己的id,也就是说这里应该填你们证书里面已经申请的那个应用id。
10、生产证书下怎么获取devicetoken?
生产证书不能在Xcode里进行联机debug,要先把应用包打出来,安装在手机上,然后在Xcode的origanizer->device选择你的设置,然后在consloe里查看日志,devicetoken和clientid都会打印出来的。
11、关于ios8的通知功能:
1.如果使用ios8sdk编译,需要使用新的registerForRemoteNotifications/registerUserNotificationSettings接口,否则无法获取devicetoken
2.如果使用ios以前的sdk编译,接口无需变动,直接使用老版本的registerForRemoteNotifications接口即可
12、收到通知后,点击通知栏后怎么让这条通知在通知栏里消失。
这个通知本来是不会清掉的,需要客户端自己写代码才能清掉,可以参考这里 http://www.cocoachina.com/ask/questions/show/99491