android消息推送实现 | 友盟 徐仙明

26
Android DevCamp Produced by CSDN Website: http://devcamp.csdn.net/ Weibo: http://weibo.com/cmdnclub/

Upload: imshining-devcamp

Post on 11-May-2015

5.805 views

Category:

Technology


11 download

DESCRIPTION

安卓应用实用功能的技术实现:《Android消息推送实现》 | Android DevCamp | 7月28日 北京 主题简介:作为移动应用开发的一个重要需求,微软和苹果公司分别为iOS和Windows Phone平台应用开发者提供了很好的消息推送解决方案。实际上Google也为Android平台提供了C2DM的解决方案供开发者使用, 但是由于多方面的原因,Android开发者在国内使用C2DM有诸多困难。 对于这个普遍存在的问题,本次演讲将和大家一起探讨可能的替代方案, 如:定时请求, SMS,第三方服务,自己搭建消息服务器等方式。通过对这些方式优缺点的剖析和比较,带给开发者一些方向上的建议, 帮助开发者选择适合自身需求和条件的方案。 讲师简介:徐仙明,友盟资深安卓开发工程师,主要负责友盟交换产品SDK端开发工作。 兴趣包括:Android应用开发,移动互联网平台上的大数据分析和挖掘,机器学习, 移动平台安全性等。

TRANSCRIPT

Page 1: Android消息推送实现 | 友盟 徐仙明

Android DevCamp Produced by CSDN Website: http://devcamp.csdn.net/ Weibo: http://weibo.com/cmdnclub/

Page 2: Android消息推送实现 | 友盟 徐仙明

Android 消息推送

投石问路

徐仙明

Page 3: Android消息推送实现 | 友盟 徐仙明

是什么?

Source: http://the-gadgeteer.com/2009/10/30/day-3-android-basics-on-verizons-droid/

Page 4: Android消息推送实现 | 友盟 徐仙明

? 是什么

消息

• ⼀一段文字

• ⼀一个指令

推送

• 用户不需要主动刷新 • ⼀一种设计模式

Publish/ subscribe

例子

Page 5: Android消息推送实现 | 友盟 徐仙明

大佬们

Apple • APNS (“A” for “Apple”, not “Android”)

Google • C2DM -> Google Cloud Messaging (GCM)

Microsoft • Direct Push, Exchange ActiveSync, long lived https

RIM • Push Technology, Push Mail

Nokia • Symbian, Push mail

Page 6: Android消息推送实现 | 友盟 徐仙明

Google 的方案 – GCM for Android

Page 7: Android消息推送实现 | 友盟 徐仙明

Google Cloud Messaging

l  从C2DM (Cloud to Device Messaging)发展而来

l  参考: •  Google Cloud Messaging for Android

http://developer.android.com/guide/google/gcm/index.html •  Google IO 2012: Google Cloud Messaging for Android

https://developers.google.com/events/io/sessions/gooio2012/100/ •  Google IO 2010: Building push applications for Android

http://dl.google.com/googleio/2010/android-push-applications-android.pdf

Page 8: Android消息推送实现 | 友盟 徐仙明

GCM case study -- Chrome to Phone

Source: Google IO Chrome to Phone

Page 9: Android消息推送实现 | 友盟 徐仙明

组成

Reference: http://developer.android.com/guide/google/gcm/gcm.html

GCM Servers

Application

Server

Mobile Device

Credentials

Sender ID

Sender Auth Token

Google User Account

Registration ID

Application ID

Page 10: Android消息推送实现 | 友盟 徐仙明

GCM Service your app

1.1. app_id, sender_id

2.2. REG_ID

2.1. REG_ID

1.2. app_id, sender_id, device_id

3. REG_ID

app server

4. REG_ID, API Key, message

5.1. message

5.2. notification

Page 11: Android消息推送实现 | 友盟 徐仙明

步骤

GCM把数据推送到Android设备

Android设备只要在程序中按之前和服务器商量好的格式从对应的key中获取数据即可。

应用服务器发送数据到GCM 服务器

应用服务器把要发送的数据和registration_id以及认证发送给C2DM服务器。

发REG_ID 到应用服务器

应用把registration_id和用户标识发送到自己的服务器。

接收GCM服务器返回REG_ID

C2DM服务器会返回⼀一个registration_id值给Android设备,设备需要保存这个registration_id值。

注册

Android设备把使用C2DM功能的用户账户(比如[email protected])和App名称发送给C2DM服务器。

Page 12: Android消息推送实现 | 友盟 徐仙明

GCM 非常好 但是 …

Google Play (Android Market)

Google 账户 • 魅族, 华为等诸多国产手机

>= Froyo (2.2) • 94.6%, as of 2012/07/25

服务器在美国 • 服务不可靠 • app server 最好放在国外

Page 13: Android消息推送实现 | 友盟 徐仙明

小甜点

发送数据服务器域名SSL签名不可靠 (as of 2012/07/25) •  https://android.apis.google.com/c2dm/send

Page 14: Android消息推送实现 | 友盟 徐仙明

除了GCM

http://www.push-notification.org/

http://www.pubnub.com/

http://urbanairship.com/

http://getsocialize.com/

http://www.android-push.com/

DIY

Page 15: Android消息推送实现 | 友盟 徐仙明

DIY有多复杂?

电池容量小 • 1400mAh

高并发 • 500k

网络不稳定 • GPRS, 3G

http://developer.android.com/guide/google/gcm/adv.html#retry

Page 16: Android消息推送实现 | 友盟 徐仙明

Source: http://dl.google.com/googleio/2010/android-push-applications-android.pdf

Page 17: Android消息推送实现 | 友盟 徐仙明

DIY 几种方法 SM

S

• 实时 • 要花钱

轮询

(Po

lling

) • 实现容易 • 架构简单 • 不够实时

• 周期?机制?

• 耗电

持久连接

(Pe

rsis

tent

TCP/

IP) • 实时

• 服务进程? • 并发? • DDOS?

Page 18: Android消息推送实现 | 友盟 徐仙明

自力更生

mqtt

RSMB / masquitto

wmqtt.jar

MQTT

androidpn

OpenFire

asmack

XMPP

Page 19: Android消息推送实现 | 友盟 徐仙明

mqtt -- an experiment by Anton Lopyrev

IBM

服务器:Masquitto /

RSMB

客户端:wmqtt.jar

协议: MQTT

Topic: device id

持久 TCP • Ping to keep alive

• Wake Lock / AlarmManager

连接数量有限制

客户端无认证

Reference: http://dalelane.co.uk/blog/?p=1599 http://tokudu.com/2010/how-to-implement-push-notifications-for-android/

Page 20: Android消息推送实现 | 友盟 徐仙明

androidpn

l  开源项目 •  http://sourceforge.net/projects/androidpn/

l  OpenFire + Spring + MINA+ ASMACK +XMPP l  XMPP

•  分布式 •  安全: SASL及TLS •  开源 •  跨平台: XML

Page 21: Android消息推送实现 | 友盟 徐仙明

androidpn

androidpn

服务器:openfire

客户端:asmack

协议: XMPP

Mina: async

IO

Topic: device

id

Long Polling

Page 22: Android消息推送实现 | 友盟 徐仙明

C500k -- Urban Airship 的实验

Source: http://urbanairship.com/blog/2010/08/24/c500k-in-action-at-urban-airship/

Implementation Connections Memory Used

Java Pure NIO 512,000 + 2.5 GB

Java w/Netty 330,000 2.2 GB

Scala w/Netty 173,000 1.5 GB

Page 23: Android消息推送实现 | 友盟 徐仙明

C500k -- Urban Airship 的实验

l  Linux Kernel Tuning 64bit •  fs.file-max = 999999 •  net.ipv4.tcp_rmem = 4096 4096 16777216 •  net.ipv4.tcp_wmem = 4096 4096 16777216

l  Java NIO

Source: http://urbanairship.com/blog/2010/08/24/c500k-in-action-at-urban-airship/

Page 24: Android消息推送实现 | 友盟 徐仙明

但是, 中国还没有成熟的第三方消息推送服务提供商

Page 25: Android消息推送实现 | 友盟 徐仙明

这个太复杂了 我搞不定了

如果明天不下雨, 我去车库咖啡投个团队做这个

嗯, 看来那个码农说的没错, 没那么简单, 我们这个版本就不上推送功能了吧。

Page 26: Android消息推送实现 | 友盟 徐仙明

Thank you