iOS消息推送(Java实现)

来源:互联网 发布:手机4g网络提速方法 编辑:程序博客网 时间:2024/05/17 22:48

原文地址,感谢分享


首先来了解一下苹果的消息推送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中加入以下两个代理方法
[objc] view plain copy
  1. - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {   
  2.     NSString *token = [NSString stringWithFormat:@"%@", deviceToken];  
  3.     //获取终端设备标识,这个标识需要通过接口发送到服务器端,服务器端推送消息到APNS时需要知道终端的标识,APNS通过注册的终端标识找到终端设备。  
  4.     NSLog(@"My token is:%@", token);     
  5. }    


[objc] view plain copy
  1. - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {     
  2.     NSString *error_str = [NSString stringWithFormat@"%@", error];     
  3.     NSLog(@"Failed to get token, error:%@", error_str);     
  4. }  


  • 在AppDelegate.m的(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中加入注册消息通知推送能力;加入当应用程序处于未启动状态时,判断是否由远程消息通知触发;加入清除消息推送通知标记。
[objc] view plain copy
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
  2. {  
  3.   //判断是否由远程消息通知触发应用程序启动  
  4.     if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]!=nil) {  
  5.         //获取应用程序消息通知标记数(即小红圈中的数字)  
  6.         int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;  
  7.         if (badge>0) {  
  8.            //如果应用程序消息通知标记数(即小红圈中的数字)大于0,清除标记。  
  9.             badge--;  
  10.           //清除标记。清除小红圈中数字,小红圈中数字为0,小红圈才会消除。  
  11.             [UIApplication sharedApplication].applicationIconBadgeNumber = badge;  
  12.         }  
  13.     }  
  14.     //消息推送注册  
  15.     [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge];  
  16. }  


  • 在项目AppDelegate.m中加入消息接收处理代理方法。
[objc] view plain copy
  1. //处理收到的消息推送  
  2. - (void)application:(UIApplication *)application   
  3. didReceiveRemoteNotification:(NSDictionary *)userInfo  
  4. {  
  5.     //在此处理接收到的消息。  
  6.     NSLog(@"Receive remote notification : %@",userInfo);  
  7. }  


3.Java后台苹果推送服务器推送消息

[java] view plain copy
  1. package com.kerryzb.util;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6.   
  7.   
  8.   
  9. import org.apache.commons.lang.StringUtils;  
  10.   
  11. import javapns.Push;  
  12. import javapns.devices.Device;  
  13. import javapns.devices.implementations.basic.BasicDevice;  
  14. import javapns.notification.AppleNotificationServerBasicImpl;  
  15. import javapns.notification.PushNotificationManager;  
  16. import javapns.notification.PushNotificationPayload;  
  17. import javapns.notification.PushedNotification;  
  18.   
  19.   
  20.   
  21. public class Test  
  22. {  
  23.     public static void main(String[] args) throws Exception  
  24.     {  
  25.         String deviceToken = "d4b3c5f3d497554f56f6f9791872666ae06e3b4e7abad6f4792dcd030007db91";  
  26.         String alert = "给你发信息了";//push的内容  
  27.         int badge = 3;//图标小红圈的数值  
  28.         String sound = "default";//铃音  
  29.   
  30.         List<String> tokens = new ArrayList<String>();  
  31.         tokens.add(deviceToken);  
  32.         String certificatePath = "D:/ZshPush.p12";  
  33.         String certificatePassword = "123456";//此处注意导出的证书密码不能为空因为空密码会报错  
  34.         boolean sendCount = true;  
  35.   
  36.         try  
  37.         {  
  38.             PushNotificationPayload payLoad = new PushNotificationPayload();  
  39.             payLoad.addAlert(alert); // 消息内容  
  40.             payLoad.addBadge(badge); // iphone应用图标上小红圈上的数值  
  41.              
  42.             if (!StringUtils.isBlank(sound))  
  43.             {  
  44.                 payLoad.addSound(sound);//铃音  
  45.             }  
  46.             PushNotificationManager pushManager = new PushNotificationManager();  
  47.             //true:表示的是产品发布推送服务 false:表示的是产品测试推送服务  
  48.             pushManager.initializeConnection(new AppleNotificationServerBasicImpl(certificatePath, certificatePassword, false));  
  49.             List<PushedNotification> notifications = new ArrayList<PushedNotification>();  
  50.             // 发送push消息  
  51.             if (sendCount)  
  52.             {  
  53.                 Device device = new BasicDevice();  
  54.                 device.setToken(tokens.get(0));  
  55.                 PushedNotification notification = pushManager.sendNotification(device, payLoad, true);  
  56.                 notifications.add(notification);  
  57.             }  
  58.             else  
  59.             {  
  60.                 List<Device> device = new ArrayList<Device>();  
  61.                 for (String token : tokens)  
  62.                 {  
  63.                     device.add(new BasicDevice(token));  
  64.                 }  
  65.                 notifications = pushManager.sendNotifications(payLoad, device);  
  66.             }              
  67.             pushManager.stopConnection();  
  68.         }  
  69.         catch (Exception e)  
  70.         {  
  71.             e.printStackTrace();  
  72.         }  
  73.     }  
  74. }  


Java所需要用到的jar包,可到此下载

http://download.csdn.net/detail/kerryzb/9531939

原创粉丝点击