推送_极光推送广播推送与单个设备推送 - CSDN
  • push(实现消息推送

    2020-07-30 23:32:24
    实现了服务器向客户端推送消息,包含服务器端和客户端,本人亲测可用。
  • App消息推送的原理

    2019-04-29 16:19:44
    Android消息推送原理3.1 操作系统有自身的消息推送功能(系统级别)3.2 三种基本的推送方式:Push、Pull 和 SMS3.3 七种主流的Android消息推送方式 1. 基本概念 目的: 在用户未打开App时,App主动向用户推送...

    1. 基本概念

    • 目的: 在用户未打开App时,App主动向用户推送服务器最新消息
      在这里插入图片描述

    • 基本原理: 服务器如何先找到设备、再找到app?
      每一个设备都有一个自己的设备号,而设备中的app又都有一个唯一的包名。所以服务器只需要找到设备号与包名就可以定位到某个设备的某个应用,而这设备号与包名会一起构成一个标识符,叫做device_token,因此问题就简化为把device_token与消息内容等信息交给服务器,服务器把内容发到唯一的device_token上。

    • 作用: 功能需要,如:资讯类产品的新闻推送、工具类产品的公告推送等等;活动运营需要,如:电商类产品的促销活动;召回用户 / 提高活跃度等等。

    2. iOS和Android消息推送原理对比

    iOS 的消息推送机制面世之时是一种全新的解决方案(堪称平台中的平台),应用本身不能有常驻的后台进程,系统的开销少,内存使用更少,电量也更少(把更多的运算和资源开销放在云端,非设备端)。而 Android 的特点,虽然开销大,优点是更稳定快速,但不明显。

    (更多请参见以下文章:《移动端IM实践:谷歌消息推送服务(GCM)研究(来自微信)》《Android端做消息推送有没有比较好的方案?》《为何微信、QQ这样的IM工具不使用GCM服务推送消息?》,以及即时通讯网精选的《推送技术好文专辑》

    2.1 iOS

    2.1.1 基本原理

    iOS 系统的推送(APNS,即 Apple Push Notification Service)依托一个或几个系统常驻进程运作,是全局的(接管所有应用的消息推送),所以可看作是独立于应用之外,而且是设备和苹果服务器之间的通讯,而非应用的提供商服务器。
    在这里插入图片描述
    iOS的推送是通过苹果自己的APNs服务进行的,用户需要将device_token以及消息内容等推送信息交给APNs服务器,剩下的均由苹果自己来完成。iOS应用的推送大部分情况下都要依赖苹果生态提供的APNs(Apple Push Notification Service)服务。
    在这里插入图片描述

    1. 首先,作为设备标识的device-token是由APNs颁发的,App开发者或者第三方推送平台(图中的Provider)做的工作是收集这个device-token,APNs的推送是要求基于APNs颁发的device-token来推送的。只有正确的device-token会被APNs接受,如果是一个错误的、或者无效的device-token(比如App已经卸载了),APNs就不会接受。
    2. 接着,开发者使用第三方推送平台(图中的Provider)在将推送内容与范围选定之后进行推送,第三方推送平台将信息提交给APNs,剩下的操作全部都由APNs来进行完成,整个过程第三方推送平台就不能控制了

      例如,腾讯 QQ 的服务器(Provider)会给苹果公司对应的服务器(APNs)发出通知,然后再中转传送到你的设备(Devices)之上。当你接收到通知,打开应用,才开始从腾讯服务器接收数据,跟你之前看到通知里内容一样,但却是经由两个不同的通道而来

    2.1.2 优劣势

    所以, iOS 的推送,可以不严谨的理解为:
    1)苹果服务器朝手机后台挂的一个 IM 服务程序发送的消息;
    2)系统根据该 IM 消息识别告诉哪个 Apps 具体发生了什么事;
    3)系统分别通知这些 Apps ;
    他们带给用户的好处是实实在在的:
    1)安全:只有登录过的开发者可以通过苹果的服务器推送;
    2)快速、稳定、可靠:苹果掌控推送服务器和 OS ;
    3)更省电;
    4)让整个系统的体验更统一和简单:不会出现杀后台这种脑残事。(不用大量 Apps / Apps 的服务为了推送挂后台)。也不会出现 Apps 被杀就收不到推送这种脑残事(早一点的新浪微博 Android 版仍然如此);
    5)开发容易:当然,开发者还是要做些事情,比如维护个服务器什么的。但是复杂度无疑降低很多了。

    2.2 Android

    而 Android,就不同,更像是传统桌面电脑系统做法。每个需要后台推送的应用有各自的单独后台进程,才能和各自的服务器通讯,交换数据。另外其实 Android 也有类似 APNS 的 GCM(Google Cloud Message),属于开发者可选,非强制。

    2.2.1 基本原理

    Android平台在不使用GCM的情况下就需要将自己的服务器或是第三方推送服务提供商的服务器与设备建立一条长连接,通过长连接进行推送。
    在这里插入图片描述
    开发者通过第三方推送服务提供商将信息直接下发给需要的设备,第三方推送服务提供商与设备建立一条长连接通道,并且将消息路由到APP中(图中的设备1与设备2),对于像设备3这种无网络连接或是没有成功建立长连接通道的设备,会在设备3连网且推送消息没有过期的情况下自动收到由第三方推送服务提供商推送过来的消息,保证消息不会丢失。

    但是不建议自己设置服务器实现推送功能。
    一是因为成本太高(开发成本、维护成本),自己搭建的服务器无论是稳定性还是速度上都比不了第三方推送服务提供商的效果;
    另一个是因为自己的数据量较小,使用第三方推送服务提供商可以用他们的维度进行推送,实现精准推送。

    2.2.2 优劣势

    Apps 挂后台一直是 Android 引以为豪的特性,挂后台等待推送就成为技术选择;
    但是,没人真正为用户的电池负责。Apps 的开发者不会站在系统层面考虑的。他会假设其他 Apps 没有那么“不自觉”;
    优点在于 ,因为整个技术方案非强制, Android 的 Apps 在接收到推送后的表现更为灵活。像 Line 的 Android 版本可以在推送通知的 Popup 上直接回复, iOS 就需要越狱才能做到了。

    3. Android消息推送原理

    3.1 操作系统有自身的消息推送功能(系统级别)

    • 系统级别:任何时候都可以推送给用户,且不会被系统杀死
    • Android的消息推送服务称为:C2DM(Cloud to Device Messaging)

    3.2 三种基本的推送方式:Push、Pull 和 SMS

    • 本质: App将服务器更新的信息推送给用户,即App获取服务器信息,再推送给用户
    • App从服务器获取最新消息的基本方式(原理)有3种:Push、Pull 和 SMS
      在这里插入图片描述

    3.2.1 轮询(Pull)方式

    应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。

    要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池

    3.2.2持久连接(Push)方式

    这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。IOS平台的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过刚才也讲了,这个方案存在着很多的不足之处,就是我们很难在手机上实现一个可靠的服务,目前也无法与IOS平台的推送功能相比。

    3.2.3 SMS(Push)方式

    在Android平台上,可以通过拦截SMS消息并且解析消息内容来了解服务器的意图,并获取其显示内容进行处理。

    优势: 可以实现完全的实时操作。
    劣势:成本相对比较高,需要向移动公司缴纳相应的费用。我们目前很难找到免费的短消息发送网关来实现这种方案。

    3.3 七种主流的Android消息推送方式

    **Original Link:**https://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378971.html
    在这里插入图片描述

    展开全文
  • 现在app基本都有推送的功能,于是看了下百度云的推送,官方文档和Demo都很到位,记录下使用过程,目标是利用百度云推送最为服务器写个及时通讯的例子~当然了,这是第一篇入门~ 1、第一步就是在百度开发者服务管理中...

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/27231237

    现在app基本都有推送的功能,于是看了下百度云的推送,官方文档和Demo都很到位,记录下使用过程,目标是利用百度云推送最为服务器写个及时通讯的例子~当然了,这是第一篇入门~

    1、第一步就是在百度开发者服务管理中创建项目,然后拿到API key , Secret Key ;这个过程就不多说了,上官网直接申请就行,不复杂。


    2、下载云推送的客户端SDK,SDK的压缩文件中包含一个例子代码,一个用户手册,和所需的libs和资源等(其实直接看用户手册和Demo基本就没问题了)。



    3、准备工作结束,接下来,我们就直接开始新建项目测试

    a、新建一个项目,然后把SDK中的libs中的jar和so文件夹拷贝到新建的项目中去


    b、将manifest中的application的name设置为:com.baidu.frontia.FrontiaApplication

       <application
            android:name="com.baidu.frontia.FrontiaApplication"
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >

    如果你的项目需要自定义Application,请参考用户手册中的相关配置。

    c、添加权限

     <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
        <uses-permission android:name="android.permission.WRITE_SETTINGS" />
        <uses-permission android:name="android.permission.VIBRATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    d、添加两个receiver和一个Service(注释标明了用处)

     <!-- push service start -->
            <!-- 用于接收系统消息以保证PushService正常运行 -->
            <receiver
                android:name="com.baidu.android.pushservice.PushServiceReceiver"
                android:process=":bdservice_v1" >
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                    <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
                    <action android:name="com.baidu.android.pushservice.action.media.CLICK" />
                </intent-filter>
            </receiver>
            <!-- Push服务接收客户端发送的各种请求 -->
            <!-- 注意:RegistrationReceiver 在2.1.1及之前版本有拼写失误,为RegistratonReceiver ,用新版本SDK时请更改为如下代码 -->
            <receiver
                android:name="com.baidu.android.pushservice.RegistrationReceiver"
                android:process=":bdservice_v1" >
                <intent-filter>
                    <action android:name="com.baidu.android.pushservice.action.METHOD" />
                    <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
                </intent-filter>
                <intent-filter>
                    <action android:name="android.intent.action.PACKAGE_REMOVED" />
    
                    <data android:scheme="package" />
                </intent-filter>
            </receiver>
            <!-- Push 服务 -->
            <!-- 注意:在4.0 (包含)之后的版本需加上如下所示的intent-filter action -->
            <service
                android:name="com.baidu.android.pushservice.PushService"
                android:exported="true"
                android:process=":bdservice_v1" >
                <intent-filter>
                    <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />
                </intent-filter>
            </service>
            <!-- push service end -->

    e、我们需要自己实现一个Receiver,来接收Push消息、接口调用回调以及通知点击事件。

     <receiver android:name="com.example.zhy_baiduyun_tuisong01.receiver.MyPushMessageReceiver" >
                <intent-filter>
                    <!-- 接收push消息 -->
                    <action android:name="com.baidu.android.pushservice.action.MESSAGE" />
                    <!-- 接收bind、setTags等method的返回结果 -->
                    <action android:name="com.baidu.android.pushservice.action.RECEIVE" />
                    <!-- 可选。接受通知点击事件,和通知自定义内容 -->
             		 <action android:name="com.baidu.android.pushservice.action.notification.CLICK" />
                </intent-filter>
            </receiver>

    代码:

    package com.example.zhy_baiduyun_tuisong01.receiver;
    
    import java.util.List;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.content.Context;
    import android.content.Intent;
    import android.text.TextUtils;
    import android.util.Log;
    
    import com.baidu.frontia.api.FrontiaPushMessageReceiver;
    import com.example.zhy_baiduyun_tuisong01.MainActivity;
    import com.example.zhy_baiduyun_tuisong01.util.PreUtils;
    
    /**
     * Push消息处理receiver。请编写您需要的回调函数, 一般来说: onBind是必须的,用来处理startWork返回值;
     * onMessage用来接收透传消息; onSetTags、onDelTags、onListTags是tag相关操作的回调;
     * onNotificationClicked在通知被点击时回调; onUnbind是stopWork接口的返回值回调
     * 
     * 返回值中的errorCode,解释如下: 
     *  0 - Success
     *  10001 - Network Problem
     *  30600 - Internal Server Error
     *  30601 - Method Not Allowed 
     *  30602 - Request Params Not Valid
     *  30603 - Authentication Failed 
     *  30604 - Quota Use Up Payment Required 
     *  30605 - Data Required Not Found 
     *  30606 - Request Time Expires Timeout 
     *  30607 - Channel Token Timeout 
     *  30608 - Bind Relation Not Found 
     *  30609 - Bind Number Too Many
     * 
     * 当您遇到以上返回错误时,如果解释不了您的问题,请用同一请求的返回值requestId和errorCode联系我们追查问题。
     * 
     */
    public class MyPushMessageReceiver extends FrontiaPushMessageReceiver {
        /** TAG to Log */
        public static final String TAG = MyPushMessageReceiver.class
                .getSimpleName();
    
        /**
         * 调用PushManager.startWork后,sdk将对push
         * server发起绑定请求,这个过程是异步的。绑定请求的结果通过onBind返回。 如果您需要用单播推送,需要把这里获取的channel
         * id和user id上传到应用server中,再调用server接口用channel id和user id给单个手机或者用户推送。
         * 
         * @param context
         *            BroadcastReceiver的执行Context
         * @param errorCode
         *            绑定接口返回值,0 - 成功
         * @param appid
         *            应用id。errorCode非0时为null
         * @param userId
         *            应用user id。errorCode非0时为null
         * @param channelId
         *            应用channel id。errorCode非0时为null
         * @param requestId
         *            向服务端发起的请求id。在追查问题时有用;
         * @return none
         */
        @Override
        public void onBind(Context context, int errorCode, String appid,
                String userId, String channelId, String requestId) {
            String responseString = "onBind errorCode=" + errorCode + " appid="
                    + appid + " userId=" + userId + " channelId=" + channelId
                    + " requestId=" + requestId;
            Log.e(TAG, responseString);
    
            // 绑定成功,设置已绑定flag,可以有效的减少不必要的绑定请求
            if (errorCode == 0) {
                PreUtils.bind(context);
            }
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
            updateContent(context, responseString);
        }
    
        /**
         * 接收透传消息的函数。
         * 
         * @param context
         *            上下文
         * @param message
         *            推送的消息
         * @param customContentString
         *            自定义内容,为空或者json字符串
         */
        @Override
        public void onMessage(Context context, String message,
                String customContentString) {
            String messageString = "透传消息 message=\"" + message
                    + "\" customContentString=" + customContentString;
            Log.e(TAG, messageString);
    
            // 自定义内容获取方式,mykey和myvalue对应透传消息推送时自定义内容中设置的键和值
            if (!TextUtils.isEmpty(customContentString)) {
                JSONObject customJson = null;
                try {
                    customJson = new JSONObject(customContentString);
                    String myvalue = null;
                    if (customJson.isNull("mykey")) {
                        myvalue = customJson.getString("mykey");
                    }
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
            updateContent(context, messageString);
        }
    
        
        
        /**
         * 接收通知点击的函数。注:推送通知被用户点击前,应用无法通过接口获取通知的内容。
         * 
         * @param context
         *            上下文
         * @param title
         *            推送的通知的标题
         * @param description
         *            推送的通知的描述
         * @param customContentString
         *            自定义内容,为空或者json字符串
         */
        @Override
        public void onNotificationClicked(Context context, String title,
                String description, String customContentString) {
            
        	
        	String notifyString = "通知点击 title=\"" + title + "\" description=\""
                    + description + "\" customContent=" + customContentString;
            Log.e(TAG, notifyString);
    
            // 自定义内容获取方式,mykey和myvalue对应通知推送时自定义内容中设置的键和值
            if (!TextUtils.isEmpty(customContentString)) {
                JSONObject customJson = null;
                try {
                    customJson = new JSONObject(customContentString);
                    String myvalue = null;
                    if (customJson.isNull("mykey")) {
                        myvalue = customJson.getString("mykey");
                    }
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
            updateContent(context, notifyString);
        }
    
        /**
         * setTags() 的回调函数。
         * 
         * @param context
         *            上下文
         * @param errorCode
         *            错误码。0表示某些tag已经设置成功;非0表示所有tag的设置均失败。
         * @param successTags
         *            设置成功的tag
         * @param failTags
         *            设置失败的tag
         * @param requestId
         *            分配给对云推送的请求的id
         */
        @Override
        public void onSetTags(Context context, int errorCode,
                List<String> sucessTags, List<String> failTags, String requestId) {
            String responseString = "onSetTags errorCode=" + errorCode
                    + " sucessTags=" + sucessTags + " failTags=" + failTags
                    + " requestId=" + requestId;
            Log.e(TAG, responseString);
    
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
            updateContent(context, responseString);
        }
    
        /**
         * delTags() 的回调函数。
         * 
         * @param context
         *            上下文
         * @param errorCode
         *            错误码。0表示某些tag已经删除成功;非0表示所有tag均删除失败。
         * @param successTags
         *            成功删除的tag
         * @param failTags
         *            删除失败的tag
         * @param requestId
         *            分配给对云推送的请求的id
         */
        @Override
        public void onDelTags(Context context, int errorCode,
                List<String> sucessTags, List<String> failTags, String requestId) {
            String responseString = "onDelTags errorCode=" + errorCode
                    + " sucessTags=" + sucessTags + " failTags=" + failTags
                    + " requestId=" + requestId;
            Log.e(TAG, responseString);
    
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
            updateContent(context, responseString);
        }
    
        /**
         * listTags() 的回调函数。
         * 
         * @param context
         *            上下文
         * @param errorCode
         *            错误码。0表示列举tag成功;非0表示失败。
         * @param tags
         *            当前应用设置的所有tag。
         * @param requestId
         *            分配给对云推送的请求的id
         */
        @Override
        public void onListTags(Context context, int errorCode, List<String> tags,
                String requestId) {
            String responseString = "onListTags errorCode=" + errorCode + " tags="
                    + tags;
            Log.e(TAG, responseString);
    
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
            updateContent(context, responseString);
        }
    
        /**
         * PushManager.stopWork() 的回调函数。
         * 
         * @param context
         *            上下文
         * @param errorCode
         *            错误码。0表示从云推送解绑定成功;非0表示失败。
         * @param requestId
         *            分配给对云推送的请求的id
         */
        @Override
        public void onUnbind(Context context, int errorCode, String requestId) {
            String responseString = "onUnbind errorCode=" + errorCode
                    + " requestId = " + requestId;
            Log.e(TAG, responseString);
    
            // 解绑定成功,设置未绑定flag,
            if (errorCode == 0) {
                PreUtils.unbind(context);
            }
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
            updateContent(context, responseString);
        }
    
        private void updateContent(Context context, String content) {
            Log.e(TAG, "updateContent");
            //String logText = "" + Utils.logStringCache;
    
    //        if (!logText.equals("")) {
    //            logText += "\n";
    //        }
    
    //        SimpleDateFormat sDateFormat = new SimpleDateFormat("HH-mm-ss");
    //        logText += sDateFormat.format(new Date()) + ": ";
    //        logText += content;
    
            //Utils.logStringCache = logText;
    
            Intent intent = new Intent();
            intent.putExtra("result", content);
            intent.setClass(context.getApplicationContext(), MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.getApplicationContext().startActivity(intent);
        }
    
    }
    

    代码是官方Demo的代码,注释特别详细,做了一点修改,每次回调的结果,我会让显示到主界面上。主Actvity:

    package com.example.zhy_baiduyun_tuisong01;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
    
    import com.baidu.android.pushservice.PushConstants;
    import com.baidu.android.pushservice.PushManager;
    import com.example.zhy_baiduyun_tuisong01.util.PreUtils;
    
    public class MainActivity extends Activity
    {
    	private TextView mTextView;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		initView();
    
    		autoBindBaiduYunTuiSong();
    
    	}
    
    	private void initView()
    	{
    		mTextView = (TextView) findViewById(R.id.id_textview);
    	}
    
    	@Override
    	protected void onNewIntent(Intent intent)
    	{
    		String result = intent.getStringExtra("result");
    		if (result != null)
    		{
    			mTextView.setText(result);
    
    		}
    		// super.onNewIntent(intent);
    	}
    
    	/**
    	 * 如果没有绑定百度云,则绑定,并记录在属性文件中
    	 */
    	private void autoBindBaiduYunTuiSong()
    	{
    		if (!PreUtils.isBind(getApplicationContext()))
    		{
    			PushManager.startWork(getApplicationContext(),
    					PushConstants.LOGIN_TYPE_API_KEY,
    					"TVkKGesssSDs5q7AamLGnNCs");
    		}
    	}
    
    }
    

    最终的测试:

    1、应用安装后,如果绑定成功,主界面:


    然后在管理控制台开始分别发送通知和消息:


    2、当发送通知并点击通知:


    3、当发送消息:




    好了,都是最基本的功能,没什么技术含量就是需要点耐心,下面贴上源码,使用源码请把MainActivity里面的KEY设置成自己申请的KEY。


    源码点击下载




    展开全文
  • 第三方推送服务比较

    2019-04-23 09:51:40
    第三方推送服务比较 推送服务的四个阶段:设计——开发——推广——运维 推送方案的公认评价采取4s标准: 1.Safe(安全) 2. Stable(稳定) 3.Save(省电省流量省成本) 4.Slim(体积小) 1.Safe (安全) 推送...

    第三方推送服务比较

     

    推送服务的四个阶段:设计——开发——推广——运维

    推送方案的公认评价采取4s标准:

    1.Safe(安全) 2. Stable(稳定) 3.Save(省电省流量省成本) 4.Slim(体积小)
    1.Safe (安全)
    推送方案应支持透传及各种加密方案,保障信息传递安全。
    推送方案的ID系统应该独立于已有的网站或服务的ID系统,这样保障用户在不同手机上登录后的信息投递准确性,避免因为取消绑定事件失败因网络传输而造成的信息误投送。
    2. Stable(稳定)
    稳定包括两个部分一个是服务器端的稳定性,一个是手机端的稳定性。
    服务端稳定性,因为使用长连接方案,对服务器的开销和要求很大,推送方案对服务器开发要求很高,海量线程连接下的服务器稳定性是非常具有挑战性的。
    一般的评判标准包括:
    - 同时在线时峰值 (一般按照百万并发连接时服务器稳定性评测)
    - 高并发时消息平均延迟时间(一般按照1分钟处理1百万条信息评测)
    - 服务稳定性 (一般要求全年99.9%以上可用,有备份,有负载均衡等)
    鉴于服务器稳定的开发难度很大,小团队不建议自己开发,建议使用稳定的第三方推送方案,如个推,友盟,极光,百度云推送等。 
    手机端的稳定性,主要是因为中国的复杂网络状况及手机型号适配情况造成手机长时间稳定联网较困难,所以稳定性非常重要,一般的评判标准包括:
    - 每日联网23.5小时以上用户比例 (表征联网稳定性)
    - 消息发送后9小时内收到率 (表征到达率)
    一般来说,推送方案要做网络的分运营商,分省,分机型适配,自己开发工作量较大。
    3.Save(节省)
    省电应注意CPU休眠,一般用服务缩短待机时间百分比评判。
    省流量应注意协议的修改和冗余数据包的处理,一般用空载待机月流量评判。
    省成本应考虑单服务器承载同时连接数,可承载同时连接数越多成本越低,业内顶尖水平为个推的单服务器300万连接。
    4.Slim(体积小)

    客户端推送服务SDK应该体积尽量小,不影响主程序的大小和复杂度,一般以小于或等于300K为宜。

    以下是各第三方推送服务的参数对比:

    展开全文
  • 消息推送方案

    2018-11-09 17:20:29
    对于需要即使通知用户的业务,例如告警等,需要消息推送功能,保证通知的及时性。   应用场景需求 消息推送涉及到消息的发送和接收,即方案既要能在后端中使用,也要能在前端和移动端使用,所以需要能适配java 和...
    • 目的

    对于需要即使通知用户的业务,例如告警等,需要消息推送功能,保证通知的及时性。

     

    • 应用场景需求

    消息推送涉及到消息的发送和接收,即方案既要能在后端中使用,也要能在前端和移动端使用,所以需要能适配java 和 javaScript 语言。

     

    • 选择方案

        常规思路如下三种:

    轮询(Pull)方式:客户端定时向服务器发送询问消息,一旦服务器有变化则立即同步消息。

    推送(Push)方式:移动终端现在服务器端注册并告知关注的消息主体,服务器获得相关的消息之后,根据主体主动推送给移动终端。

    常连接方式:移动终端与服务器端保持常连接,保证消息下发的及时性。

     

    通过检索分析,选择使用push方式,并且使用MQTT协议来实现。此协议开销小,能高效地使用网络,也是物联网选择使用的一个协议。并且由于使用较多,说明资料相对来说比较丰富,便于开发使用。

    消息中转代理服务使用Apache的开源工具 ActiveMQ Artemis, 它是一个多协议消息中转服务,支持STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets。

    服务端和客户端之间通过发布和订阅方式来实现消息推送,消息的中转即通过Artemis来实现。

     

     

     

     

     

     

     

    MQTT协议针对消息传送提供三种服务质量:

    “至多一次”

    消息根据底层因特网协议网络尽最大努力进行传递。 可能会丢失消息。

    “至少一次”

    保证消息抵达,但可能会出现重复。

    “刚好一次”

    确保只收到一次消息。

    因此我们可以根据具体的业务需要来设置服务质量参数QoS,同时通过主题Topic来区分不同的业务来推送给不同的用户。

     

     

    关于中转服务器的选择,分析了三种服务器,都是开源项目,分别为Apache的 Apollo 、Artemis 还有国内的EMQ, 其中Apollo 操作虽然简洁,但是已经很久没有更新维护了,而国内的EMQ 从使用来看不如Apache的便利,并且其使用Erlang语言开发,非常规开发语言,对于后期使用维护不太方便。综合来看,Artemis的功能比较完备,并且版本一直有在更新维护,使用的是Java语言开发,遇到问题可以从开源社区寻求获取解决方案。

     

    中转消息服务器Artemis信息显示页面

    连接会话:

     

    服务器使用情况:

     

     

     

     

    • 具体使用流程

     

     

     

     

     

     

     

     

    五:参考文档

     

    1、消息中转服务Artemis 说明:

    http://activemq.apache.org/artemis/

    其开源项目代码地址:

    https://github.com/apache/activemq-artemis

     

    1. 后台Java(包括App)使用库和代码参考:

    https://github.com/eclipse/paho.mqtt.java

    https://github.com/eclipse/paho.mqtt.android

     

    1. 前台JavaScript使用库和代码参考:

    https://github.com/eclipse/paho.mqtt.javascript

    注意使用对应的库,来进行对应的调用,其JS库有两个版本:

    @namespace Paho

    @namespace Paho.MQTT

     

    1. MQTT 协议说明:

    https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

    中文翻译版本:

    https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html

     

    1. 各种代理服务

    https://github.com/mqtt/mqtt.github.io/wiki/brokers

     

    展开全文
  • 如今的手机每天都会被各种App的消息推送覆盖,消息推送也成了周末去哪儿APP增加自己曝光量的一种重要手段。消息推送的技术也日渐成熟,各种平台纷纷出现,抢占这一业务,本文就从技术角度来吐槽吐槽。本文是由我们的...
  • 个推App消息推送

    2017-09-07 10:31:33
    个推 消息推送的研究经历 注意:登记时的应用标识就是appid. 应用登记成功之后会得到APPID,APPSecret,APPkey,MasterSecret 接着就需要配置sdk了,把得到的数值填入相对应的名字里面就可以了 这些做完...
  • 2>通过Internet发送请求消息和响应消息; 3>使用端口接收和发送消息,默认为80端口;但是底层 还是使用Socket完成。...HTTP协议决定了服务器与客户端之间的连接方式,无法直接实现消息推送。 所以就有
  • 什么是消息推送

    2018-05-09 10:45:08
    推送基础移动互联网蓬勃发展的今天,大部分手机 APP 都提供了消息推送功能,如新闻客户端的热点新闻推荐,IM 工具的聊天消息提醒,电商产品促销信息,企业应用的通知和审批流程等等。推送对于提高产品活跃度、提高...
  • 消息推送架构介绍

    2019-03-18 14:11:17
    推送是在日常终端使用场景中经常碰到,特别是移动互联网普及之后,手机终端成为了消息推送的主战场,例如生活服务类的优惠券推送,咨询类的新闻推送,电商类的购物推送等等,在业务用户触达上起到了至关重要的作用,...
  • 今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:...
  • 在Android开发中,消息推送功能的使用非常常见。为了降低开发成本,使用第三方推送是现今较为流行的解决方案。 今天,我将手把手教大家如何在你的应用里集成小米推送 该文档基于小米推送官方Demo,并给出简易推送...
  • 最近需要开发微信和小程序的推送功能,需要用java后台实现推送,自己本身java和小程序都做,所以就自己动手实现下小程序的模版推送功能推送。 实现思路 1 小程序获取用户openid,收集formid传给java...
  • 什么是WebSocket? - 初次接触 WebSocket 的人,都会问同样的问题:我们...它能带来什么好处? - 答案很简单,因为 HTTP 协议有一个缺陷:***通信只能由客户端发起***,HTTP 协议做不到服务器主动向客户端推送信息。 ...
  • 消息推送在Android开发中应用的场景是越来越多了,比如说电商产品进行活动宣传、资讯类产品进行新闻推送等等,如下图: 本文将介绍Android中实现消息推送的第三方推送的详细解决方案 阅读本文前,建议先阅读我的写...
  • 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38799363 ,本文出自:【张鸿洋的博客】一直在仿微信界面,今天终于有幸利用百度云推送仿一仿微信聊天了~~~首先特别感谢:weidi1989分享的...
  • 推送是手机中非常常见的功能了。可是在实现上iOS和Andriod却有很大的差别。  因为iOS有强大的产品生态体系,APP从研发到审核上架,再到最后在手机端运行,都有严格的把关。所以推送功能在它这里实现起来比较简单。...
  • iOS 推送,删除指定推送消息 远程推送经常会出现收到重复推送的问题,或者想删除某条推送消息的问题,本文将详细说明 静默推送 在 iOS10 之后 Apple 新增了静默推送的功能,使 App 可以在收到推送之后执行一段...
  • 极光推送在众多的消息推送里,口碑算是很好的,项目中我负责的是这一块,就整理了这篇博客帮助记忆; 极光推送官方SDK文档:https://docs.jiguang.cn/jpush/server/sdk/java_sdk/ 错误码信息:...
  • 微信小程序的消息推送功能简单的说就是发送一条微信通知给用户,用户点开消息可以查看消息内容,也可以通过消息链接进入到小程序的制定页面。 微信小程序消息推送需要用户触发动作才能发送消息,比如用户提交订单、...
1 2 3 4 5 ... 20
收藏数 410,012
精华内容 164,004
关键字:

推送