iOS消息推送的工作机制可以简单的用下图来概括:
Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务器。
上图可以分为三个阶段:
第一阶段:应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。
从上图我们可以看到:
1、应用程序注册消息推送。
2、iOS从APNS Server获取device token,应用程序接收device token。
3、应用程序将device token发送给PUSH服务端程序。
4、服务端程序向APNS服务发送消息。
5、APNS服务将消息发送给iPhone应用程序。
无论是iPhone客户端和APNS,还是Provider和APNS,都需要通过证书进行连接。
下面我介绍一下几种用到的证书。
一、CSR文件
1、生成Certificate Signing Request(CSR)
2、填写你的邮箱和常用名称,并选择保存到硬盘。
点击继续:
这样就在本地生成了一个Push.certSigningRequest文件。
二、p12文件
1、导出密钥。
2、输入你的密码。
这样就生成了一个Push.p12文件。
三、SSL certificate文件
1、用你付过费的帐号登录到iOS Provisioning Portal,并新建一个App ID,这个过程可以参考:iOS应用的真机调试,这样就会生成下面这条记录:
2、点击右侧的Configure:
3、点击Development Push SSL Certificate一行后的Configure:
4、点击Continue:
5、选择前面生成好的Push.certSigningRequest文件,点击Generate,出现如下所示的页面:
6、点击Continue:
7、点击Download,并将文件命名为aps_developer_identity.cer。
8、点击Done,你会发现状态变成了Enabled:
注意:有的App ID的Apple Push Notification service列是灰色的,并且不允许使用Configure按钮,这是因为APNS不支持带通配符的App ID。
到现在为止,我们已经生成了三个文件:
1、Push.certSigningRequest
2、Push.p12
3、aps_developer_identity.cer
二、 编写Client App客户端的关键代码,如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]] autorelease]; self.window.backgroundColor = [UIColorwhiteColor];
[self.windowmakeKeyAndVisible]; //消息推送支持的类型
UIRemoteNotificationType types = (UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert); //注册消息推送
[[UIApplicationsharedApplication] registerForRemoteNotificationTypes:types]; returnYES;
}
//获取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:{%@}",[error localizedDescription]);
}
//处理收到的消息推送
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSLog(@"Receive remote notification : %@",userInfo); UIAlertView *alert =
[[UIAlertViewalloc] initWithTitle:@"温馨提示" message:@"推送成功!" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
[alertshow];
}
String deviceToken =
"3a20764942e9cb4c4f6249274f12891946bed26131b686b8aa95322faff0ad46"
;
System.
out
.println(
"Push Start deviceToken:"
三、编写Provider服务端关键代码,如下:
importjavapns.back.PushNotificationManager;
importjavapns.back.SSLConnectionHelper;
importjavapns.data.Device;
importjavapns.data.PayLoad;
publicclassMainSend {
publicstaticvoid main(String[] args) throws Exception {
try {
//从客户端获取的deviceToken
String deviceToken = "3a20764942e9cb4c4f6249274f12891946bed26131b686b8aa95322faff0ad46";
System.out.println("Push Start deviceToken:" + deviceToken); //定义消息模式
PayLoadpayLoad = newPayLoad();
payLoad.addAlert("消息推送测试!");
payLoad.addBadge(4);
payLoad.addSound("default"); //注册deviceToken
PushNotificationManagerpushManager = 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();
}
}
}