- 浏览: 7332263 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
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>
- AndroidAPNS.zip (108.7 KB)
- 下载次数: 100
发表评论
-
[转]年度最实用50款免费Android应用推荐
2012-11-08 16:39 3369据国外媒体报道,有人说Android应用市场比iPhone应用 ... -
GIS的学习(四十五)【转】Integration of the MBTiles format on Android
2012-10-22 17:13 2937转载自 http:/ ... -
GIS的学习(四十四)osmdroid sdcard检查
2012-10-15 16:12 2332在许多应用中使用到sdcard的检查,在osmdro ... -
GIS的学习(四十三)osmdroid基于几个经典代理类
2012-10-15 16:06 2624在osmdroid中给基于位置的代理类如下: pack ... -
Android中PopupWindow的用法(位置、动画、焦点)
2012-10-12 14:12 11514在Android中有很多级别的Window,不同级别的Wind ... -
【转】Android根据分辨率进行单位转换-(dp,sp转像素px)
2012-10-11 09:18 27128Android系统中,默认的单位是像素(px)。也就是说,在没 ... -
GIS的学习(二十九)Osmdroid 离线地图存放位置的研究和详细分析
2012-09-23 11:49 11514在手机通过osmdroid调用离线地图必须放在 ... -
GIS的学习(二十八)Osmdroid相关的开源项目
2012-09-23 11:31 25395osm 数据格式(openstreet map)与Ro ... -
GIS的学习(二十七)通过geoserver的georss访问第三方地图
2012-09-23 00:34 3599在geoserver中如果想调用第三方地图可以采 ... -
android中使用 定时更新界面定时器Timer的使用
2012-09-22 22:09 25515handler的使用 一、Handler的定义: ... -
【转】Android应用程序的自动更新升级(自身升级、通过tomcat) .
2012-09-16 15:03 7356http://blog.csdn.net/mu0206mu/a ... -
GIS的学习(二十七)OGC 的WCS WFS 及WMS 服务
2012-09-11 22:22 12105http://www.gisall.com/?6678/v ... -
GIS的学习(二十六)geotools 使用 部分代码总结
2012-09-11 22:20 5692前段时间的一个项目 本来用ae完成了种种的 查询,空间分析等等 ... -
GIS的学习(二十五)geoserver wms中的各种操作API详细讲解和使用
2012-09-10 17:42 9701官方geoserver中WMS服务中几种操作的API的详细说明 ... -
GIS的学习(二十四)android异步调用geoserver wms中的地图
2012-09-10 17:38 8155在geoserver的客户端通过wms的GetMap实现 ... -
GIS的学习(二十三)geoserver中CQL和ECQL的使用
2012-09-10 16:29 6618以下引用自官方文档: CQL and ECQL¶ CQ ... -
GIS的学习(二十二)osmdroid中添加縮放控件
2012-09-06 23:09 2783package com.geoserver.osmdroid; ... -
GIS的学习(二十一)在osmdroid 地图中添加marker 并添加事件
2012-09-06 22:27 6612我有 osmdroid,overlayswithf ... -
GIS的学习(二十)基于Geoserver的WFS服务与Openlayers实现地理查询
2012-08-30 18:48 11400基于Geoserver发布的wfs服务,与Openlayers ... -
GIS的学习(十九)Geoserver使用添加,删除,查询地图中的POI
2012-08-30 17:28 10349在geoserver自定义的地图中通过geoserver ...
相关推荐
总的来说,Java调用APNs推送涉及网络编程、安全认证、JSON处理等多个技术领域。理解APNs的工作原理并正确使用Java API,结合压缩包中的资源,你可以实现一套完整的推送系统。在实际开发中,还需要考虑到性能、稳定性...
然而,这个标题“APNS史上最容易的消息推送android”似乎有些误导,因为APNS是针对iOS系统的,而不是Android。不过,我们可以理解为讨论的是如何在Android应用中实现类似APNS的远程通知功能,即使用GCM(Google ...
APNs(Apple Push Notification service)是苹果公司提供的推送服务,允许开发者将消息推送到用户的iOS设备上。本教程将重点讲解如何使用Java实现基于HTTP/2协议的APNS推送,并假设你已经对JDK 11及以上版本有一定的...
Java进行苹果APNS(Apple Push Notification Service)消息推送是一项在iOS和macOS应用程序中实现远程通知功能的关键技术。本文将详细介绍如何使用Java实现这一过程,同时关注`javapns`库和`bcprov-jdk`加密组件的...
苹果推送服务(Apple Push Notification service,简称APNs)是苹果公司提供的一项服务,允许开发者将实时的通知信息推送到iOS、macOS以及watchOS等设备上。这个“APNS 苹果消息推送项目源码,运行即用”包含了实现...
在iOS应用开发中,苹果提供了Apple Push Notification Service (APNS) 来实现实时的消息推送功能,使得即使应用不在前台运行也能接收到服务器发送的通知。本文主要围绕如何使用.NET服务端来实现APNS消息推送,以及...
APNS允许开发者将消息推送到已注册的iOS、iPadOS以及watchOS设备上,提供了一种高效、可靠的通知传递机制。 在iOS中实现APNS需要完成以下几个关键步骤: 1. **设置App ID**: 在Apple Developer Portal中,你需要...
这个"APNs推送Demo,适配iOS8.0+"是一个示例项目,帮助开发者了解如何在iOS 8.0及以上版本的设备上实现APNs推送功能。 首先,我们需要理解APNs的工作原理。当应用注册到APNs时,设备会生成一个唯一的设备令牌,然后...
APNs是苹果公司提供的服务,允许开发者将实时信息推送到运行iOS、iPadOS、watchOS、tvOS以及macOS的设备上。 首先,我们需要了解APNs的工作原理。APNs通过加密的TLS(Transport Layer Security)连接与服务器通信。...
总的来说,"IOS Android推送 C#"涉及的关键技术是利用C#与APNs和FCM的集成,通过`Redth.PushSharp`库实现跨平台的推送通知服务,为iOS和Android用户提供实时的信息提醒。在实际开发中,开发者需要考虑推送的效率、...
4. 消息发送:通过调用推送服务API,将消息发送到指定的设备。 5. 推送反馈:接收并处理推送服务返回的状态信息,如成功送达、失败原因等。 为了实现高效且稳定的推送服务,开发者还需要考虑以下几点: - 错误处理...
APNs是苹果公司提供的一个服务,用于将推送通知发送到iOS设备、Apple Watch、tvOS设备以及macOS设备。当开发者需要提醒用户有新消息、更新或者应用内事件时,就会通过APNs实现。APNs有两种工作模式:Sandbox(沙盒...
"个推推送工具类"是专门用于Android和iOS平台的推送服务实现,它提供了一整套功能丰富的API和DTO(Data Transfer Object)数据传输对象,帮助开发者轻松地实现在移动应用中的消息推送功能。个推作为国内知名的第三方...
友盟推送服务是一款针对移动应用开发者提供的消息推送解决方案,它涵盖了Android和iOS两大主流操作系统,旨在帮助开发者提高用户活跃度、提升应用留存率以及进行精准的用户行为分析。在这个服务中,开发者可以向用户...
用于在iOS上实现APNS推送通知并在Android上实现Firebase的插件。 为什么制作此插件? 当前,唯一可用的推送通知插件是firebase_messaging 。 这意味着,即使在iOS上,您也需要设置Firebase并与Google通信以发送推...
极光推送(Aurora Push)是一款广泛应用于iOS和Android平台上的第三方消息推送服务,它能够帮助开发者实现向用户精准推送消息、更新应用内通知角标、设置用户别名等功能,从而提升用户活跃度和应用黏性。在这个项目中...
当你的应用接收到APNS推送的消息后,需要有一套处理流程来确保消息能够正确且及时地呈现在用户面前。这篇博客文章可能详细探讨了这一过程,但遗憾的是,具体的博客内容并未提供。 APNS推送消息到达后的处理流程大致...
在iOS应用开发中,苹果推送服务(Apple Push Notification service,简称APNs)是苹果提供的一种向用户设备发送通知的服务。`notnoop`是Java库,用于帮助开发者与APNs进行交互,实现远程推送通知功能。本文将深入...
`javapns.jar`是一个早期的项目,它提供了基本的APNs推送功能,而`javaapns.jar`强调了多线程支持,使得可以同时处理多个推送请求,提高推送效率。使用这些库时,开发者需要配置证书路径,创建推送消息对象,并调用...