您的位置:首页 > 移动开发 > IOS开发

IOS 消息推送原理及实现总结

2012-10-29 11:48 716 查看
一、消息推送原理:

在实现消息推送之前先提及几个于推送相关概念,如下图1-1:



1-1

1、 Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服务端[消息的发起者]);

2、 APNS:Apple
Push Notification Service[苹果消息推送服务器];

3、 iPhone:用来接收APNS下发下来的消息;

4、 Client
App
:IOS设备上的应用程序,用来接收iphone传递APNS下发的消息到制定的一个客户端 app[消息的最终响应者];

上图可以分为三个阶段:

阶段一:Provider[服务端]把要发送的消息,目的IOS设备标识打包,发送给APNS;

阶段二:APNS在自身的已注册Push服务的IOS设备列表中,查找有相应标识的IOS设备,并将消息发送到IOS设备;

阶段三:IOS设备把发送的消息传递给对应的应用程序,并且按照设定弹出Push通知。

具体过程,如下图1-2:



1-2

1、 [Client
App]注册消息推送;

2、 [Client
App]跟[APNS Service]要deviceToken,
Client App接收deviceToken;

3、 [Client
App]将deviceToken发送给[Provider]Push服务端程序;

4、 当Push服务端程序满足发送消息条件了,[Provider]向[APNS
Service]发送消息;

5、 [APNS
Service]将消息发送给[Client App].

消息推送实现:

1、 生成*.certSigningRequest文件,步骤如下:

[MacBookà应用程序à实用工具à钥匙串访问à证书助手à从证书机构求证书?à证书信息(用户电子邮箱地址{填写您的邮箱,如:your@email.com},常用名称{任意,如:PushDemo},请求是:{单选,选择‘存储到磁盘’})à继续à保存],这时会在您指定的地方生成你指定的文件,默认为CertificateSigningRequest.certSigningRequest文件,这里命名为:PushDemo.certSigningRequest.在此*.certSigningRequest已经生成,具体操作步骤如图2-1、2-2所示。



2-1



2-2

如果生成成功,则会在[钥匙串访问|登录|密钥]栏目中列出与*.certSigningRequest关联的密钥,这里是PushDemo,如图2-3所示:



2-3

2、 新建一个App
ID(在苹果开发者账号中配置)


(1) 登录iOS
Dev Center,登录成功后,点击(iOS
Provisioning Portal对应链接),如图2-4所示:



2-4

(2) 创建New App ID[App IDsàManageàNew
App ID]( Description{填写您对此App ID 的描述,如:iShop},Bundle
Seed ID(App ID Prefix){选择绑定App ID前缀,如:默认选择Generate
New},Bundle Identifier(App ID Suffix){填写绑定App
ID后缀,如:com.yourcorp.iShop}),如下图2-5所示:



2-5

这样就会生成下面这条记录,如图2-6所示:



2-6

(3) 配置上一步中生成的App ID,让其支持消息推送[点击2-6中的Configureà选中Enable
for Apple Push Notification serviceà点击Configure],如图2-7所示:



2-7

(4) Generate a Certificate Signing Request(生成部署请求认证)[点击2-7中的2ConfigureàContinueà步骤1生成的*certSigningRequest文件(这里是iShop.certSigningRequest)à Generateà生成完成后将其下载下来,命名为:aps_developer_identity.cer],双击aps_developer_identity.cer证书{将证书与密钥关联,并将证书导入到MacBook中},如下图2-8所示:



2-8

(5) 创建Development Provisioning Profiles[开发许可配置文件](Provisioning|
Development|New Profile),具体操作流程如下图2-9所示:



2-9

点击图2-9中Submit,生成Development
Provisioning Profiles[开发许可配置文件],这里是:iShopDevprofile.mobileprovision如下图2-10所示:



2-10

下载此开发许可证书(用于联机调试)。

总结,到现在为止,我们已经生成:A:*.certSigningRequest文件(在步骤(4)中使用,用于生成证书B)、B:aps_developer_identity.cer证书(在Provider[Push服务器]服务端应用使用)、C:*..mobileprovision开发许可配置文件(在Client
App客户端应用联机调试使用)。

至此,消息推送的配置已经全部完成,接下来的工作就是编写Provider[Push服务器]服务端应用和Client
App客户端应用的程序,本来自己是想一步一步详细的写下去,但是对于这一部分,互联网上已经很多,在此就不在赘述,但还是给出相应连接,供大家参考,如下:

(1)iphone
push notification 消息推送

(2)iphone 推送通知 服务器端java 实现

(3)iPhone消息推送机制实现及通过.net应用程序发送消

---- Provider(JAVA实现)

IOS 消息推送原理及实现总结中讲述了消息推送的原理及实现总结,但并未讲到Provider服务端及Client
App客户端的实现,但我在这里只是简单讲述Provider服务端(JAVA实现)步骤如下:

一、 制作Provider服务端所需要的*.p12文件:

IOS 消息推送原理及实现总结的图2-8中所展示的密钥、证书,我们并没有使用到它,那么为什么要展示出来呢,猜猜是为什么?为制作*.p12文件?哈哈,您猜对了,下面我们就利用它来制作*.p12文件,步骤:([MacBookà应用程序à实用工具à钥匙串访问[钥匙串:登录,种类:证书]à选择刚刚生成的证书(Apple
Development IOS Services:*******)à菜单à文件à导出项目…à[存储为:任意文件名(如:iPush),文件格式:默认(个人信息交换(.p12))]à输入密码以进行导出[密码:任意,验证:与密码同一]à输入MACBook登录密码à允许à最终生成。 关键步骤如图1-1



1-1

二、 编写Client
App客户端的关键代码,如下:

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

self.window =
[[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen]bounds]] autorelease];

self.window.backgroundColor =
[UIColor whiteColor];

[self.window makeKeyAndVisible];

//消息推送支持的类型

UIRemoteNotificationType types
=

(UIRemoteNotificationTypeBadge

|UIRemoteNotificationTypeSound

|UIRemoteNotificationTypeAlert);

//注册消息推送

[[UIApplication sharedApplication]registerForRemoteNotificationTypes:types];

return YES;

}

//获取DeviceToken成功

- (void)application:(UIApplication *)application

didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

{

NSLog(@"DeviceToken:
{%@}",deviceToken);

//这里进行的操作,是将Device
Token发送到服务端

}

//注册消息推送失败

- (void)application:(UIApplication *)application

didFailToRegisterForRemoteNotificationsWithError:(NSError *)error

{

NSLog(@"Register
Remote Notifications error:{%@}",[errorlocalizedDescription]);

}

//处理收到的消息推送

- (void)application:(UIApplication *)application

didReceiveRemoteNotification:(NSDictionary *)userInfo

{

NSLog(@"Receive
remote notification : %@",userInfo);

UIAlertView *alert
=

[[UIAlertView alloc] initWithTitle:@"温馨提示"

message:@"推送成功!"

delegate:nil

cancelButtonTitle:@"确定"

otherButtonTitles:nil];

[alert show];

[alert release];

}

三、编写Provider服务端关键代码,如下:

import javapns.back.PushNotificationManager;

import javapns.back.SSLConnectionHelper;

import javapns.data.Device;

import javapns.data.PayLoad;

public class MainSend

{

public static void main(String[]
args) throws Exception

{

try

{

//从客户端获取的deviceToken

String deviceToken = "3a20764942e9cb4c4f6249274f12891946bed26131b686b8aa95322faff0ad46";

System.out.println("Push
Start deviceToken:" + deviceToken);

//定义消息模式

PayLoad payLoad = new PayLoad();

payLoad.addAlert("消息推送测试!");

payLoad.addBadge(4);

payLoad.addSound("default");

//注册deviceToken

PushNotificationManager pushManager = PushNotificationManager.getInstance();

pushManager.addDevice("iPhone",
deviceToken);

//连接APNS

String host = "gateway.sandbox.push.apple.com";

int port
= 2195;

String path = "/Users/iMilo/Work.localized/iShop/project/service/iPush/";

String certificatePath = (path + "src/ipush/iPush.p12");

//certificatePath 步骤一中生成的*.p12文件位置

String certificatePassword = "Love24mm";

pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);

//发送推送

Device client = pushManager.getDevice("iPhone");

pushManager.sendNotification(client, payLoad);

//停止连接APNS

pushManager.stopConnection();

//删除deviceToken

pushManager.removeDevice("iPhone");

System.out.println("Push
End");

}

catch (Exception
ex)

{

ex.printStackTrace();

}

}

}

注意:如果Provider服务端为Objective-C实现的话,就不需要*.p12证书。下面给出网上的相应demo地址:

Provider服务端(JAVA实现):apns_iphone.zip

Provider服务端(Objective-C实现):PushMeBabySource.zip
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: