C#个推SDK推送安卓+iOS

Posted AlanNever

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#个推SDK推送安卓+iOS相关的知识,希望对你有一定的参考价值。

下载个推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
        );

 

以上是关于C#个推SDK推送安卓+iOS的主要内容,如果未能解决你的问题,请参考以下文章

个推消息推送SDK通知栏铃声功能解析及使用攻略

个推消息推送SDK之“富媒体样式”功能详解

如何使用消息推送功能?

现在流行的消息推送机制是怎么实现的

hbuilder APP服务器端(C#)推送

个推消息推送SDK后效分析功能,支持推送全流程数据查看