zoukankan      html  css  js  c++  java
  • 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
            );
  • 相关阅读:
    【科普】.NET 泛型
    吐槽,青岛科技大学真他妈操蛋
    c# 数组和集合精讲
    c# System.Text.Json 精讲
    .NET 5的System.Text.Json的JsonDocument类讲解
    c#中Array,ArrayList 与List<T>的区别、共性与转换
    代码是怎么运行的?
    .NET6使用DOCFX根据注释自动生成开发文档
    spring通过注解注册bean的方式+spring生命周期
    莫比乌斯反演
  • 原文地址:https://www.cnblogs.com/alannever/p/12717382.html
Copyright © 2011-2022 走看看