hbuilder的个推使用问题总结

Hubilder    ios推送使用个推总结

首先根据hbuilder的官方知道进行配置开发是没有任何问题的

  1. 对于ios的应用在线情况下:推送走的是个推平台和应用个推SDK的TCP长链接,在监听了receiver方法页面中可以收到透传消息。

对于ios的应用不在线情况下:推送走的是个推平台拿着deviceToken将消息发送给苹果APNS服务器,苹果服务器根据deviceToken将消息发送给对应deviceToken的设备,进行离线消息推送。

  1. 切记后台消息模版一定一定一定要用透传,下面是java后端代码。
    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);
    
    	}
    }

     

  2. 在调试中遇到的问题:

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消息接收不到?

  1. 先去查看CID和APPID绑定是否正确。
  2. 根据CID去查devicetoken,确认CID和devicetoken绑定是否正确。
  3. 查看证书是否上传错误
  4. 服务端推送的,请检查离线时间是否设置。

3devicetokenClientid绑定错误怎么办?
原因如下:换证书环境后,devicetoken是变掉了,但是CID没变导致不会立即重新绑定devicetoken(一般是24小时后会重新绑定),服务端记录的还是原来的devicetoken。解决办法如下:需要一个gxsdkconfig.plist文件重新放在工程中,打包,卸载原来的应用并重新安装。CID变化了会重新绑定devicetoken,这样绑定就不会有问题了。

4、在发布到appstroe时,证书环境需要更换吗?

  1. 开发的时候需要上传开发证书,开发测试OK后,发布到appstore之前,需要把证书更换成生产证书,证书更换后10分钟左右生效。
  2. 苹果设备上,CID是唯一的,一般不会变化,一般不建议重新生成CID。
  3. 如果CID与deviceToken绑定错误,需要重新生成一个CID来方便测试的操作方法:需要gxsdkconfig.plist文件,重新打包,把原来应用卸载重新安装新打包的这个。

5、更换证书后,客户端隔多久会重新绑定?

  1. 证书更换后, 过24小时才会重新绑定一次,这时devicetoken会变掉。24小时内做测试的话,会因Clientid和devicetoken绑定问题导致消息接收不到,因为证书更换后的devicetoken变掉了但没有更新到服务器,导致服务端查询到的devicetoken是错误的。

6、无效的devicetoken问题

  1. 一般来说是证书环境的问题,更换证书环境导致的。
  2. 先看clientid和devicetoken绑定是否有问题。
  3. 查看本地的证书环境是否与平台上传的证书环境一致。
  4. 查看证书是否有过期。

6、为什么IOS客户端会收到两条一样的消息?

  1. 是因为一个devicetoken绑定了两个Clientid导致的。
  2. 因证书环境变更,导致Clientid与devicetoken绑定变化,但服务端的数据没有更新,还是与旧的devicetoken绑定的。当用plist文件获取到新的clientid后,会重新绑定一下,这时新旧两个clientid都会绑定到同一个devicetoken上。当群推消息时,会根据clientid找到devicetoken进行APNS发送,这时新旧两个clientid都会发送一条数据,导致客户端会接收到两条数据。

7Tcp方式和http在性能上哪个比较好,各适用与哪个场景?
tcp是长链接,吞吐量更大,性能更好一些
tcp不支持toApp群推的
群推toApp用http方式的,因为只有一个请求

8IOS平台推送成功接收,服务端代码推送toApp却接收不到,返回AppIdNoUsers错误?
查看代码里的phoneTypeList中添加的是否为IOS。要修改为add(“IOS”)

9IOS签名失败的解决办法:
问题描述: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

 

 

你可能感兴趣的:(hbuilder)