原文地址,感谢分享
首先来了解一下苹果的消息推送APNS(英文全称:Apple Push Notification service)
先来看两张苹果对于推送的两张解释图:
大概的意思就是,提供商把消息推送至苹果的推送服务器,再由苹果推送服务器将消息推送给手机客户端,或者反过来手机客户端把消息推送至苹果推送服务器,再由苹果推送服务将消息推送至提供商。这里提到的提供商可以是像极光推送或其他供应商,亦或是自己的服务器。
这里提到了苹果推送服务器向手机端推送消息,那么它是怎么知道是推送到哪个手机上的呢,这个就汲及到一个Token的问题。
Token是每台iOS手机唯一的标识,在启动手机应用时,会向苹果推送服务器去请求得到唯一的Token。当然,虽然每次应用启动时都会去请求得到Token,但是针对于同一部手机,返回回来的Token值都是一致的。
所以当苹果推送服务器只要知道要推送给哪个Token即可知道是推送至哪个手机。
接下来看一下APNS如何去实现消息的推送
1.首先是要准备好证书
从你的苹果电脑上导出CSR文件,打开钥匙串-->钥匙串访问-->证书助理-->从证书颁发机构请求证书,然后一路输入邮件地址和保存的文件,保存到电脑,CSR文件就生成了。
到苹果开发者官网http://developer.apple.com,登陆进入到证书管理模块,Identifiers --> App IDs, 如果你的应用ID还没有添加进来,那么点右上角加号添加进来,如果已经加进来了,单击进入,进么设置,将Push Notifications 设成Enable.
一路设置好,上传刚才从苹果电脑上导出来的CSR文件,并导出证书,双击导出的证书,它会自动安装到苹果电脑上,安装好后,在钥匙串工具中导出Push证书,即导出来后是一个P12文件,P12文件是用于后边Java后台连接APNS使的。
xcode中修改证书为刚才安装好的推送证书。由于推送需要用到真机,所以还需要Provisioning Profiles 证书,生成后也要在xcode中设置好。
2.给应用注册推送服务
- 首先在项目的AppDelegate.m中加入以下两个代理方法
- - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
- NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
-
- NSLog(@"My token is:%@", token);
- }
- - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
- NSString *error_str = [NSString stringWithFormat: @"%@", error];
- NSLog(@"Failed to get token, error:%@", error_str);
- }
- 在AppDelegate.m的(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中加入注册消息通知推送能力;加入当应用程序处于未启动状态时,判断是否由远程消息通知触发;加入清除消息推送通知标记。
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
-
- if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]!=nil) {
-
- int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
- if (badge>0) {
-
- badge--;
-
- [UIApplication sharedApplication].applicationIconBadgeNumber = badge;
- }
- }
-
- [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge];
- }
- 在项目AppDelegate.m中加入消息接收处理代理方法。
-
- - (void)application:(UIApplication *)application
- didReceiveRemoteNotification:(NSDictionary *)userInfo
- {
-
- NSLog(@"Receive remote notification : %@",userInfo);
- }
3.Java后台苹果推送服务器推送消息
- package com.kerryzb.util;
-
- import java.util.ArrayList;
- import java.util.List;
-
-
-
-
- import org.apache.commons.lang.StringUtils;
-
- import javapns.Push;
- import javapns.devices.Device;
- import javapns.devices.implementations.basic.BasicDevice;
- import javapns.notification.AppleNotificationServerBasicImpl;
- import javapns.notification.PushNotificationManager;
- import javapns.notification.PushNotificationPayload;
- import javapns.notification.PushedNotification;
-
-
-
- public class Test
- {
- public static void main(String[] args) throws Exception
- {
- String deviceToken = "d4b3c5f3d497554f56f6f9791872666ae06e3b4e7abad6f4792dcd030007db91";
- String alert = "给你发信息了";
- int badge = 3;
- String sound = "default";
-
- List<String> tokens = new ArrayList<String>();
- tokens.add(deviceToken);
- String certificatePath = "D:/ZshPush.p12";
- String certificatePassword = "123456";
- boolean sendCount = true;
-
- try
- {
- PushNotificationPayload payLoad = new PushNotificationPayload();
- payLoad.addAlert(alert);
- payLoad.addBadge(badge);
-
- if (!StringUtils.isBlank(sound))
- {
- payLoad.addSound(sound);
- }
- PushNotificationManager pushManager = new PushNotificationManager();
-
- pushManager.initializeConnection(new AppleNotificationServerBasicImpl(certificatePath, certificatePassword, false));
- List<PushedNotification> notifications = new ArrayList<PushedNotification>();
-
- if (sendCount)
- {
- Device device = new BasicDevice();
- device.setToken(tokens.get(0));
- PushedNotification notification = pushManager.sendNotification(device, payLoad, true);
- notifications.add(notification);
- }
- else
- {
- List<Device> device = new ArrayList<Device>();
- for (String token : tokens)
- {
- device.add(new BasicDevice(token));
- }
- notifications = pushManager.sendNotifications(payLoad, device);
- }
- pushManager.stopConnection();
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- }
Java所需要用到的jar包,可到此下载
http://download.csdn.net/detail/kerryzb/9531939