成人娱乐

当前位置:葡京平台 > 成人娱乐 > Android、iOS和Windows Phone中的推送技术

Android、iOS和Windows Phone中的推送技术

来源:http://www.dvbuildingmaterials.com 作者:葡京平台 时间:2019-12-31 22:50

图片 1

     推送并非哪些新本领,这种工夫在互连网时期就已经非常火了。只是随着步向活动网络时代,推送技艺显示越发主要。因为在智能手提式无线电话机中,推送从某种程度上,能够代表使用多年的短信,并且与短信相比较,还足以向客商体现越多的消息(如图像、表格、声音等)。

大器晚成、基本功知识

听大人讲 Android 的无绳电话机是面向移动互连网的手提式有线电话机,保持24时辰在线本领充足发挥它的整整能量。而 Google也在一再提供形形色色的网络服务来诱惑客户,有的服务是一面前遭遇向终端客户,而部分服务是面向开垦者,期待开辟者能够行使 谷歌 提供的那个劳动来创制新形态的 Apps 和创制新的服务类型,当然 谷歌也会从自个儿的劳务被越来越多客商访谈来获得受益。

推送本事的贯彻常常会使用服务端向客商端推送信息的主意。也等于说客户端通过客商名、Key等ID注册到服务端后,在服务端就足以将新闻向具备活动的顾客端发送。

当大家付出供给和服务器交互作用的应用程序时,基本上都亟需获得服务器端的数量,比方《地震及时通》就必要顿时获得服务器上最新的地震消息。要博取服务器上忽左忽右时更新的新闻日常的话有二种艺术,第后生可畏种是顾客端采取Pull(拉)的法子,隔意气风发段时间就去服务器上获取新闻,看是或不是有立异的信息现身。第二种便是服务器使用Push(云端推送)的主意,当服务器端有新音讯了,则把新型的音讯Push到顾客端上。

Google I/O 二〇〇八 介绍了 Android 2.2 导入的 Android Cloud to Device Messaging (C2DM卡塔尔(قطر‎ 服务,也演示了在PC端,把浏览器正在浏览的网站恐怕在 谷歌 Maps 上固定的职责发到 Android 手提式有线电话机上,而手提式有线电电话机缘直接通过浏览器展开该网站只怕通过地图软件定位该岗位。

骨子里,在不菲活动操作系统中,官方都为其提供了推送方案,比方,谷歌(GoogleState of Qatar的云推送、IOS、Windows Phone7/8也都提供了看似的推送方案。但是这一个推送方案的服务器都在海外,有局地推送服务(如Google的云推送)在国内由于一些原因不太平静,所以国内近些年涌现出了成千上万专程为国人构建的推送服务。

虽说Pull和Push二种办法都能贯彻获取服务器端更新音信的功力,然则显然来讲Push is better than pull。因为Pull方式不但浪费客商端的流量,何况更浪费电量。

前天 Chrome to Phone 已经正式发表,能够让 Android 客商在自己的 PC 和 手提式有线电话机上亲自使用该成效。而 Chrome to Phone 的审核人也公布了生龙活虎篇本领小说,介绍了C2DM 服务的局地细节。

正文将从种种流行移动操作系统动手介绍推送技巧的各个达成情势。当然,大家的显要指标是探究Android的推送技巧。

Android从2.2版本开头加多了Cloud to Device Messaging(C2DM)框架,在系统中帮衬了Push功用,基于Android平台采取Push作用越来越简便易行了。纵然C2dm如今还处于实验室阶段,可是小框框的运用是尚未难点的。

Dave Burke

大器晚成、iOS的推送技艺

下边大家就来体会一下Android的C2dm作用。

翻译正文:

Apple为IOS提供了很周到的推送方案,其基本原理是Apple提供了友好的推送服务器,叫APNS(Apple Push Notification Service,苹果推送文告服务器)。而客商端设备(IPhone、IPad等)直接与APNS建构长连接。可是向客商端设备发送的音信并不是由APNS产生的,而是在须求发送消息的顾客自身提供的服务器(称为Provider)中发生的,然后Provider将消息传送给APNS,最终由APNS将音信传送给客户端设备。约等于说,音信最开首由Provider发生,然后Provider将新闻传送给APNS,最后再由APNS传送给客商端设备。音讯传递的进程如图1所示。

二、C2DM框架

Android Cloud to Device Messaging (C2DM卡塔尔 作为 Android 2.2 的风流倜傥有个别已经揭露了。C2DM 允许第三方开垦者开辟有关的利用来推送少些多少音信到顾客的无绳电话机上。C2DM 创设了叁个了不起的机会,允许我们使用八种 谷歌开垦工具来创设风姿洒脱种简易但异常实用的行使类型。客户能够接纳该类型的使用把五颜六色的新闻从他们的台机只怕笔电直接push 到作者的无绳电话机上。来自 Google 四分之一 工时的三个实验性项目 Chrome to Phone 演示了那体系型的施用。

图片 2

应用Android的C2DM功能有多少个要求:

Chrome to Phone 富含了多少个 Chrome Extension,三个 Android Application,和二个 谷歌(Google卡塔尔 AppEngine 服务器。全体的代码都以开源的,可供别的开辟者参照他事他说加以考察怎么样利用 C2DM。

图1

  1. 内需Android2.2及以上的连串版本。
  2. 使用C2DM作用的Android设备上急需设置好谷歌(Google卡塔尔国的账户。
    3. 亟需在这里地登记使用C2DM成效的客户邮箱账号(最棒为C2DM单独登记两个Gmail邮箱账号)。

Chrome to Phone 的音讯流是三个很独立的推送服务:

在出殡和下葬消息到顾客端设备采纳到消息的进度中,始终伴随那二个令牌的传递(device token)。要想利用APNS提供音信服务,应用程序必要先向IOS注册需求提供的多少个须求的音信正是与当下设施有关的device token,IOS在吸收接纳到devicetoken后,会向APNS查询那一个device token是不是在APNS上注册了(全部的IOS设备在率先次选择时都亟待向苹果服务器注册多少个账号,否则不可能从AppleStore下载应用,当然更力不能支利用推送服务了),假设已经登记,APNS会直接向应用程序再次回到那个devicetoken。应用程序获得这一个devicetoken后,表示APNS已经允许向友好推送音讯了,接着还亟需将该device token发送给推送服务器(Provider)。到此地应用程序已经打响将团结注册到APNS中了。以往就可以通过Provider爆发要推送的新闻,然后Provider会将音信发送给APNS服务器,最终APNS服务器会直接向应用程序发送新闻。这么些历程比较复杂,可是看一下图2的陈述就能够对那生龙活虎进度更是领悟了。每三个流水线描述后边的数字代表发送的岁月先后顺序。

接下去大家来看下C2dm的完整进度,这里借用一下谷歌官方推出的Chrome To Phone进度图来证实下。

客户采用 Android App 在 C2DM 服务器上登记,拿到三个配备注册 ID,这一个 ID 跟客商的 谷歌(GoogleState of Qatar 帐号绑定在一起,並且由 AppEngine server 来保障。 AppEngine server 在认证客商账号的合法性后记录下客商账号跟客商 C2DM 装置注册 ID 之间的投射关系。

图片 3

图片 4
图1 C2DM操作进程图

Chrome Extension 得到浏览器当前拜见的网站和标题后,把它们发送到 AppEngine server。 AppEngine server 验证当前登陆的 Google客商账号后,通过该账号查找到相应的 C2DM 器具注册 ID。然后经过 HTTP 把 U宝马7系L 和标题发送到 Google 的C2DM 服务器。客户手提式有线电话机上的Android 系统会平昔监听来自 C2DM 服务器的推送音讯,当 C2DM 服务器收到到 AppEngine server 发送过来的音信,并且那一个音讯是发送到顾客手提式有线电话机所绑定的 C2DM 设备注册ID 时,就可以发送给客户手机,而手提式有线电话机上 Android 系统接到音信后则会倡导七个 Intent broadcast,接着跟该 Intent 对应的 Android App 被激活,再把这几个 Intent 转变到相应的新 Intent 并路由到别的Apps 上边去。

图2

要使用C2DM来开展Push操作,基本上要利用以下6个步骤:

,服务器只发送轻松的推送新闻来激活手提式有线话机上的 App,然后 App 再拜访服务器获得额外的数据。

二、Windows Phone的推送技艺

1、注册:Android设备把施用C2DM成效的顾客账户(比方android.c2dm.demo@gmail.com)和App名称发送给C2DM服务器。

Chrome to Phone 的代码能够在网络找到。 AppEngine 和 Android App 代码都包蕴了四个可选择的包 com.google.android.c2dm 用于拍卖底层的 C2DM 人机联作事务 (例如配置,职分队列处理等卡塔尔国。

微软为Window Phone提供的推送方案与IOS相像,也要求和谐希图推送服务器(能够称呼Cloud Service)。只是意味着设备的ID产生了Uri。在Window Phone中有三个Push Client Service(PCS)。全部须要推送服务的应用程序都急需与Push Client 瑟维Stone信。下边是Window Phone推送的为主步骤,读者能够与图3对照来看那后生可畏进度。

2、C2dm服务器会回来一个registration_id值给Android设备,设备亟需保留那几个registration_id值。

Chrome to Phone 提供了实用的信守,可是它最有趣的地点是留意提供了什么样运用 Android C2DM 服务的事必躬亲。

第1步:应用程序会向Push Client Service伏乞七个Push Notification UEvoqueI(①)。

3、Android设备把收获的registration_id和C2DM成效的客户账户(android.c2dm.demo@gmail.com)发送给自个儿的服务器,可是貌似顾客账户消息因为和服务器分明好的,所以无需发送。

译后语:谷歌(Google卡塔尔国 的 Android C2DM 服务能够像 LBS 相似催生出意气风发多级新的选用场目吗?利用从云端的服务器往手提式有线电话机推送新闻的职能,让手提式有线电话机跟互联网上的任何机器,包罗服务器,客户本人的PC等更严密的关联在一起,的确提供了多少个智能设备跟移动互连网之间怎么无缝对接的一个表率。

第2步:如若当前Window Phone设备已经在微软服务器注册了,Push Client Service会从MPNS(Microsoft Push Notification Service,微软推送布告服务)获取Push Notification U本田CR-VI,并赶回给应用程序,表示推送服务可用(②和③)。

那样Android设备就完了了C2DM成效的注册进程,接下去就能够选拔C2DM服务器Push过来的消息了。

读者您是什么对待 Android C2DM 如此的劳动吗?迎接留言。

第3步:应用程序必要将Push Notification U奥德赛I发送给自个儿的推送服务器(Cloud Service)(④)。

4、服务器得到多少。这里图中的例子Chrome To Phone,服务器收到到Chrome浏览器发送的数额。数据也能够是服务器本地发生的。这里的服务器是谷歌(Google卡塔尔AppEngine(很好的大器晚成项服务,可惜在境内被屏了),要换来团结的服务器。服务器还要得到注册使用C2DM作用的顾客账户(android.c2dm.demo@gmail.com)的ClientLogin权限Auth。

Via Android Developers谷安谷奥Android专项论题站 []

第4步:如若急需推送消息,Cloud Service会将音讯发送到MPNS,然后MPNS会将消息发送给Push Client Service,最后由Push Client Service将音信传送给应用程序(⑤、⑥和③)。

5、服务器把要发送的数码和registration_id一齐,况兼底部带上获取的Auth,使用POST的艺术发送给C2dm服务器。

图片 5

6、C2DM服务器会以Push的办法把多少发送给对应的Android设备,Android设备只要在程序中按事前和服务器商讨好的格式从对应的key中获取数据就可以。

图3

这么大家就大致知道了C2dm的行事流程,上边大家就结成一个实例来具体的验证上述6个步骤。

三、Android的推送方案

三.实例开辟

Android的推送方案就超级多了,也比较乱。比方,有谷歌(Google卡塔尔国官方提供的C2DM(Android Cloud to Device Messaging);第三方的推送服务(如极光推送);还会有通过各样协商落到实处的推送服务端程序(如AndroidPN),客户通过那一个服务端程序能够搭建本身的推送服务器。那一个推送本精晓在本节背后的意气风发对详细介绍,本节先来介绍一下Android中时时使用的各个推送才具。当然,那个推送技艺也能用来其余的移动设备,但鉴于Android的官方推送服务(C2DM)在本国使用上有一点主题素材,所以基于Android的第三方推送服务较别的系统多,因而这里关键针对Android来介绍。

我们要创设的前后相继名叫AndroidC2DM德姆o,包名称为com.ichliebephone.c2dm。

不认为奇推送技术会利用如下三种艺术达成。

千帆竞发以前咱们先去C2DM网页上登记一下应用C2DM功用的客商账户。

  1. 轮询(Pull)方式

  2. 慎始而敬终连接格局(服务端Push方式)

图片 6
图2 应用程序名

轮询方式正是顾客端以自然的时刻间距不断询问服务端是不是有新的消息。这种形式必得本人完结与服务器之间的通讯机制,举个例子音信队列等。而且还要考虑轮询的效率,假如太慢恐怕产生一些音讯的推迟,假设太快,则会大方消耗互连网带宽和电池。所以超越二分一推送服务都不会利用轮询形式。

内部应用程序名要填写带包名的生机勃勃体化名称,举个例子此处为om.ichliebephone.c2dm. AndroidC2DMDemo。

自始至终连接情势也正是Push方式,对于客户端的话,是意气风发种被动的主意,而决策的权利在服务端,当有音讯时,服务端会向全部注册到推送服务器的客商端推送新闻。这种推送方式的益处是足以确认保证实时性,何况客商端实现轻便。当然,也可以有欠缺,比如,即便大气的客商端与服务端保持长连接时,会花销服务器的财富。可是在未推送新闻时,这几个长连接就成 了没事连接,平日这种连接主要消耗的是内部存款和储蓄器能源。比如,200万客商或然会消耗数十GB的内部存款和储蓄器。由此搭建这种推送机制时要使用质量好的服务器。

图片 7
图3 C2DM客商账户注册

锲而不舍连接的落到实处有无数主意,比如,能够运用XMPP作为通讯公约。XMPP的首要性优势是协商成熟、强盛,可扩大性强。XMPP越多地用来IM系统中,前面要介绍的AndroidPN也是用了XMPP契约。

此地的contact邮箱使用三个您能收到到邮件的邮箱就可以,上边包车型大巴Role(sender)account邮箱最佳单独登记三个Gmail邮箱来利用C2DM服务。我们这里运用的是特意登记的android.c2dm.deno@gmail.com邮箱。

XMPP也是有猛烈的老毛病,举个例子,契约很复杂,假设吃透XMPP合同或然供给非常短日子,还应该有正是出于XMPP是基于XML的,进而招致了数额冗余、那样会导致移动设备费流量、功耗等破绽。

付出后,过生龙活虎段时间就会吸收接纳谷歌(Google卡塔尔(قطر‎发送过来的承认邮件,然后你就足以行使C2DM的Push服务了。

除此而外XMPP,还足以选拔MQTT左券,这种合同的重要优势是精练、小巧、可扩张性强,进而拉动了省流量、省电等优点,并且有C++版的服务端组件rsmb。短处是协商非常不足成熟,况且完成较复杂,而且rsmb不开源,陈设硬件的成本较高。

介绍了那般多,大家先来相当的慢完毕叁个实例,只完结Android设备端的注册部分,不带有向服务器发送registration_id和服务器向C2DM服务器发送数据的求实代码,那生机勃勃部分只是用Ubuntu下的curl命令来效仿,首要是飞快亲自体验一下Push的结果。

就算C2DM服务在境内或然不太平静或有点地带不可用,但照旧有供给介绍一下C2DM的原理。可是对于在本国使用的利用最佳应用第三方的推送服务,或和煦只要推送服务器。

始建二个Android工程AndroidC2DMDemo,并且带有进谷歌的开源例子Chrome To Phone中的c2dm包com.google.android.c2dm,包中包括五个Java类,分别为:

C2DM和IOS的APNS以致Window Phone的MPNS大同小异。还供给团结希图生机勃勃台推送服务器,并由此如下步骤达成音信的推送。

第二个类为C2DMBaseReceiver:

第1步:移动道具上的C2DM服务须求与Google官方的C2DM服务器交互作用,验证当前配备是不是在C2DM服务器上登记了,倘若已经登记,C2DM服务器会回到三个报了名ID给客商端的C2DM服务。(①和②)

package com.google.android.c2dm;

第2步:客商端的C2DM服务会与投机的推送服务器交互作用,将账号和C2DM服务器再次回到的登记ID传给推送服务器。(③)

 

第3步:要是要推送音讯,推送服务器会将登记ID和要推送的新闻头阵送到C2DM服务器,然后C2DM服务器会一贯将新闻推送给顾客端(手提式有线电话机、平板Computer的装置)(④和⑤)。

import java.io.IOException;

读者能够相比图4来驾驭那3个步骤。

import android.app.AlarmManager;

图片 8

import android.app.IntentService;

图4

import android.app.PendingIntent;

除外使用官方的推送方案外,今后境内涌现出多少个第三方的推送方案,譬喻,极光推送(JPush)、百度推送等。读者也能够用一下,那些相同的时间平常是无偿的(可能推送多媒体数据要求收取薪给)。

import android.content.Context;

 

import android.content.Intent;

 

import android.os.PowerManager;

import android.util.Log;

 

/**

 * Base class for C2D message receiver. Includes constants for the

 * strings used in the protocol.

 */

/**

 * 选取和拍卖C2DM音讯的基类

 * */

public abstract class C2DMBaseReceiver extends IntentService {

    // 和C2DM Push的Intent内容相关

    // 重新向C2DM服务器注册

    private static final String C2DM_RETRY = "com.google.android.c2dm.intent.RETRY";

    // 向C2DM服务器注册后的回调解和管理理

    public static final String REGISTRATION_CALLBACK_INTENT = "com.google.android.c2dm.intent.REGISTRATION";

    // 采取到C2DM服务器的推送音讯

    private static final String C2DM_INTENT = "com.google.android.c2dm.intent.RECEIVE";

 

    // Logging tag

    private static final String TAG = "C2DM";

 

    // Extras in the registration callback intents.

    // 向C2DM注册重返的intent中包蕴的key

    public static final String EXTRA_UNREGISTERED = "unregistered";

    public static final String EXTRA_ERROR = "error";

    public static final String EXTRA_REGISTRATION_ID = "registration_id";

    // 向C2DM注册出错的源委

    public static final String ERR_SERVICE_NOT_AVAILABLE = "SERVICE_NOT_AVAILABLE";

    public static final String ERR_ACCOUNT_MISSING = "ACCOUNT_MISSING";

    public static final String ERR_AUTHENTICATION_FAILED = "AUTHENTICATION_FAILED";

    public static final String ERR_TOO_MANY_REGISTRATIONS = "TOO_MANY_REGISTRATIONS";

    public static final String ERR_INVALID_PARAMETERS = "INVALID_PARAMETERS";

    public static final String ERR_INVALID_SENDER = "INVALID_SENDER";

    public static final String ERR_PHONE_REGISTRATION_ERROR = "PHONE_REGISTRATION_ERROR";

 

    // wakelock

    private static final String WAKELOCK_KEY = "C2DM_LIB";

 

    private static PowerManager.WakeLock mWakeLock;

    private final String senderId;

 

    /**

     * The C2DMReceiver class must create a no-arg constructor and pass the

     * sender id to be used for registration.

     */

    public C2DMBaseReceiver(String senderId) {

        // senderId is used as base name for threads, etc.

        super(senderId);

        this.senderId = senderId;

    }

 

    // 下边多少个是接到到C2DM Push过来的新闻后的回调函数,都得以在延续的子类中管理

    /**

     * Called when a cloud message has been received.

     */

    /**

     * 接纳到C2DM服务器Push的音信后的回调函数,须要在后续的子类中拍卖

     * */

    protected abstract void onMessage(Context context, Intent intent);

 

    /**

     * Called on registration error. Override to provide better error messages.

     * 

     * This is called in the context of a Service - no dialog or UI.

     */

    /**

     * 出错的回调函数

     * */

    public abstract void onError(Context context, String errorId);

 

    /**

     * Called when a registration token has been received.

     */

    /**

     * 注册后的回调函数

     * */

    public void onRegistered(Context context, String registrationId)

            throws IOException {

        // registrationId will also be saved

    }

 

    /**

     * Called when the device has been unregistered.

     */

    /**

     * 撤销注册的回调函数

     * */

    public void onUnregistered(Context context) {

    }

 

    // IntentService的方法

    @Override

    public final void onHandleIntent(Intent intent) {

        try {

            Context context = getApplicationContext();

            if (intent.getAction().equals(REGISTRATION_CALLBACK_INTENT)) {

                handleRegistration(context, intent卡塔尔;// 管理登记后的回调

            } else if (intent.getAction().equals(C2DM_INTENT)) {

                onMessage(context, intent卡塔尔国;// 管理C2DM Push音信的回调

            } else if (intent.getAction().equals(C2DM_RETRY)) {

                C2DMessaging.register(context, senderIdState of Qatar; // 重新注册

            }

        } finally {

            // Release the power lock, so phone can get back to sleep.

            // The lock is reference counted by default, so multiple

            // messages are ok.

 

            // If the onMessage() needs to spawn a thread or do something else,

            // it should use it's own lock.

            mWakeLock.release();

        }

    }

 

    /**

     * Called from the broadcast receiver. Will process the received intent,

     * call handleMessage(), registered(), etc. in background threads, with a

     * wake lock, while keeping the service alive.

     */

    static void runIntentInService(Context context, Intent intent) {

        if (mWakeLock == null) {

            // This is called from BroadcastReceiver, there is no init.

            PowerManager pm = (PowerManager) context

                    .getSystemService(Context.POWER_SERVICE);

            mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,

                    WAKELOCK_KEY);

        }

        mWakeLock.acquire();

 

        // Use a naming convention, similar with how permissions and intents are

        // used. Alternatives are introspection or an ugly use of statics.

        String receiver = context.getPackageName() + ".C2DMReceiver";

        intent.setClassName(context, receiver);

 

        context.startService(intent);

 

    }

 

    // 管理登记后的回调

    private void handleRegistration(final Context context, Intent intent) {

        final String registrationId = intent

                .getStringExtra(EXTRA_REGISTRATION_ID);

        String error = intent.getStringExtra(EXTRA_ERROR);

        String removed = intent.getStringExtra(EXTRA_UNREGISTERED);

        Log.v(TAG, "handleRegistration");

        // 打字与印刷出接纳到的registraton_id

        Log.v(TAG, "dmControl: registrationId = " + registrationId

本文由葡京平台发布于成人娱乐,转载请注明出处:Android、iOS和Windows Phone中的推送技术

关键词: