IOS消息推送服务端开发

IOS消息推送服务端开发

ios消息推送主要主流有两种方式,一种是基于javaapns.jar和javaPNS.jar的开源的消息推送,javaPNS.jar支持多线程,工程结构如下:

源码下载如下(仅供参考):
http://download.csdn.net/detail/liaochangbin09/7211917

第一种:基于javaapns.jar的实现如下:
package com.ios.ApnsSend;

import java.util.List;

import javapns.back.PushNotificationManager;
import javapns.back.SSLConnectionHelper;
import javapns.data.Device;
import javapns.data.PayLoad;

import com.ios.domain.PushInfo;

public class MulApnsSend {

	/**
	 * 
	 * @param filePath 证书文件路径
	 * @param password 密码
	 * @param content 消息内容
	 * @param pushInfos 推送消息集合
	 */
	public static void pushToClients(String filePath,String password,String content,List<PushInfo> pushInfos) {
		System.out.println("to pushs");
		try {
			PayLoad payLoad=new PayLoad();
			//消息内容
			payLoad.addAlert(content);
			payLoad.addBadge(1);//应用图标上小红圈上的数值     //
			//铃声默认
			payLoad.addSound("default");
			
			PushNotificationManager pushManager=PushNotificationManager.getInstance();
			String testHost= "gateway.sandbox.push.apple.com";  
			String realHost="gateway.push.apple.com";
			//链接到APNs  
		    pushManager.initializeConnection(testHost, 2195, 
		    		filePath, password, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12); 
		    
		    for (int i = 0; i < pushInfos.size(); i++) {
		    	System.out.println("iphone" + pushInfos.get(i).getId());
		    	pushManager.addDevice("iphone" + pushInfos.get(i).getId(), pushInfos.get(i).getToken()); 
		        Device client = pushManager.getDevice("iphone"+ pushInfos.get(i).getId());  
		        pushManager.sendNotification(client, payLoad);  
			}
		    
		    pushManager.stopConnection();  
		    for (int i = 0; i < pushInfos.size(); i++) {  
		    	pushManager.removeDevice("iphone" + pushInfos.get(i).getId());
		    }
		    
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			System.out.println(e.getMessage());
		}
	}

}
第二种方式:基于javaPNS.jar的ios消息推送机制
package com.ios.PnsSend;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import com.ios.domain.PushInfo;

import javapns.notification.AppleNotificationServer;
import javapns.notification.AppleNotificationServerBasicImpl;
import javapns.notification.PayloadPerDevice;
import javapns.notification.PushNotificationPayload;
import javapns.notification.PushedNotification;
import javapns.notification.transmission.NotificationProgressListener;
import javapns.notification.transmission.NotificationThread;
import javapns.notification.transmission.NotificationThreads;


public class PnsSend {

	/**
	 * 基于PNS的消息推送机制
	 * @param keystore 证书路径和证书名  
	 * @param password 证书密码  
	 * @param production 设置true为正式服务地址,false为开发者地址
	 * @param pushInfos
	 */
	public static void pushToClient(String keystore,String password,boolean production,List<PushInfo> pushInfos) {
	    int threadThreads = 10; // 线程数  
		try {
		    // 建立与Apple服务器连接  
		    AppleNotificationServer server = new AppleNotificationServerBasicImpl(keystore, password, production);  
		    List<PayloadPerDevice> list = new ArrayList<PayloadPerDevice>();  
		    for (PushInfo pushInfo : pushInfos) {
		    	PushNotificationPayload payload = new PushNotificationPayload();  
		    	payload.addAlert(pushInfo.getAlert());  
		    	payload.addSound("default");// 声音  
		    	payload.addBadge(1);//图标小红圈的数值  
		    	payload.addCustomDictionary(pushInfo.getCustomDictionaryKey(),pushInfo.getCustomDictionaryValue());// 添加字典   
		    	PayloadPerDevice pay = new PayloadPerDevice(payload,pushInfo.getToken());// 将要推送的消息和手机唯一标识绑定  
		    	list.add(pay);  
			}
		    NotificationThreads work = new NotificationThreads(server,list,threadThreads);//   
		    work.setListener(DEBUGGING_PROGRESS_LISTENER);// 对线程的监听,一定要加上这个监听  
		    work.start(); // 启动线程  
		    work.waitForAllThreads();// 等待所有线程启动完成
		    
		 } catch (Exception e) {  
		    e.printStackTrace();  
		 }
	}  
	
	
	// 线程监听  
	public static final NotificationProgressListener DEBUGGING_PROGRESS_LISTENER = new NotificationProgressListener() {  
	        public void eventThreadStarted(NotificationThread notificationThread) {  
	            System.out.println("   [EVENT]: thread #" + notificationThread.getThreadNumber() + " started with " + " devices beginning at message id #" + notificationThread.getFirstMessageIdentifier());  
	        }  
	        public void eventThreadFinished(NotificationThread thread) {  
	            System.out.println("   [EVENT]: thread #" + thread.getThreadNumber() + " finished: pushed messages #" + thread.getFirstMessageIdentifier() + " to " + thread.getLastMessageIdentifier() + " toward "+ " devices");  
	        }  
	        public void eventConnectionRestarted(NotificationThread thread) {  
	            System.out.println("   [EVENT]: connection restarted in thread #" + thread.getThreadNumber() + " because it reached " + thread.getMaxNotificationsPerConnection() + " notifications per connection");  
	        }  
	        public void eventAllThreadsStarted(NotificationThreads notificationThreads) {  
	            System.out.println("   [EVENT]: all threads started: " + notificationThreads.getThreads().size());  
	        }  
	        public void eventAllThreadsFinished(NotificationThreads notificationThreads) {  
	            System.out.println("   [EVENT]: all threads finished: " + notificationThreads.getThreads().size());  
	        }  
	        public void eventCriticalException(NotificationThread notificationThread, Exception exception) {  
	            System.out.println("   [EVENT]: critical exception occurred: " + exception);  
	        }  
	     };  

}
PushInfo.java代码如下:
package com.ios.domain;

public class PushInfo {
	//id
	private int id;
	//手机的唯一标识
	private String token;
	//推送内容
	private String alert;
	//自定义key
	private String customDictionaryKey;
	//自定义value
	private String customDictionaryValue;
	
	public String getCustomDictionaryKey() {
		return customDictionaryKey;
	}

	public void setCustomDictionaryKey(String customDictionaryKey) {
		this.customDictionaryKey = customDictionaryKey;
	}

	public String getCustomDictionaryValue() {
		return customDictionaryValue;
	}

	public void setCustomDictionaryValue(String customDictionaryValue) {
		this.customDictionaryValue = customDictionaryValue;
	}


	public String getAlert() {
		return alert;
	}

	public void setAlert(String alert) {
		this.alert = alert;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getToken() {
		return token;
	}

	public void setToken(String token) {
		this.token = token;
	}
	

}
测试代码如下:
package com.ios.test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import com.ios.ApnsSend.MulApnsSend;
import com.ios.PnsSend.PnsSend;
import com.ios.domain.PushInfo;

public class IosPushSendTest {

	public static void main(String[] args) {
		//第一种:基于APNS的ios消息推送测试
		List<PushInfo> pushInfos=new ArrayList<PushInfo>();
		PushInfo pushInfo1 = new PushInfo();
		pushInfo1.setId(1);
		pushInfo1.setToken("ff3a3ac5 6e3d3105 3df8f3b4 9f3f97df b51b35af 2a86ac41 df40cc35 3e5730dd");
		pushInfos.add(pushInfo1);
		PushInfo pushInfo2 = new PushInfo();
		pushInfo2.setId(2);
		pushInfo2.setToken("9689ee7a 4625ccc6 296a8957 ecff5f31 3b512999 e9bec18e c5222b1e e871ab12");
		pushInfos.add(pushInfo2);
		String path=System.getProperty("user.dir")+File.separator+"file"+File.separator+"apns.p12";
		MulApnsSend.pushToClients(path, "123456", "你大爷。", pushInfos);
		
		
		//第二种:基于PNS的ios消息推送测试
		//推送内容:
		String content="长腿欧巴到啦。";
		//证书路径和证书名  
	    String keystore=System.getProperty("user.dir")+File.separator+"file"+File.separator+"apns.p12";
	    String password = "123456"; // 证书密码  
	    // 手机唯一标识  
	    List<PushInfo> pushInfosList=new ArrayList<PushInfo>();
	    //第一个手机需要发送的信息如下:
	    PushInfo pnsPushInfo1 = new PushInfo();
	    pnsPushInfo1.setId(1);
	    pnsPushInfo1.setToken("ff3a3ac56e3d31053df8f3b49f3f97dfb51b35af2a86ac41df40cc353e5730dd");
	    pnsPushInfo1.setAlert(content);
	    pnsPushInfo1.setCustomDictionaryKey("url");
	    pnsPushInfo1.setCustomDictionaryValue("http://www.baidu.com/");
	    pushInfosList.add(pnsPushInfo1);
	    //第二个手机需要发送的信息如下:
	    PushInfo pnsPushInfo2 = new PushInfo();
	    pnsPushInfo2.setId(2);
	    pnsPushInfo2.setToken("9689ee7a4625ccc6296a8957ecff5f313b512999e9bec18ec5222b1ee871ab12");
	    pnsPushInfo2.setAlert(content);
	    pnsPushInfo2.setCustomDictionaryKey("url");
	    pnsPushInfo2.setCustomDictionaryValue("http://www.baidu.com/");
	    pushInfosList.add(pnsPushInfo2);
	    // 设置true为正式服务地址,false为开发者地址 
	    boolean production = false; 
	    PnsSend.pushToClient(keystore, password, production,pushInfosList);
		
		
	}

}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值