iOS及Android消息推送方案安装使用入门

标签: Apple&iPhone相关 Google&Android相关 消息推送,APNS,Apple Push Notification Service,MQTT,mosquitto | 发表时间:2012-10-12 23:01 | 作者:liangchuan
出处:http://www.lewuxian.com

iOS消息推送直接使用苹果消息推送协议,服务器端采用easy apns: http://www.easyapns.com/

Android消息推送采用MQTT协议,服务器端采用mosquito+PhpMQTTClient  

  mosquito: http://mosquitto.org/

  PhpMQTTClient   : https://github.com/tokudu/PhpMQTTClient

1      iOS 消息推送

1.0 、消息推送证书生成

在apple官网分别生成消息推送的development和production证书,这里只使用development证书,假定为push.p12

1.1 、生成 easy apns 所需要的 pem 格式的证书

         openssl pkcs12 -clcerts -nokeys -out cert.pem -in push.p12

         openssl pkcs12 -nocerts -out key.pem -in push.p12

         cat cert.pem key.unencrypted.pem > apns-dev-cert.pem

对production证书重复以上类似步骤,生成apns-cert.pem

1.2 easy apns 安装配置

由于easy apns使用了mysqli来连接mysql,因此记得在安装php时候在php.ini启用mysqli

1.2.1 easy apns 下载

https://github.com/manifestinteractive/easyapns下载easy apns代码

         unzip manifestinteractive-easyapns-6f5731a.zip

1.2.2 easy apns 数据库初始化

创建数据库apns

用manifestinteractive-easyapns-6f5731a/manifestinteractive-easyapns-6f5731a/src/sql/apns.sql建立所需要的数据库表

1.2.3 easy apns php 应用

将manifestinteractive-easyapns-6f5731a/manifestinteractive-easyapns-6f5731a/src/php下的代码拷贝到服务器对应的目录下,假设为/var/www/html/apns

将1.1生成的apns-dev-cert.pem 和apns-cert.pem 拷贝到/var/www/html/apns下

修改classes/class_APNS.php如下参数:

                           private $logPath = ‘/var/www/html/apns/apns.log’;

       private $certificate = ‘/var/www/html/apns/apns-cert.pem’;

       private $sandboxCertificate = ‘/var/www/html/apns/apns-dev-cert.pem’; // change this to your development certificate absolute path

将证书权限修改为644

修改apns.php如下参数

                   $db = new DbConnect(‘localhost’, ‘apnsuser’, ‘apnspassword’, ‘apnsdb’);

将localhost、apnsuser、apnspassword、apnsdb改成对应的参数

1.2.4 crontab 配置

         * * * * * nice /usr/bin/php -f /var/www/html/apns/apns.php fetch > /var/www/html/apns/apns.log 2>&1 &

1.2.5 、测试

在manifestinteractive-easyapns-6f5731a/manifestinteractive-easyapns-6f5731a/src/delegate/Delegate.m基础上,建立iPhone测试Demo程序

修改Delegate.m中的:

                 NSString *host = @" www.mywebsite.com";  //修改为指向实际消息推送的Web服务器的地址和端口

                 NSString *urlString = [NSString stringWithFormat:@" /apns.php?task=%@&appname=%@&appversion=%@&deviceuid=%@&devicetoken=%@&devicename=%@&devicemodel=%@&deviceversion=%@&pushbadge=%@&pushalert=%@&pushsound=%@", @"register", appName,appVersion, deviceUuid, deviceToken, deviceName, deviceModel, deviceSystemVersion, pushBadge, pushAlert, pushSound];

将/apns.php? 修改为easy apns实际的url访问路径,此处为:/apns/apns.php

修改samples.php

                            $db = new DbConnect(‘localhost’, ‘apnsuser’, ‘apnspassword’, ‘apnsdb’);

将localhost、apnsuser、apnspassword、apnsdb改成对应的参数

在iPhone上运行Demo程序,查看服务器数据库apns_devices表,看Demo程序是否成功注册

如果在apns_devices表中已有iPhone客户端的设备信息,则修改对应的development字段为:sandbox

运行发送消息的例子: http://ip:port/apns/samples.php,应该就会有消息推送

备注:

a 、如果要向所有已注册的设备推送消息,可以将samples.php 中的例子修改为

                            $apns->newMessage(NULL);

                            $apns->addMessageAlert(‘所有设备推送测试消息’);

                            $apns->addMessageCustom(‘acme2′, array(‘bang’, ‘whiz’));

                            $apns->queueMessage();

b 、如果要支持推送表情消息,可以参考: http://www.easyapns.com/category/just-for-fun

c 、查看classes/class_APNS.php 的_fetchMessages() 可知,easy apns 缺省每次只处理100 条记录,为提高发送效率,可适当提高此参数

1.2.6 、其他问题

a 、消息大批量发送问题

目前由于APNS(Apple Push Notification Service)机制原因,目前easy apns的消息发送机制为:

对每一条发送的消息,为所有需要推送的设备都在数据库中apns_messages创建一条消息,然后通过轮训数据库表来一条一条向苹果消息推送服务器发送消息

在需要推送的设备较多的情况下,由于存在大量的网络链接,导致存在较长时间的延迟。

解决方案:

1、做批量消息推送时候,保持与苹果消息推送服务器的长链接

           2、使用批量发送机制

具体可参考: http://bit.ly/QUNRJ6

You should also retain connections with APNs across multiple notifications. APNs may consider connections that are rapidly and repeatedly established and torn down as a denial-of-service attack. Upon error, APNs closes the connection on which the error occurred.

As a provider, you are responsible for the following aspects of push notifications:

    You must compose the notification payload (see “The Notification Payload”).

    You are responsible for supplying the badge number to be displayed on the application icon.

    You should regularly connect with the feedback web server and fetch the current list of those devices that have repeatedly reported failed-delivery attempts. Then you should cease sending notifications to the devices associated with those applications. See “The Feedback Service” for more information.

b 、数据库轮询效率问题

由于目前easy apns是采用数据库轮询的方式来进行消息推送,效率并不高,后期可以修改为Redis这样的NOSQL方案

1.3 、参考文档:

http://1j2.com/tutorial-implementing-push-notifications-with-easy-apns/

2 Android 消息推送

         MQTT服务器采用mosquito  http://mosquitto.org/

         PHP管理包采用phpmqttclient: https://github.com/tokudu/PhpMQTTClient

2.1 mosquito 安装

         cd /etc/yum.repos.d

         wget http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-5/home:oojah:mqtt.repo

         yum update

         yum install mosquitto

2.2 mosquito 命令行使用

         mosquito安装主要包含三个部分:

                   mosquitto mosquitto服务器主程序,实现了MQTT协议

                   mosquitto_pub mosquitto发布消息的命令行程序

                   mosquitto_sub mosquitto订阅消息的命令行程序

启动mosquitto在前台运行

                   mosquitto

启动mosquitto在后台运行

                   mosquitto -d

启动订阅:

                   mosquitto_sub -t hello/world //订阅topic为hello/world的消息,使用默认地址和端口1883

发布消息

                   mosquitto_pub -t hello/world -m "hello,world" //发布topic 为hello/world的消息 "hello,world"

更多mosquitto命令可以参考

http://mosquitto.org/documentation/

2.3 PhpMQTTClient 安装

2.3.1 、从 https://github.com/tokudu/PhpMQTTClient下载

将tokudu-PhpMQTTClient-ba4e494/tokudu-PhpMQTTClient-ba4e494拷贝到服务器对应目录下

假设为/var/www/html/mqtt,可以通过 http://host:port/mqtt访问phpmqttclient

2.3.2 、将 index.php $result = $conn->connect(SAM_MQTT, array(SAM_HOST => ’127.0.0.1′, SAM_PORT => 1883));   修改为

                   $result = $conn->connect(SAM_MQTT, array(‘SAM_HOST’ => ’127.0.0.1′, ‘SAM_PORT’ => 1883));   

备注:如果phpmqttclient的http服务器与mosquitto没有安装在同一台服务器,注意将index.php中的127.0.0.1和send_mqtt.php修改成mosquitto的ip地址

2.3.3 、将 SAM/MQTT/sam_mqtt.php SAM_PORT SAM_HOST 也都加上

    if ($options['SAM_PORT'] == ”) {

        $this->port = 1883;

    } else {

        $this->port = $options['SAM_PORT'];

    }

    if ($options['SAM_HOST'] == ”) {

        $this->host = ‘localhost’;

    } else {

        $this->host = $options['SAM_HOST'];

2.3.4 、服务器测试,测试 PhpMQTTClient 安装成功

启动mosquitto在前台运行,以方便获取连接客户端的信息

                           mosquitto

在服务器另外一终端上启动订阅消息的进程,订阅所有tokudu开头topic

                            mosquitto_sub  –t  tokudu /+

注意,此处之所以要使用tokudu,可以看index.php的182行          var target = ‘tokudu/’ + $(‘#messageTarget’).val(); 

在mosquitto的终端获得mosquitto_sub客户端的id

                            1350006978: New client connected from 127.0.0.1 as mosqsub/8491-localhost..

访问 http://host:port/mqtt ,push notification target字段填写8491-localhost,push notification text填写需要推送的测试消息

在在mosquitto的终端查看是否收到了推送的消息,如果收到,说明phpmqttclient已经安装配置成功

2.3.5 android Demo 程序安装

https://github.com/tokudu/AndroidPushNotificationsDemo 下载Android客户端例子,安装到Android,启动后获取客户端的Device Target

2.3.6 、先客户端推送消息

访问 http://host:port/mqtt ,push notification target字段填写Android客户端的Device Target,push notification text填写需要推送的测试消息

2.4 、问题

1、 需要在客户端增加向服务器端上报Device Target的通信报文,服务器端获取客户端的设备信息后存入到数据库中。需要发送消息时候从设备信息表中获取Device Target,然后调用推送接口发送消息,可参考send_mqtt.php

2、 消息队列的持久化及轮询机制,初期可存放到数据库中(参考easy apns),后期放到NOSQL数据库中。需要程序轮询消息队列,获取mosquitto消息队列状态、对未成功发送的消息重试等

3、大批量消息推送:可能的瓶颈应该主要在mosquitto的处理性能 ,由于是使用C++写的,性能应该可以支撑需要,可以先通过调整mosquitto.conf参数来优化mosquitto的性能。

4、除了MQTT+Mosquitto外,Apache ActiveMQ/Apollo+MQTT也是值得考虑的方案,ActiveMQ 5.6开始也支持MQTT协议了

5、之所以选择MQTT而非XMPP协议,可以参考 http://slidesha.re/PrXJvb,值得注意的Facebook Messenger也采用了MQTT协议。有空再单独写一篇关于移动终端消息推送整体架构及选型的方案

2.5 、参考文档

http://tokudu.com/2010/how-to-implement-push-notifications-for-android/

http://mqtt.org/wiki/

http://ceit.uq.edu.au/content/installing-mosquitto-under-centos

 

相关 [ios android 消息] 推荐:

iOS及Android消息推送方案安装使用入门

- - 乐无线-无线互联网观察
iOS消息推送直接使用苹果消息推送协议,服务器端采用easy apns: http://www.easyapns.com/. Android消息推送采用MQTT协议,服务器端采用mosquito+PhpMQTTClient  . 1 、      iOS 消息推送. 1.0 、消息推送证书生成.

ios消息推送 - Gen_0

- - 博客园_首页
      iOS的消息推送(推送通知)有两种,一种是本地推送通知,另一种是远程推送通知. 所谓本地推送通知就是使用代码推送消到用户设备中提醒用户一些信息,推送形式请查看手机设置. 远程推送通知是通过服务器发送消息到用户设备中,iOS到消息推送要经过苹果的服务器来推送消息,过程比较麻烦. 下面是个人学习笔记,只提供新手学习(当然我也是个新手),不能用于商业用途.

MIUI评测:iOS身,Android心

- gaochao - 互联网的那点事
百度要推出自己的移动操作系统,江湖传闻叫“秋实”. 我们这里老调重弹,回过头温习一下同样基于Android的人气很高的MIUI. MIUI是一款很养眼的Android ROM,借鉴了大量的iOS审美元素. 如果你怀念或向往iOS的外观和感觉,MIUI绝对是不二之选. 以下是笔者在HTC Desire上运行MIUI的体验报告.

客觀評 Android、iOS、WP7

- chitsaou - Trawler Computer, FM207.NET
半年多前,我曾經評價過 Android 和 iOS 的市場發展,雖然發展至今,文章內容可見反映過去,但未來卻變得不可預料. 一年多前,Android 並未像現在這樣熱起來,所以我覺得,盲目支持 iPhone 的一群「果粉」,他們很愚蠢,但時至今日,支持 Android 陣營的用家似乎更盲目. 故此,希望能以客觀的角度分析一下各移動操作系統的利與弊,同時希望各位不要盲目喜歡自己的手機,要多加以分析,以下逐點評論.

【Android】消息机制原理

- - CSDN博客推荐文章
Android 消息机制涉及到的类主要有. 下面结合 Android API 22 的源码分析上面几个类的内部实现细节,以窥探其中的原理一二. Looper 是一个循环处理消息的类,Looper内部维护一个消息队列,循环的从消息队列中取出消息并处理,如果队列为空则等待新消息. Looper 必须关联到某个线程中,这样其才能获得操作系统的调度而执行消息循环处理,默认情况下,通过 Thread 类创建的线程是没有 Looper 的,如果需要该线程拥有消息循环的功能,需要像下面这样在 Runnable 接口实现方法 run() 中创建Looper.

iOS 7已占iOS系统60%,Android相形见绌

- - 互联网的一些事-关注互联网产品管理,交流产品设计、用户体验心得
  现在已经有几亿的iPhone、iPad和iPod touch设备被用户使用,而用户们最近的一个一致举动,莫过于安装iOS 7了. 在上个星期三,苹果发布了其最新的移动操作系统iOS 7,而截至9月23日,iOS 7的安装率已经达到了60%. 根据网络公司的数据显示,在9月19日这个数字已接近了40%,而到这周一中午,iOS 7的装机率已经达到了60%.

如何在iOS与Android间移植APP

- plidezus - 雪鸮的啁啾
除了像”I am rich”这种定点打击苹果烧包族的APP外,大多数应用都会尽量覆盖包含尽可能多的用户. 这就需要考虑在iOS和Android两种主流操作系统间移植的问题. 如果为各个平台量身定做界面,就能让用户利用以往的使用习惯快速学习. 但为多个平台设计各异的界面毕竟是需要工作量的. 如何才能在跨平台移植的时候只做那些最有必要的工作呢.

LibreOffice将发展Web、iOS和Android版本

- Heng Yang - cnBeta.COM
OpenOffice.org的分支项目LibreOffice的开发方The Document Foundation今天宣布将尝试在Web浏览器和iOS、Android移动设备上运行这一办公软件,预计这些产品将在2012年年底到2013年初正式发布.

Android 4.0和iOS 5功能对比

- 介潤 - cnBeta.COM
Google今早在香港举办Android 4.0发布会,在发布会中Google介绍了新一代操作系统的不少功能,并发布了首款搭载Adnroid 4.0的手机三星Galaxy Nexus. Android 4.0与其竞争对手iOS 5相比会如何呢,下面让我们来看看这两个系统的功能对比图表.