结合网上各个资料,再简单整理的一份。

一、APNS推送说明

1.你的IOS应用需要去注册APNS消息推送功能。

2.当苹果APNS推送服收到来自你应用的注册消息就会返回一串device token给你(很重要)

3.将应用收到的device Token传给你本地的Push服务器。

4.当你需要为应用推送消息的时候,你本地的推送服务器会将消息,以及Device Token打包发送到苹果的APNS服

5.APNS再将消息推送给目的iphone

二、推送的准备工作

推送准备的主要就是1、推送证书 2、导出的密钥文件  3、下载的描述文件

1、APP ID创建

先创建APP ID,名字为PustTest, Bundle ID 为com.公司名.testpush

直接点击下一步,完成创建。

2、生成证书

证书选择Push推送证书,下一步选择刚刚创建的APP ID

添加从钥匙串导出的请求文件

下一步->下载推送证书。

3、描述文件创建下载

描述文件选择Development, 如果这里选择选择下面的生产,则项目可能会闪退。下一步也是选择刚刚创建的APP ID,然后选择设备一步步,最后下载描述文件。

4、密钥导出

双击下载的证书文件,会在钥匙串登陆-我的证书里生成一个新的证书,右击导出证书,名字设置为 push.p12

导出的密码要记得,推送要用,我设置位aaa123;

5,整理

将密钥,证书,和描述文件,放到桌面的一个文件夹里,文件夹名字设置为 "push";

6,文件转换pem

推送该准备的文件都准备好了,然后开始做推送,将密钥和证书转换成pem文件。打开电脑里的终端,生成pem文件需要用到终端命令。

首先用终端命令打开桌面的push文件夹“ cd ~/desktop/push  ” 回车;

把证书文件生成pem文件命令“  openssl x509 -in aps_development.cer -inform der -out PushCert.pem  ”

把密钥p12文件生成pem文件命令“  openssl pkcs12 -nocerts -out PushKey.pem -in push.p12  ”,回车后需要输入三次密码,也就是导出时候的密码aaa123

然后把两个pem文件合并成一个pem文件,命令:“  cat PushCert.pem PushKey.pem > ck.pem  ”,这样桌面的push文件夹就有6个文件了

测试推送证书能否正常运行,输入终端命令“ telnet gateway.sandbox.push.apple.com 2195 ”,如果运行如下,则一切正常。

连接苹果服务器APNS,终端命令“  openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushCert.pem -key PushKey.pem  ”

回车后输入密码 aaa123,返回一堆数据,最后截图如下。表示没问题。

7、项目配置

新建项目,Bundle ID 设置和APP ID里一样testpush,Code  Signing选择描述文件和开发账号,

AppDelegate.m里设置注册,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
{
//IOS8
//创建UIUserNotificationSettings,并设置消息的显示类类型
UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:nil]; [application registerUserNotificationSettings:notiSettings];
[application registerForRemoteNotifications]; } else{ // ios7
[application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert)];
} self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible]; // self.mainView = [[ViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
self.window.rootViewController = [ViewController alloc];
return YES;
}

其他回调方法

// 处理推送消息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSLog(@"userinfo:%@",userInfo);
NSLog(@"收到推送消息:%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
} //注册失败回调
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *) error
{
NSLog(@"Registfail%@",error);
} //返回设备表示device token
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"设备标示%@",deviceToken);//这里的Token就是我们设备要告诉服务端的Token码
}

运行后得到标示device token “f465312ab96e2dfd35829d1c6f898a019b01141615745f5b41a4db4a312870a0”

8、PHP本地服务器

测试通知效果需要一个php文件,里面填入获取的标示,密钥导出的密码,和合并文件 ck.pem

<?php
$deviceToken = 'f465312ab96e2dfd35829d1c6f898a019b01141615745f5b41a4db4a312870a0';//获取请求参数中的deviceToken
$passphrase = 'aaa123'; //mimi
$message = '这是一条推送消息';//获取请求参数中的想要推送的信息
///打印 查看
echo $deviceToken;
echo $message; // Put your alert message here: 设置你申请好并转换好的证书和密码
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');//ck.pem
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); // Open a connection to the APNS server //$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err,$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) exit("Failed to connect: $err $errstr". PHP_EOL); echo' Connected to APNS'. PHP_EOL; // Create the payload body $body['aps'] = array('alert' => $message,'sound' => 'default'); // Encode the payload as JSON $payload = json_encode($body); // Build the binary notification $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if (!$result) echo'Message not delivered'. PHP_EOL; else echo'Message successfully delivered'. PHP_EOL; // Close the connection to the server fclose($fp); ?>

php文件下载:http://pan.baidu.com/s/1bi3Lym

9、推送命令

将配置好的php文件同样放到桌面的push文件夹里。运行终端命令,给标示手机推送一个通知 “这是一条推送消息”

先用终端命令ck打开push文件夹,再调用运行push.php文件,运行命令:“  php push.php  “

手机端收到通知消息。

注:本文主要内容都是参考网上其他博客内容,稍微整理。

iOS 通知推送APNS的更多相关文章

  1. iOS 消息推送(APNs) 傻瓜式教程

    也可以去我的简书页面查看这篇文章 首先: 1.做iOS消息推送需要真机测试 2.做iOS消息推送需要有付费的开发者账号 是否继续看帖? 先学习一下相关的知识吧! 因为中途可能会遇到一些问题,这篇文章或 ...

  2. 一次IOS通知推送问题排查全过程

    原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 发现问题 在上周一个将要下班的夜晚,测试突然和我打招呼,说IOS推送的修复更新上线后存在问题,后台报错. 连忙跑到测试那 ...

  3. IOS之推送通知(本地推送和远程推送)

    推送通知和NSNotification是有区别的: NSNotification:是看不到的 推送通知:是可以看到的 IOS中提供了两种推送通知 本地推送通知:(Local Notification) ...

  4. iOS的推送机制APNs:本地推送&远程推送

    本地推送: 本地推送主要应用在备忘录,闹钟等本地的,基于时间定时的消息提醒.本篇不做详细描述. 远程推送:APNS(苹果推送通知服务) iOS远程推送机制的原理及流程: 注册推送(橙色部分):若该Ap ...

  5. iOS 10推送通知开发

    原文地址:Developing Push Notifications for iOS 10,译者:李剑飞 虽然通知经常被过度使用,但是通知确实是一种获得用户关注和通知他们需要更新或行动的有效方式.iO ...

  6. (七十三)iOS本地推送通知的实现

    iOS的推送通知分为本地推送和网络推送两种,如果App处于挂起状态,是可以发送本地通知的,如果已经被杀掉,则只有定时通知可以被执行,而类似于QQ的那种网络消息推送就无法实现了,因为App的网络模块在被 ...

  7. iOS原生推送(APNS)进阶iOS10推送图片、视频、音乐

    代码地址如下:http://www.demodashi.com/demo/13208.html 前言 我们首先要在AppDelegate里面进行iOS的适配,可以参考这篇文章 iOS原生推送(APNS ...

  8. xamarin.ios 本地通知推送

    由于ios10版本以后UILocalNotification被标为弃用了,所以要添加新的本地通知推送功能,下面提供一些代码参考. 一.先在AppDelegate.cs上注册本地通知推送功能. publ ...

  9. ZPush--基于netty4实现的苹果通知推送服务(APNs)Javaclient

    简单说下实现苹果通知推送服务(APNs)client的一些要注意的地方: 使用长连接: sanboxserver是无用的,调试时直接用"gateway.push.apple.com" ...

随机推荐

  1. 【php增删改查实例】第二十二节 - 引入百度地图

    20.用户新增地址字段 在实际的开发中,经常会出现对数据表新增或者修改字段的事情,所以,当用户提出加字段的需求时,我们的页面以及后台程序都要进行相应的改动. 本节就以增加一个地址字段为例. 打开nav ...

  2. samba故障:protocol negotiation failed: NT_STATUS_IO_TIMEOUT

    windows下无法访问samba共享目录,若无任何提示则需要到linux服务器上访问samba共享,看下是否有问题提示 故障解决过程:(保证网络通畅) 1.查看samba服务器是否正常,smb服务器 ...

  3. 我的微软最有价值专家(Microsoft MVP)之路

    一.写在前面 2018年对我来说是幸运的一年,对我来说最幸运的事情有两个,一个是在离驾照考试过期还有一个月(报名之后一直没去考)终于拿到了我的驾照,还有一件事莫过于获得了微软MVP.期间,一直有朋友问 ...

  4. Java多线程核心技术(六)线程组与线程异常

    本文应注重掌握如下知识点: 线程组的使用 如何切换线程状态 SimpleDataFormat 类与多线程的解决办法 如何处理线程的异常 1.线程的状态 线程对象在不同运行时期有不同的状态,状态信息就处 ...

  5. 【小技巧】css文字两端对齐

    一.文字两端对齐方法:  text-align-last: justify; 二.举个丽子:  三.效果如下:  四.注意:  要使文字在容器中两端对齐,该容器需要是一个块级元素,要有自己的宽度.

  6. java 类与类,类与接口 ,接口与接口关系

    类: 生活中类是人们对客观事物不断认识而产生的抽象概念,而对象则是现实生活中的一个个实体 面向对象程序设计中,对象是程序的基本单位,相似的对象像变量和类型的关系一样归并到一类,所以,并不先具体地定义对 ...

  7. Gym 101873F Plug It In(二分图匹配)

    题目链接:http://codeforces.com/gym/101873/problem/F 题意:有n个插孔,m个机器,和一个插板,一个插孔可以连接一个机器,插板可以使一个插孔连接三个机器,找到最 ...

  8. 关于XLL加载项动态加载、卸载的演示及XLL函数自定义类型注册的演示

    1.在XLL中,把函数定义成不同的类型,在Excel中的实际效果也不同,具体如下: pxMacroType value                                          ...

  9. 解决ImportError: cannot import name 'webdriver' from 'selenium' (C:\Users\Mr.Su\PycharmProjects\***\venv\selenium.py)

    报错信息如下图所示: 解决方案:将项目根目录下的自己创建的selenium.py文件重命名.

  10. Composer之搭建自己的包工具

    作为一个标准的PHPer,必须学会优雅的使用composer,最近,萌生了一个想法,我们每搭建一个项目,里面都会有许多的公用的方法和类库,每次使用的时候就是将其拷贝过来,或者重新写一遍,过于繁琐,效率 ...