前言:看这篇博客之前要准备:首先的有一个99刀的个人开发者账号或者199刀的企业开发者账号,其次你用的是apns消息推送,(本人之前四处打听有没有其他消息推送的方法:收获如下:首先如果想做到apns的效果,退出app后还能收到信息,只能用apns,其他的消息推送,xmpp不能像他一样,我也没用过,其次,apns相对来说没有那么耗资源)

最后你要对apns有一定的了解。网上很多,我就不多说了。

咳咳!开始

一 , 首先证书的准备,步骤:

  1  获取 CertificateSigningRequest.certSigningRequest证书

  2 获取   APPID 

  3 获取 aps_development.cer证书 

  4 获取  *.mobileprovision证书 

  5 获取    *.p12证书 

  如何获取CertificateSigningRequest.certSigningRequest证书

    点击前往实用工具->点击钥匙串访问-> 在证书助理里面选择从证书颁发机构请求证书,填写必要信息->之后存储即可,建议把所有证书存到一个push文件夹里面去

      

至此CertificateSigningRequest.certSigningRequest证书获取完毕,在你的push文件夹会有一个这样的证书。

获取APPIDs,在apple delopment登录你的账号,这里直接基本上全部下一步,没什么难的 ,注意的地方我都有标志的

  至此appids创建完毕

获取aps_development.cer证书

  

至此你的push文件夹里面应有这两个文件

获取  *.mobileprovision证书首先这一步之前你要保证你有一个设备已经注册了证书,,大概看这篇文章的人都是刚有开发者账号不就,所以这一步很多人都没做,导致后面的会出现no  Certificate的错误,不能继续下去,就不能获取*.mobileprovision,至于怎么获取这个证书,基本上与获取aps_development.cer证书一样,估计一张图大家就会明白了

之后真正的获取*.mobileprovision来了

  

至此*.mobileprovision证书获取完毕

获取p12证书,打开push文件,双击aps_development.cer,进入钥匙串选择含有我们刚才创建的appid的证书,右击导出,

至此准备工作已经完全搞定。

之后贴代码

iOS客户端

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSString* str = [UIDevice currentDevice];
NSLog(@"%@",str);
// Override point for customization after application launch.
//判断是否由远程消息通知触发应用程序启动
if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]!=nil) {
//获取应用程序消息通知标记数(即小红圈中的数字)
int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
if (badge>) {
//如果应用程序消息通知标记数(即小红圈中的数字)大于0,清除标记。
badge--;
//清除标记。清除小红圈中数字,小红圈中数字为0,小红圈才会消除。
[UIApplication sharedApplication].applicationIconBadgeNumber = badge;
}
}
//消息推送注册
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge];
return YES;
} #pragma 代理方法token NSString
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
// 获取终端设备的标志,这个标志需要通过结构发送到服务器端,服务器端推送消息到APNS时需要知道的终端的标志,APNS通过标志的终端标志来找到终端
NSString *token = [NSString stringWithFormat:@"%@",deviceToken];
NSLog(@"token ======= %@",token);
} -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
NSString *error_str = [NSString stringWithFormat: @"%@", error];
NSLog(@"Failed to get token, error:%@", error_str);
} -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
//在此处理接收到的消息。
NSLog(@"Receive remote notification : %@",userInfo);
}

这里要添加一个地方,三个代理方法,

在application didFinishLaunchingWithOptions:添加代码
添加三个代理方法
java服务端
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;
import org.junit.Test; public class PushDemo {
// 方法一
public static void main(String[] args)throws Exception{
// String deviceToken = "d4b3c5f3d497554f56f6f9791872666ae06e3b4e7abad6f4792dcd030007db91";
String deviceToken = "42b74bacb28414c856505e2e6d70fe7940540a8c8fa4c728b3338c9ec1575367";
String alert = "诶~你惨了~随时给你发垃圾信息~{{{(>_<)}}}~";//push的内容
int badge = 3;//图标小红圈的数值
String sound = "default";//铃音 List<String> tokens = new ArrayList<String>();
tokens.add(deviceToken);
String certificatePath = "/Users/etund/Desktop/push/证书.p12";
String certificatePassword = "123456";//此处注意导出的证书密码不能为空因为空密码会报错
boolean sendCount = true; try
{
PushNotificationPayload payLoad = new PushNotificationPayload();
payLoad.addAlert(alert); // 消息内容
payLoad.addBadge(badge); // iphone应用图标上小红圈上的数值
// payLoad.addCustomAlertBody("噢嘿嘿~捏嘻嘻~哇咔咔咔~"); if (!StringUtils.isBlank(sound))
{
payLoad.addSound(sound);//铃音
}
PushNotificationManager pushManager = new PushNotificationManager();
//true:表示的是产品发布推送服务 false:表示的是产品测试推送服务
pushManager.initializeConnection(new AppleNotificationServerBasicImpl(certificatePath, certificatePassword, false));
List<PushedNotification> notifications = new ArrayList<PushedNotification>();
// 发送push消息
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);
}
List<PushedNotification> failedNotifications = PushedNotification.findFailedNotifications(notifications);
List<PushedNotification> successfulNotifications = PushedNotification.findSuccessfulNotifications(notifications);
int failed = failedNotifications.size();
int successful = successfulNotifications.size();
System.out.println(failedNotifications);
System.out.println(successfulNotifications);
pushManager.stopConnection();
}
catch (Exception e)
{
e.printStackTrace();
}
} // 方法二
@Test
public void test2() {
/**APNS推送需要的证书、密码、和设备的Token**/
String p12Path = "/Users/etund/Desktop/push/证书.p12";
String password = "123456";
String pushToken = "42b74bacb28414c856505e2e6d70fe7940540a8c8fa4c728b3338c9ec1575367"; try {
/**设置参数,发送数据**/
ApnsService service = APNS.newService().withCert(p12Path,password).withSandboxDestination().build();
String payload = APNS.newPayload().alertBody("hello,www.mbaike.net").badge(1).sound("default").build();
service.push(pushToken, payload);
System.out.println("推送信息已发送!");
} catch (Exception e) {
System.out.println("出错了:"+e.getMessage());
}
}
}

至于java服务的jar包

至此服务端和客户端已经全部可以运行
最后看看运行效果
手机端

好了,结束!

全部原创,转载请说明出处。

oc学习之路----APNS消息推送从证书到代码(2015年4月26号亲试可用)的更多相关文章

  1. 基于C++ 苹果apns消息推送实现(2)

    1.该模块的用途C++ 和 Openssl 代码 它实现了一个简单的apns顾客 2.配套文件:基于boost 的苹果apns消息推送实现(1) 3.最初使用的sslv23/sslv2/sslv3仅仅 ...

  2. 【转】APNs消息推送完整讲解

    https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificat ...

  3. IOS 基于APNS消息推送原理与实现(JAVA后台)

    Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Pu ...

  4. APNs消息推送完整讲解

    在项目的AppDelegate中的didFinishLaunchingWithOptions方法中加入下面的代码: [[UIApplication sharedApplication] registe ...

  5. 转:IOS 基于APNS消息推送原理与实现(JAVA后台)

    Push的原理: Push 的工作机制可以简单的概括为下图   图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple ...

  6. IOS 基于APNS消息推送原理与实现(JAVA后台)--转

    Push的原理: Push 的工作机制可以简单的概括为下图   图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple ...

  7. iOS 基于APNS消息推送原理与实现(包括JAVA后台代码)

    Push的原理: Push 的工作机制可以简单的概括为下图   图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple ...

  8. APNS消息推送实现

    转自:http://blog.csdn.net/biaobiaoqi/article/details/8058503 一.消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图1-1: 1 ...

  9. 基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)

    1.前言 本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力. 这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用: 1)IM即时通讯 ...

随机推荐

  1. python @property 属性

    在绑定属性时,如果我们直接把属性暴露出去,显然不合适,是通过getter和setter方法来实现的,还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性: class P ...

  2. urllib2.urlopen超时问题

    urllib2.urlopen超时问题 没有设置timeout参数,结果在网络环境不好的情况下,时常出现read()方法没有任何反应的问题,程序卡死在read()方法里,搞了大半天,才找到问题,给ur ...

  3. MemSQL Start[c]UP 2.0 - Round 2

    反正晚上睡不着,熬到1点开始做比赛,6个题目只做了2个题目,而且手速还比较慢,待提升空间还很大呢. A题:给定两个0,1串(len<=100000), 但是不是普通的二进制串,而是q进制串,q ...

  4. oracle database resident connection pooling(驻留连接池)

    oracle在11g中引入了database resident connection pooling(DRCP).在此之前,我们可以使用dedicated 或者share 方式来链接数据库,dedic ...

  5. 《深入理解linux内核》第二章 内存寻址

    三种不同的内存地址 逻辑地址(logical address)包含在linux实际指令中的地址,即分段式地址,是对应的硬件平台段式管理转换前地址由16位的段选择符(segment selector)和 ...

  6. 【HDOJ】3660 Alice and Bob's Trip

    就是一个基本的dfs.可关键问题是c/c++/g++光输入就超时了.还是写java过的,毕竟时限4s.都放弃希望了,没想到还真过了. import java.lang.*; import java.i ...

  7. 【HDOJ】1756 Cupid's Arrow

    图论,点在多边形内部的判定. /* 1756 */ #include <iostream> #include <string> #include <map> #in ...

  8. ASP.NET 導入Excel

    常常碰到這種需求,為了避免自己每次寫Code都要東翻西找Sample,乾脆丟上來當備份 此外,也為了方便網路上的大大們Copy Paste方便,小弟已經順便標示要複製程式碼的起始結束位置 在歡樂的貼程 ...

  9. phpcms v9会员中心文件上传漏洞

    漏洞版本: phpcms v9 漏洞描述: PHPCMS V9采用OOP(面向对象)方式自主开发的框架.框架易扩展,稳定且具有超强大负载能力. phpcms v9会员中心上传头像处可未经过充分过滤,攻 ...

  10. MFC CVIew关闭时崩溃

    记得看视频的时候老师说过    创建CView的时候,也就是创建视图的时候,不要使用  Cview      m_view;这种方式 而是使用Cview  *  pView=new   Cview() ...