`
longgangbai
  • 浏览: 7332263 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android推送之APNS 网站调用提供推送技术

 
阅读更多

APNS 网站  http://www.push-notification.org 

APNS 是什么?

      APNS (Android Push Notification Service) 是一种在 android 上轻松实现 push notification 的功能的解决方案.
只需申请一个 API Key, 经过简单的步骤即可实现 push notification 的功能.

特点:
 快速集成:提供一种比C2DM更加快捷的使用方式,避免各种限制.
 无需架设服务器:通过使用"云服务",减少额外服务器负担.
 可以同时推送消息到网站页面,android 手机
 耗电少,占用流量少.
 
操作步骤:
1. 下载 libaray: com_apns.jar
2.将com_apns.jar添加到工程
3.接收 push notification
4.启动 Push Notification Service
5.配置 AndroidManifest.xml

 

Activity类如下:

package com.easyway.apns;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.apns.APNService;

/**
 * 
 *  APNS 网站  http://www.push-notification.org
 * 
 * 
 * 
 * @Title: 
 * @Description: 实现TODO
 * @Copyright:Copyright (c) 2011
 * @Company:易程科技股份有限公司
 * @Date:2012-7-22
 * @author  longgangbai
 * @version 1.0
 */
public class AndroidAPNSActivity extends Activity {
	private Button btnapnsSend;
	private Button btnapnscancel;
	private Button btnapnsstart;
	private EditText tvapnsmsContent;
	private final static String APNS_SERVER_SERVICE_URL="http://www.push-notification.org/handlers/apns_v1.php";
	
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btnapnsSend=(Button)findViewById(R.id.btn_apns_send);
        btnapnscancel=(Button)findViewById(R.id.btn_apns_cancel);
        btnapnsstart=(Button)findViewById(R.id.btn_apns_service_start);
        tvapnsmsContent=(EditText)findViewById(R.id.tv_apns_service_content);
        
        initListeners();
        
    }
	private String getDevId() {
		String devId="";
		TelephonyManager telmgr=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
		if(telmgr!=null){
			devId=telmgr.getDeviceId();
		}
		return devId;
	}
	private void initListeners() {
		/**
         * 启动 Push Notification Service
         * 发送Intent 启动服务,将 chanel Id 以及 此设备的标识 (chanel中唯一表示此设备的字符串)
         *  传递过去:
         *  备注:
         *  	Chanel Id 在申请 API 后,登录开发者页面会看到. 
         *  	devId: chanel 内设备标识,要在chanel内保持唯一. 
         */
        btnapnsstart.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				 Intent intent = new Intent(APNService.START);
				 intent.putExtra("ch", getText(R.string.channelId));
				 String	devId =getDevId();
				 if(devId==null){
					 devId=getText(R.string.devId).toString();
				 }
				 intent.putExtra("devId", devId);
				 startService(intent);
  				 Toast.makeText(AndroidAPNSActivity.this, "APNS服务启动成功!", Toast.LENGTH_SHORT).show();
			}
		});
        /**
         * 
		            通过 rest 接口发送 Notification:
		    http://www.push-notification.org/handlers/apns_v1.php?ch=YourChannelId&devId=xxxxx&msg =hello world&random=0123&hash=HashCode 
            ch:Channel Id
			devId:接收设备 Id
			msg:消息
			random:随机数
			hash:md5(ch + devId + msg + random + apiKey)
         * 
         */
        btnapnsSend.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
					//获取消息
					String msg=tvapnsmsContent.getText().toString();
					if(msg==null || msg.length()==0){
						Toast.makeText(AndroidAPNSActivity.this, "请输入APNS 服务的消息内容!", Toast.LENGTH_SHORT).show();
						return ;
					}
					//获取随机数
					Random random=new Random(100000);
					int randomNum=random.nextInt();
					//获取md5的hash值
					String channelId = getText(R.string.channelId).toString();
					String devId = getText(R.string.devId).toString();
					devId = getDevId();
					String apiKey = getText(R.string.apiKey).toString();
					StringBuffer sb = new StringBuffer().append(channelId).append(devId).append(msg).append(randomNum).append(apiKey);
					String md5input=sb.toString();
				try {
					String hash = CommonUtils.md5encrypt(md5input);
					StringBuffer urlsb=new StringBuffer();
					urlsb.append(APNS_SERVER_SERVICE_URL);
					urlsb.append("?ch="+channelId);
					urlsb.append("&devId="+devId);
					urlsb.append("&msg="+msg);
					urlsb.append("&random="+randomNum);
					urlsb.append("&hash="+hash);
					Log.d("APNS URL", "网络 APNS 服务地址:"+urlsb.toString());
					Integer integer=CommonUtils.doGet(urlsb.toString(), null);
					switch (integer) {
						case -1://不能连接云服务!
							Toast.makeText(AndroidAPNSActivity.this, "不能连接云服务!", Toast.LENGTH_LONG).show();
							break;
						case 0:
							Toast.makeText(AndroidAPNSActivity.this, "APNS 发送信息成功!", Toast.LENGTH_LONG).show();
							break;
						case 1:
							Toast.makeText(AndroidAPNSActivity.this, "APNS服务访问失败!", Toast.LENGTH_LONG).show();
							break;				
						case 2:
							Toast.makeText(AndroidAPNSActivity.this, "APNS服务没有访问权限!", Toast.LENGTH_LONG).show();
								break;
						case 3:
							Toast.makeText(AndroidAPNSActivity.this, "APNS服务不再线!", Toast.LENGTH_LONG).show();
							break;
						case 12:
							Toast.makeText(AndroidAPNSActivity.this, "APNS通道连接超时!", Toast.LENGTH_LONG).show();
							break;
						case 13:
							Toast.makeText(AndroidAPNSActivity.this, "APNS 服务中hash code不匹配!", Toast.LENGTH_LONG).show();
							break;
						case 14:
							Toast.makeText(AndroidAPNSActivity.this, "APNS服务中请求参数无效!", Toast.LENGTH_LONG).show();
							break;		
						case 15:
							Toast.makeText(AndroidAPNSActivity.this, "APNS服务中未知错误!", Toast.LENGTH_LONG).show();
							break;						
						default:
							Toast.makeText(AndroidAPNSActivity.this, "APNS客户端解析错误!", Toast.LENGTH_LONG).show();
							break;
					}
				} catch (NoSuchAlgorithmException e) {
					e.printStackTrace();
				}
			}


		});
        btnapnscancel.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				tvapnsmsContent.setText("");
			}
		});
        
	}
}

 

APNSBroadcastReceiver的接收类:

package com.easyway.apns;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import com.apns.APNService;
/**
 * 接收 push notification
 * 		使用BroadcastReceiver接收系统广播:将APNS接收的消息
 * 以通知的方式提示用户。
 * 
 * @Title: 
 * @Description: 实现TODO
 * @Copyright:Copyright (c) 2011
 * @Company:易程科技股份有限公司
 * @Date:2012-7-22
 * @author  longgangbai
 * @version 1.0
 */
public class APNSBroadcastReceiver extends BroadcastReceiver {
	private final int APNS_NOTIFICATION_ID=0x345;
	@Override
	public void onReceive(Context context, Intent intent) {
	     if (intent.getAction().equals(APNService.ON_NOTIFICATION)) {
			String str = intent.getStringExtra("data");
			JSONObject jsonObject;
			try {
				jsonObject = new JSONObject(str);
				String msgTitle=jsonObject.getString("msgTitle");
				String msgcontentText=jsonObject.getString("msgContent");
				//初始化Notification对象:
			    PendingIntent pi=PendingIntent.getActivity(context, 0, intent, 0);
			    Notification notify=new Notification();
			    notify.icon=R.drawable.notification_icon;
			    notify.when=System.currentTimeMillis();
			    notify.defaults=Notification.DEFAULT_SOUND;
			    notify.defaults=Notification.DEFAULT_ALL;
			    notify.setLatestEventInfo(context, msgTitle, msgcontentText, pi);
				//获得NotificationManager对象的引用:
				String ns = Context.NOTIFICATION_SERVICE;
				NotificationManager notifyMgr = (NotificationManager) context.getSystemService(ns);
			    notifyMgr.notify(APNS_NOTIFICATION_ID, notify);
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		 } 
	}
}

 

 

工具类:

 

 

package com.easyway.apns;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

import android.util.Log;
/**
 * 
 * 
 * @Title: 
 * @Description: 实现TODO
 * @Copyright:Copyright (c) 2011
 * @Company:易程科技股份有限公司
 * @Date:2012-7-22
 * @author  longgangbai
 * @version 1.0
 */
public abstract class CommonUtils {
	
	public static final String SUCCESS="1";
	public static final String FAILURE="0";
	private static final String key="MD5";
	/**
	 * md加密的算法
	 * 
	 * @param md5Str
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws IOException
	 */
	public static String md5encrypt(String md5Str) throws NoSuchAlgorithmException {
		    MessageDigest md5 = MessageDigest.getInstance(key);
		    byte[] byteArray =md5Str.getBytes();
		    byte[] md5Bytes = md5.digest(byteArray);
		    StringBuffer hexValue = new StringBuffer();
		    for (int i=0; i<md5Bytes.length; i++)
		    {
		       int val = ((int) md5Bytes[i] ) & 0xff; 
		       if (val < 16) hexValue.append("0");
		       hexValue.append(Integer.toHexString(val));
		       
		    }
		    return hexValue.toString();
	}
	/**
	 * 处理REST请求GET的类
	 * @param requestUrl
	 * @param paramsMap
	 */
	 public static  Integer doGet(String requestUrl,Map<String,String> paramsMap){
		    // 定义待请求的URL
			// 创建HttpClient实例
			HttpClient client = new DefaultHttpClient();
			// 根据URL创建HttpGet实例
			HttpGet post = new HttpGet(requestUrl);
			HttpParams params=new BasicHttpParams();
			// 设置需要传递的参数
			if(paramsMap!=null && !paramsMap.isEmpty()){
				Set<Entry<String,String>> paramsMapset=paramsMap.entrySet();
				for (Entry<String, String> entry : paramsMapset) {
					params.setParameter(entry.getKey(), entry.getValue());
				}
			}
			post.setParams(params);
			
			try {
				// 设置URL编码
				post.setHeader("content-type", "charset=UTF-8");
				// 发送请求并获取反馈
				HttpResponse response = client.execute(post);
				// 解析返回的内容
				String result = EntityUtils.toString(response.getEntity());
				Log.d("响应结果:", "APNS 服务响应的结果:"+result);
				String reponseCode=parseXML(result);
				return new Integer(reponseCode);
			} catch (Exception e) {
				e.printStackTrace();
				return 16;
			}
	 }
	 /**
	  * 解析返回的xml响应的结果
	  * @param dom
	  * @return
	  */
	 public static String parseXML(String dom){
		try {
			  InputStream inputStream =new ByteArrayInputStream(dom.getBytes());
		      DocumentBuilderFactory factory = DocumentBuilderFactory  
		              .newInstance();  
		      DocumentBuilder builder = factory.newDocumentBuilder();
			  Document document = builder.parse(inputStream);  
		      // 获取根节点   
		      Element root = document.getDocumentElement();  
		      return root.getAttribute("result");
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
		return "-1";
	 }
	
}

 

 

配置:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.easyway.apns"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.READ_LOGS"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name="AndroidAPNSActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
      <!-- APNS Service服务 -->
	 <!-- APNS 广播接收机制 -->
	 <receiver android:name="APNSBroadcastReceiver">
	      <intent-filter>
	          <action android:name="com.apnsd.APNService.NOTIFICATION" />
	      </intent-filter>
	 </receiver>
	 <service android:name="com.apns.APNService"></service>
	 
    </application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


</manifest>

 

分享到:
评论

相关推荐

    java调用apns推送的实现

    总的来说,Java调用APNs推送涉及网络编程、安全认证、JSON处理等多个技术领域。理解APNs的工作原理并正确使用Java API,结合压缩包中的资源,你可以实现一套完整的推送系统。在实际开发中,还需要考虑到性能、稳定性...

    APNS史上最容易的消息推送android

    然而,这个标题“APNS史上最容易的消息推送android”似乎有些误导,因为APNS是针对iOS系统的,而不是Android。不过,我们可以理解为讨论的是如何在Android应用中实现类似APNS的远程通知功能,即使用GCM(Google ...

    Java向苹果服务器推送消息(Java实现HTTP/2协议发送APNS)

    APNs(Apple Push Notification service)是苹果公司提供的推送服务,允许开发者将消息推送到用户的iOS设备上。本教程将重点讲解如何使用Java实现基于HTTP/2协议的APNS推送,并假设你已经对JDK 11及以上版本有一定的...

    java进行苹果APNS消息推送

    Java进行苹果APNS(Apple Push Notification Service)消息推送是一项在iOS和macOS应用程序中实现远程通知功能的关键技术。本文将详细介绍如何使用Java实现这一过程,同时关注`javapns`库和`bcprov-jdk`加密组件的...

    APNS 苹果消息推送项目源码,运行即用,代码+数据库+文档全打包

    苹果推送服务(Apple Push Notification service,简称APNs)是苹果公司提供的一项服务,允许开发者将实时的通知信息推送到iOS、macOS以及watchOS等设备上。这个“APNS 苹果消息推送项目源码,运行即用”包含了实现...

    分享:APNS 消息推送教程,包含.Net服务端教程10

    在iOS应用开发中,苹果提供了Apple Push Notification Service (APNS) 来实现实时的消息推送功能,使得即使应用不在前台运行也能接收到服务器发送的通知。本文主要围绕如何使用.NET服务端来实现APNS消息推送,以及...

    IOS消息推送之APNS - iOS知识库1

    APNS允许开发者将消息推送到已注册的iOS、iPadOS以及watchOS设备上,提供了一种高效、可靠的通知传递机制。 在iOS中实现APNS需要完成以下几个关键步骤: 1. **设置App ID**: 在Apple Developer Portal中,你需要...

    APNs推送Demo,适配iOS8.0+

    这个"APNs推送Demo,适配iOS8.0+"是一个示例项目,帮助开发者了解如何在iOS 8.0及以上版本的设备上实现APNs推送功能。 首先,我们需要理解APNs的工作原理。当应用注册到APNs时,设备会生成一个唯一的设备令牌,然后...

    C#推送信息到APNs的方法

    APNs是苹果公司提供的服务,允许开发者将实时信息推送到运行iOS、iPadOS、watchOS、tvOS以及macOS的设备上。 首先,我们需要了解APNs的工作原理。APNs通过加密的TLS(Transport Layer Security)连接与服务器通信。...

    IOS Android推送 C#

    总的来说,"IOS Android推送 C#"涉及的关键技术是利用C#与APNs和FCM的集成,通过`Redth.PushSharp`库实现跨平台的推送通知服务,为iOS和Android用户提供实时的信息提醒。在实际开发中,开发者需要考虑推送的效率、...

    U盟消息推送_phpios推送_php安卓推送_thinkphp推送

    4. 消息发送:通过调用推送服务API,将消息发送到指定的设备。 5. 推送反馈:接收并处理推送服务返回的状态信息,如成功送达、失败原因等。 为了实现高效且稳定的推送服务,开发者还需要考虑以下几点: - 错误处理...

    IOS远程推送php测试--ApnsPHP-master

    APNs是苹果公司提供的一个服务,用于将推送通知发送到iOS设备、Apple Watch、tvOS设备以及macOS设备。当开发者需要提醒用户有新消息、更新或者应用内事件时,就会通过APNs实现。APNs有两种工作模式:Sandbox(沙盒...

    个推推送工具类

    "个推推送工具类"是专门用于Android和iOS平台的推送服务实现,它提供了一整套功能丰富的API和DTO(Data Transfer Object)数据传输对象,帮助开发者轻松地实现在移动应用中的消息推送功能。个推作为国内知名的第三方...

    友盟推送,安卓,IOS推送

    友盟推送服务是一款针对移动应用开发者提供的消息推送解决方案,它涵盖了Android和iOS两大主流操作系统,旨在帮助开发者提高用户活跃度、提升应用留存率以及进行精准的用户行为分析。在这个服务中,开发者可以向用户...

    flutter-apns:用于推送通知服务器的Flutter插件

    用于在iOS上实现APNS推送通知并在Android上实现Firebase的插件。 为什么制作此插件? 当前,唯一可用的推送通知插件是firebase_messaging 。 这意味着,即使在iOS上,您也需要设置Firebase并与Google通信以发送推...

    极光推送封装(页面跳转,设置角标,设置别名)

    极光推送(Aurora Push)是一款广泛应用于iOS和Android平台上的第三方消息推送服务,它能够帮助开发者实现向用户精准推送消息、更新应用内通知角标、设置用户别名等功能,从而提升用户活跃度和应用黏性。在这个项目中...

    APNS推送消息到达后的处理流程

    当你的应用接收到APNS推送的消息后,需要有一套处理流程来确保消息能够正确且及时地呈现在用户面前。这篇博客文章可能详细探讨了这一过程,但遗憾的是,具体的博客内容并未提供。 APNS推送消息到达后的处理流程大致...

    notnoop推送实例+证书配置注意事项

    在iOS应用开发中,苹果推送服务(Apple Push Notification service,简称APNs)是苹果提供的一种向用户设备发送通知的服务。`notnoop`是Java库,用于帮助开发者与APNs进行交互,实现远程推送通知功能。本文将深入...

    IOS消息推送服务端开发

    `javapns.jar`是一个早期的项目,它提供了基本的APNs推送功能,而`javaapns.jar`强调了多线程支持,使得可以同时处理多个推送请求,提高推送效率。使用这些库时,开发者需要配置证书路径,创建推送消息对象,并调用...

Global site tag (gtag.js) - Google Analytics