Cordova结合SignalR实现移动端消息推送

1.Cordova推送插件

1.1 安装插件

cordova plugin add cordova-plugin-local-notification

该命令执行完成后,可以通过cordova plugin list查看已安装的插件列表
这时候可以看到除了cordova-plugin-local-notification插件外,另外又多出了两个插件

cordova-plugin-device # 获取设备信息
cordova-plugin-badge # 未读消息数徽章显示

这两个插件都是cordova-plugin-local-notification必须依赖的
所以在安装cordova-plugin-local-notification时就自动安装了这里两个插件

1.2 升级安卓版本

虽然cordova-local-notificationGutHub ReadMe上说Android最低版本为4.5.1
但是在实际安装中Android版本低于6.0.0会报错

如果未安装Android系统环境,需要使用SDK Manager安装Android 6.0(API 23)
安装过可以跳过这一步。

SDK Manager

更新Cordova安卓框架

cordova platform update android@6.0.0

1.3 打包安卓安装包

安装cordova-plugin-local-notification后进行打包,会报NotificationChannel的错误
NotificationChannelAndroid 8.0引入的新特性,插件没有对低于Android 8.0的版本进行处理。

解决方法:
打开项目解决方案\platforms\android\src\de\appplant\cordova\plugin\notification\Manager.java屏蔽以下代码

// import android.app.NotificationChannel;
// import static android.os.Build.VERSION_CODES.O;
private void createDefaultChannel() {
        // NotificationManager mgr = getNotMgr();

        // if (SDK_INT < O)
        //     return;

        // NotificationChannel channel = mgr.getNotificationChannel(CHANNEL_ID);

        // if (channel != null)
        //     return;

        // channel = new NotificationChannel(
        //         CHANNEL_ID, CHANNEL_NAME, IMPORTANCE_DEFAULT);

        // mgr.createNotificationChannel(channel);
}

2.极光推送JPush

2.1 官网

极光推送JPush官网
注册后新建应用,获取AppKey

2.2 Cordova插件

jpush-phonegap-plugin

cordova plugin add jpush-phonegap-plugin --variable APP_KEY=your_jpush_appkey --save

2.3 本地通知

Android

window.JPush.addLocalNotification(0, notice, '计划审核推送', Math.random(), 0, "");

IOS

window.JPush.addLocalNotificationForIOS(0, notice, -1, "fss_" + Math.random().toString(), {});

3.SignalR服务器跨域

3.1Signal Hub

参考:SignalR实现IM和消息推送

3.2Signal设置跨域

设置允许跨域Core,同时允许使用JsonP连接

using Microsoft.AspNet.SignalR;
using Microsoft.Owin;
using Microsoft.Owin.Cors;
using Owin;

[assembly: OwinStartup(typeof(znfss.App_Start.Startup))]
namespace znfss.App_Start
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888
            //app.MapSignalR();

            // 连接标识
            app.Map("/signalr", map =>
            {
                //跨域
                map.UseCors(CorsOptions.AllowAll);
                map.RunSignalR(new HubConfiguration
                {
                    EnableJSONP = true
                });
            });

            // 在应用程序启动时运行的代码
            GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}

4.在Vue.js中使用SignalR

4.1原理

1.定义signalr_conn连接Hubs服务器地址,这里会自动连接地址下的/signalr/hubs

var signalr_conn = $.hubConnection(process.env.SIGNALR);

2.定义signalr_proxy连接对应的Hubs集线器,这里会根据HubsName连接对应的集线器

var signalr_proxy = signalr_conn.createHubProxy("NoticeHub");

3.使用signalr_proxy.on定义消息接收,注意这里的消息接收名称为HubsMethodClients方法定义的名称

signalr_proxy.on('sendNotice_callback', function(notice) {
    // 接收到消息以后的操作
    // 调用cordova-plugin-local-notification
    cordova.plugins.notification.local.schedule({
        id: Math.random(),
        title: '消息提醒',
        text: notice,
        foreground: true
    });
});

4.启动SignalR连接池,注意这里要设置JsonP: true

signalr_conn.start({ jsonp: true }).done((data) => {
    //成功
}).fail((data) => {
    //失败
});

5.在需要的地方使用signal_proxy.invoke调用Hubs服务器推送消息,注意这里的名称对应HubsMethod,在调用前判断一下signalr_proxy == undefined

function SignalR_Login(id) {
    if(this.signalr_proxy == undefined) {
        SignalR_Connect(id)
}
    else {
        console.log("SignalR Login." + id);
        this.signalr_proxy.invoke("NoticeLogin_App", id);
    }
}

4.2源码

首先安装SignalRpackage,需要注意的是SignalR依赖jQuery

npm install signalr
npm install jquery

然后在main.js中引用

import signalR from 'signalr'
import $ from 'jquery'

新建signalr_common.vue组件

<script type="text/javascript">
    // 定义一些公共的属性和方法
    // var signalr_conn;
    // var signalr_proxy;
    function SignalR_Connect(id) {
        console.log('SignalR Server Connect.');
        console.log(process.env.SIGNALR);
        window.alert(process.env.SIGNALR);
        window.alert($.hubConnection(process.env.SIGNALR));
        var signalr_conn = $.hubConnection(process.env.SIGNALR);
        var signalr_proxy = signalr_conn.createHubProxy("NoticeHub");
        signalr_proxy.on('sendNotice_callback', function(notice) {
            //收到SignalR消息提醒
            console.log(notice);
            //window.alert(notice);
            cordova.plugins.notification.local.schedule({
                id: Math.random(),
                title: '消息提醒',
                text: notice,
                foreground: true
            });
        });
        signalr_conn.start({ jsonp: true }).done((data) => {
            //成功
            console.log("SignalR Login." + id);
            window.alert("SignalR Login." + id);
            signalr_proxy.invoke("NoticeLogin_App", id);
        }).fail((data) => {
            //失败
        });
    }

    // function SignalR_Login(id) {
    //     if(this.signalr_proxy == undefined) {
    //         SignalR_Connect(id)
    //     }
    //     else {
    //         console.log("SignalR Login." + id);
    //         this.signalr_proxy.invoke("NoticeLogin_App", id);
    //     }
    // }

    // function SignalR_Logout(id) {
    //     if(this.signalr_proxy != undefined) {
    //         console.log("SignalR Logout." + id);
    //         this.signalr_proxy.invoke("NoticeLogout_App", id);
    //     }
    // }

    // 暴露出这些属性和方法
    export default {
        // signalr_conn,
        // signalr_proxy,
        SignalR_Connect,
        // SignalR_Login,
        // SignalR_Logout
    }
</script>

最后在需要使用的页面引用signalr_common组件

<script>
import signalr_common from './components/signalr_common.vue'
export default {
    create() {
        signalr_common.SignalR_Connect(id);
    }
}

</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352