下载个推SDK,找到这两个dll直接引用。
using引用
using com.gexin.rp.sdk.dto; using com.igetui.api.openservice; using com.igetui.api.openservice.igetui; using com.igetui.api.openservice.igetui.template; using com.igetui.api.openservice.igetui.template.notify; using com.igetui.api.openservice.payload;
两种方案获取到这些参数。
public const string HOST = "http://sdk.open.api.igexin.com/apiex.htm"; public const string APPID = "xxxxxxxxxxxxx"; public const string APPKEY = "xxxxxxxxxxxxx"; public const string AppSecret = "xxxxxxxxxxxxx"; public const string MASTERSECRET = "xxxxxxxxxxxxx";
1,使用unipush https://dev.dcloud.net.cn/uni/push 在unipush里面申请一个帐号,开通推送就能得到这些参数。
2,去个推注册并且配置相关参数
说明:UniPush由DCloud与个推联合打造。AppSecret和MasterSecret由个推保存,DCloud并不保存。个推是A股上市公司,开发者可放心使用UniPush业务
unipush并不是专门为uniapp所使用,可以单独使用unipush功能,其相关配置和操作页面个人感觉比个推的好用。
透传页面使用,相关参数说明一目了然。
1.1配置 推送需要2步,配置应用平台。
1.2 配置安卓厂商通道
2 推送方法
2.1推送单个用户
/// <summary> /// 推送单个用户 /// </summary> /// <param name="title">标题 例如 迪信通 抢购会</param> /// <param name="content">内容 例如 华为Mate30 5G抢购</param> /// <param name="url">APP跳转地址 商品单页 活动页 或者其它页面</param> /// <param name="cid">数据库pushclientid字段</param> /// <returns>推送结果</returns> public static string PushMessageToSingle(string title, string content, string url, string cid) { IGtPush push = new IGtPush(HOST, APPKEY, MASTERSECRET); TransmissionTemplate template = TransmissionTemplateAndroidiOS(title, content, url); //单推消息模型 SingleMessage message = new SingleMessage(); //当用户不在线 是否离线存储 message.IsOffline = true; //离线有效时间 message.OfflineExpireTime = 1000 * 3600 * 12; message.Data = template; //当前网络 1wifi 2-234G 0不限制 message.PushNetWorkType = 0; com.igetui.api.openservice.igetui.Target target = new com.igetui.api.openservice.igetui.Target(); target.appId = APPID; target.clientId = cid; String pushResult = push.pushMessageToSingle(message, target); return pushResult; }
2.2 推送一批用户
/// <summary> /// 推送一批用户 /// </summary> /// <param name="title">标题 例如 抢购会</param> /// <param name="content">内容 例如 华为Mate30 5G抢购 </param> /// <param name="url">APP跳转地址 商品单页 活动页 或者其它页面</param> /// <param name="cids">数据库pushclientid字段集合</param> /// <returns>推送结果</returns> public static string pushMessageToList(string title, string content, string url, string[] cids) { IGtPush push = new IGtPush(HOST, APPKEY, MASTERSECRET); ListMessage message = new ListMessage(); NotificationTemplate template = NotificationTemplateAndroidiOS(title, content, url); message.IsOffline = true; message.OfflineExpireTime = 1000 * 3600 * 12; message.Data = template; message.PushNetWorkType = 0; List<com.igetui.api.openservice.igetui.Target> targetList = new List<com.igetui.api.openservice.igetui.Target>(); for (int i = 0; i < cids.Length; i++) { com.igetui.api.openservice.igetui.Target target1 = new com.igetui.api.openservice.igetui.Target(); target1.appId = APPID; target1.clientId = cids[i]; targetList.Add(target1); } String contentId = push.getContentId(message); String pushResult = push.pushMessageToList(contentId, targetList); return pushResult; }
2.3 根据条件推送到某些条件用户
/// <summary> /// 根据条件推送到某些条件用户 /// </summary> /// <param name="title">标题 例如 抢购会</param> /// <param name="content">内容 例如 华为Mate30 5G抢购</param> /// <param name="url">APP跳转地址 商品单页 活动页 或者其它页面</param> /// <param name="provinces">省份s 北京_上海_河南 默认不传</param> /// <param name="platform">ANDROID IOS ALL 3种值 默认ALL不传</param> /// <returns>推送结果</returns> public static string pushMessageToApp(string title, string content, string url, string provinces = "", string platform = "ALL") { IGtPush push = new IGtPush(HOST, APPKEY, MASTERSECRET); AppMessage message = new AppMessage(); message.Speed = 100; TransmissionTemplate template = TransmissionTemplateAndroidiOS(title, content, url); message.IsOffline = true; message.OfflineExpireTime = 1000 * 3600 * 12; message.Data = template; message.PushNetWorkType = 0; List<String> appIdList = new List<string>(); appIdList.Add(APPID); //手机操作系统类型 List<String> phoneTypeList = new List<string>(); if (platform == "ALL") { phoneTypeList.Add("ANDROID"); phoneTypeList.Add("IOS"); } else if (platform == "ANDROID") { phoneTypeList.Add("ANDROID"); } else if (platform == "IOS") { phoneTypeList.Add("IOS"); } //地址 List<String> provinceList = new List<string>(); if (provinces.IsNotNullOrEmpty()) { string[] provincesList = provinces.Split(new[] { '_' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < provincesList.Length; i++) { provinceList.Add(provincesList[i]); } } //标签 List<String> tagList = new List<string>(); message.AppIdList = appIdList; message.PhoneTypeList = phoneTypeList; message.ProvinceList = provinceList; message.TagList = tagList; String pushResult = push.pushMessageToApp(message); return pushResult; }
3.1
模版一
/// <summary> /// 模版一 /// </summary> /// <param name="title">标题</param> /// <param name="content">内容</param> /// <param name="url">链接 APP中要跳转的页面</param> /// <returns></returns> public static NotificationTemplate NotificationTemplateAndroidiOS(string title, string content, string url) { NotificationTemplate template = new NotificationTemplate(); template.AppId = APPID; template.AppKey = APPKEY; template.Title = title; template.Text = content; template.Logo = ""; template.LogoURL = ""; template.TransmissionType = 1; template.TransmissionContent = "{"url":"" + url + ""}"; template.IsRing = true; template.IsVibrate = true; template.IsClearable = true; //安卓透传厂商通道 Notify notify = new Notify(); notify.Content = title; notify.Title = content; string newUrl = "{"url":"" + url + ""}"; notify.Intent = $"intent:#Intent;action=android.intent.action.oppopush;launchFlags=0x14000000;component=您的安卓包名/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title={title};S.content={content};S.payload={newUrl};end"; notify.Type = NotifyInfo.Types.Type._intent; template.set3rdNotifyInfo(notify); //苹果透传配置 APNPayload apnpayload = new APNPayload(); DictionaryAlertMsg alertMsg = new DictionaryAlertMsg(); // IOS 的body用这个 alertMsg.Body = content; alertMsg.ActionLocKey = "ActionLocKey"; alertMsg.LocKey = "LocKey"; alertMsg.addLocArg("LocArg"); alertMsg.LaunchImage = "LaunchImage"; //iOS8.2支持字段 alertMsg.Title = title; alertMsg.TitleLocKey = "TitleLocKey"; alertMsg.addTitleLocArg("TitleLocArg"); apnpayload.AlertMsg = alertMsg; //apnpayload.Badge = 0 +1; apnpayload.ContentAvailable = 0; apnpayload.Sound = "default"; apnpayload.addCustomMsg("payload", "{"url":"" + url + ""}"); template.setAPNInfo(apnpayload); string begin = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string end = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss"); template.setDuration(begin, end); return template; }
3.2
/// <summary> /// 模版二 /// </summary> /// <param name="title">标题</param> /// <param name="content">内容</param> /// <param name="url">链接</param> /// <returns></returns> public static TransmissionTemplate TransmissionTemplateAndroidiOS(string title, string content, string url) { TransmissionTemplate template = new TransmissionTemplate(); template.AppId = APPID; template.AppKey = APPKEY; //应用启动类型,1:强制应用启动 2:等待应用启动 template.TransmissionType = 1; //透传内容 template.TransmissionContent = "{"url":"" + url + ""}"; //安卓透传厂商通道 Notify notify = new Notify(); notify.Content = title; notify.Title = content; string newUrl = "{"url":"" + url + ""}"; notify.Intent = $"intent:#Intent;action=android.intent.action.oppopush;launchFlags=0x14000000;component=您的安卓包名/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title={title};S.content={content};S.payload={newUrl};end"; notify.Type = NotifyInfo.Types.Type._intent; template.set3rdNotifyInfo(notify); //苹果透传配置 APNPayload apnpayload = new APNPayload(); DictionaryAlertMsg alertMsg = new DictionaryAlertMsg(); // IOS 的body用这个 alertMsg.Body = content; alertMsg.ActionLocKey = "ActionLocKey"; alertMsg.LocKey = "LocKey"; alertMsg.addLocArg("LocArg"); alertMsg.LaunchImage = "LaunchImage"; //iOS8.2支持字段 alertMsg.Title = title; alertMsg.TitleLocKey = "TitleLocKey"; alertMsg.addTitleLocArg("TitleLocArg"); apnpayload.AlertMsg = alertMsg; //apnpayload.Badge = 0 +1; apnpayload.ContentAvailable = 0; apnpayload.Sound = "default"; apnpayload.addCustomMsg("payload", "{"url":"" + url + ""}"); template.setAPNInfo(apnpayload); string begin = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string end = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss"); template.setDuration(begin, end); return template; }
4.调用
//调用案例 //string result = UniPush.PushMessageToSingle("通知", "华为Mate30 5G抢购", "/pages/product/product?pid=9871&cid=288", "cid", "20200221"); //string[] cids = { "cid" }; //string result = UniPush.pushMessageToList("通知", "华为抢购", "/pages/product/product?pid=10019&cid=288", cids, "20200221"); //string result = UniPush.pushMessageToApp("通知", "华为Mate30 5G抢购", "/pages/product/product?pid=9871&cid=288", "", "ALL");
5,测试结果
1,测试单推安卓APP。在线状态:无须透传秒到。 离线状态:看心情1秒-15分钟我都碰到过。
2,测试单推iOS APP。在线状态:无须透传秒到。 离线状态:APNs基本做到1-5秒到。
3,测试推集合,情况和1、2相同。
4,测试推全部,1的情况好一些、2的情况不变。
6,总结
国内安卓推送是一个混乱的市场,每个厂商的透传通道推送的效率各不相同,上架也比较多繁琐。iOS推送上架这一套服务很好用。
7,uniapp App.vue相关代码 直接写在onLaunch
//监听click事件,用户从消息中心点击触发的 plus.push.addEventListener( 'click', function(msg) { //根据payload传递过来的数据,打开一个详情 var payload = msg.payload; if (payload) { // payload 按照规范是 Object,但实际推送过来有可能是 String,需要多一步处理; if (typeof payload === 'string') { payload = JSON.parse(payload); } if (typeof payload === 'object') { if (payload.url) { setTimeout(function(res) { uni.navigateTo({ url: payload.url }); }, 1000); } } } }, false );
//监听receive事件 plus.push.addEventListener( 'receive', function(msg) { if (plus.os.name != 'iOS') { plus.push.createMessage(msg.title, msg.payload); } //根据payload传递过来的数据,打开一个详情 var payload; if (msg.payload) { //如透传消息不符合格式,则“payload”属性为string类型 //这里的示例以json字符串去解析,实际上也可以做字符串匹配 if (typeof msg.payload == 'string') { try { payload = JSON.parse(msg.payload); } catch (error) {} } else if (typeof msg.payload == 'object') { //iOS应用正处于前台运行时收到推送,也触发receive事件,此时payload为json对象 plus.push.createMessage(msg.title, msg.content); } } }, false );