[转]iOS 远程推送(APNs)
我是搬运工。原帖:http://blog.csdn.net/lifengzhong/article/details/7737028
目录(?)[-]
- 一简介
- 二使用步骤
- step1
- step2
- step3
- step4
- step5
- 三其他注意事项
一:简介
在使用APNS之前,有这么几点需要了解:
1:APNS是免费的。只要有开发者账号便可以申请APNS证书。
2:APNS又是不可靠的,苹果对信息推送的可靠性不做任何保证。
3:APNS对消息的大小是有限制的,总容量不能超过256字节。
清楚了以上三条,各位应该对APNS适用的应用情景有所了解了。
APNS的工作流程如下图所示:
1 & 2:用户第一次安装应用并第一次启动时,会弹出对话框提示应用需要开通推送,是否允许,如果允许,应用会得到一个硬件token。
有三点需要注意:
第一,此token唯一与设备相关,同一设备上不同应用获取的token是一样的;
第二,当应用被卸载,然后重新安装时,确认对话框不会再出现,自动继承前一次安装的设置信息;
第三,推送设置可以在设置-通知中进行更改。可以选择开启消息框、声音以及badge number中的一种或多种。
3:应用将受到的token发送到服务端,也就是APNS消息的源头。
4:应用服务器通过token及证书向苹果的消息服务器发送消息。
5:苹果将接收到的消息发送到对应设备上的对应应用。
6:如果应用未处于Active状态(未启动或backgroud),默认设置下,屏幕顶部会弹出消息框,同时有声音提示,点击改消息框会进入应用,如不点击则应用图标上会有badge number出现。
二:使用步骤
APNS的使用并不复杂,但容易出错的环节比较多,特别是证书申请的部分,要特别的注意。
下面根据我按教程实际操作的步骤进行阐述:
准备工作:
A: 一个Xcode工程,我们将其命名为MyPushChat,以及一个对应的App ID.
B:一台能用于调试的iOS设备(APNS只能在实体设备上工作,模拟器无法运行)
step1:
在"应用程序-使用工具"中打开"钥匙串访问"(Keychain Access),如下图所示:
在接下来的对话框中选择存储到磁盘,邮件可随意填写,名称命名为MyPushChat
点击“继续”,将文件名设为"MyPushChat",点击存储。这样,会得到一个名为"MyPushChat.certSigningRequest"的文件,此文件要妥善保管。
从刚刚创建的csr文件中到处私钥,具体操作如下图所示:
将导出的文件命名为MyPushChatKey.p12,并输入密码,请牢记此密码,这里姑且设为123456abc。
此时,我们已有文件MyPushChat.certSigningRequest,以及MyPushChatKey.p12
step2:
在App IDs中找到与MyPushChat对应的AppID, 点击右侧"Configure"按钮,勾选下图所示选择框:
点击”Development Push SSL Certificate“右侧的configure按钮,development版本的应用于测试,有效期只有一年,且只能使用苹果的APNS测试服务器,应用发布时需要申请Distributions版本的证书。Development与Distribution版本的证书获得的Token是不一样的。弹出框如下所示:
上传"MyPushChat.certSigningRequest"并点击Generate,片刻后证书生成完毕,下载,命名为“aps_developer_identity.cer”。
step3:
打开Provision Portal,点击New Provision,将Provision File命名为"MyPushChat",选择对应的App ID 以及Device并下载。得到文件MyPushChat.provision。双击导入此MyPushChat.Provision文件,如果一切正常,会弹出Orgnizer, 且显示界面如下所示:
step4:
将上面得到的文件都保存到桌面。打开Console,切换到桌面。
首先将aps_developer_identity.cer转换成MyPushChat.cert
命令:openssl x509 -in aps_developer_identity.cer -inform der-out MyPushChatCert.pem
然后将私钥文件转换为MyPushChatKey.pem
命令:
openssl pkcs12 -nocerts -out MyPushChatKey.pem -in MyPushChatKey.p12
Enter Import Password:
此处密码输入为前面为私钥设置的密码: 123456abc
MAC verified OK
Enter PEM pass phrase:
这里一定要输入新密码,我们设为123456abc
Verifying - Enter PEM pass phrase:
下一步,将MyPushChatKey.pem及MyPushChatCert.pem合成一个pem文件:
命令:cat PushChatCert.pem PushChatKey.pem > ck.pem
最后,测试一下得到的ck.pem文件
首先运行:
命令:telnet gateway.sandbox.push.apple.com 2195
如果网络正常,会出现如下所示,ctrl + C终止连接。
Trying 17.172.232.226...
Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is '^]'.
然后使用ssl测试连接
命令:openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert MyPushChatCert.pem -key MyPushChatKey.pem
输入密码123456abc后,如果一切正常,会出现很多的输出,你将可以输入若干字符,回车后,连接将中断。
到此,最繁琐与易错的过程已经完成,证书相关工作到此为止了,进入编码阶段~
step5:
1:
在项目MyPushChat中AppDelegate.m的didFinishLaunchingWithOptions中加入如下代码
- [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
- (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
本句代码的作用为在应用第一次启动时弹出对话框让用户确认是否开启消息推送,本句注册的消息类型有BadgeNumber, 声音, 顶部消息框. 可以选择其中的一种或多种。
2:
在AppDelegate中加入如下代码:
- - (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
- {
- NSLog(@"My token is: %@", deviceToken);
- }
- - (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
- {
- NSLog(@"Failed to get token, error: %@", error);
- }
如果获取token成功,运行后控制台中会有如下格式的输出:
My token is:<740f4707 bebcf74f 9b7c25d4 8e335894 5f6aa01d a5ddb387 462c7eaf 61bb78ad>
将尖括号内容保存,稍后使用
同样,在AppDelegate中加入如下代码
- - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
- {
- if ( application.applicationState == UIApplicationStateActive ) {
- // 程序在运行过程中受到推送通知
- NSLog("%@", [[userInfo objectForKey: @"aps"] objectForKey: @"alert"]);
- } else {
- //程序为在运行状态受到推送通知
- }
- }
上面这段代码处理了应用分别在运行和非active状态下接收推送通知的处理方式。
3:
下载php样例程序,将其中的devicetoken字段设为刚才保存的token,注意,去掉空格。
将password设为123456abc,将message设为你想设置的内容,保存,然后命令行下进入php源码路径,运行php simplepush.php
如果人品够好,你的设备上马上会咚咚的响一下~
三:其他注意事项
1:可以使用如下代码判断开启了那些类型的消息通知:
- UIRemoteNotificationType enabledTypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
- if (enabledTypes & UIRemoteNotificationTypeBadge) {
- //开启badge number
- }
- if (enabledTypes & UIRemoteNotificationTypeSound) {
- //开启声音
- }
- if (enabledTypes & UIRemoteNotificationTypeAlert) {
- //开启alert
- }
2: 推送服务端推荐使用Javapns, 使用很简便,注意其使用的证书文件不是pem,而是p12格式,具体生成方法为:
一:生成csr文件(同上)
二:通过csr在苹果网站上生成cert文件(同上)
三:双击导入生成的cert文件,在keychain中同时选中csr的专用秘钥及刚刚导入的ssl证书,右键->导出, 保存为p12
其他过程相同
3: 如果有把握,可以直接使用distribution版的证书和provision文件,但线上服务器有一定的限制,如果使用不当,会被苹果当ddos ban掉。
4:苹果的推送服务器会向应用服务器返回一个发送结果,对于一直失败的目标,应用服务端需要进行处理。
5:传送的message为json格式,可以在其中加入自己的字段,但同样,总大小不能超过256字节。
参考文献
苹果推送通知服务教程
Apple Push Notification Services Tutorial: Part 1/2
APNS官方文档
转载于:https://www.cnblogs.com/madordie/p/4052746.html
[转]iOS 远程推送(APNs)相关推荐
- iOS远程推送原理及实现过程
该文章是我16年在公司博客上写的,除了证书注册的过程大致没有改变,像接收通知的方法都有所改变,所以将iOS 10 之后的接收通知及注册通知的方法在文章中补全,希望对正在处理远程推送的伙伴们有所帮助 一 ...
- iOS 远程推送 总结
首先,让我们看看jpush的申请证书以及配置教程http://docs.jpush.io/client/ios_tutorials/#ios-sdk 相关配置完成后,我们就来实现相应的远程推送功能. ...
- IOS 苹果推送 APNS(三)
1.实现provider向APNS推送消息 在通过provider向APNS发送消息之前,我们首先需要了解需要发送的格式,APNS的信息结构包如下图: 上图显示的这个消息体就是我们的服务器(Provi ...
- Apple 远程推送APNS 服务
APP注册APNS流程 http://mobiforge.com/design-development/programming-apple-push-notification-services 服务器 ...
- iOS远程推送自定义语音合成播放声音(类似支付宝收款提醒)
本文参考文章 iOS 模仿支付宝支付到账推送,播报钱数,看上面写的一些不是很详细遇到了许多问题,这里特意自己总结了一下.将我遇到的问题以及解决方案给罗列出来供大家参考. iOS10之后的Service ...
- 客户端技术:一文带你了解iOS消息推送机制
导语 | 消息推送我们几乎每天都会用到,但你知道 iOS 中的消息推送是如何实现的吗?本文将从推送权限申请,到本地和远程消息推送,再到 App 对推送消息的处理等多个步骤,详细介绍 iOS 中消息推送 ...
- MASA MAUI Plugin (十)iOS消息推送(原生APNS方式)
背景 MAUI的出现,赋予了广大.Net开发者开发多平台应用的能力,MAUI 是Xamarin.Forms演变而来,但是相比Xamarin性能更好,可扩展性更强,结构更简单.但是MAUI对于平台相关的 ...
- # MASA MAUI Plugin (十)iOS消息推送(原生APNS方式)
MASA MAUI Plugin (十)iOS消息推送(原生APNS方式) 背景 MAUI的出现,赋予了广大Net开发者开发多平台应用的能力,MAUI 是Xamarin.Forms演变而来,但是相比X ...
- IOS消息推送之APNS
一.背景概述: 1,环境配置 APNS:Apple Push Notification Service.本文对推送相关概念不再赘述,只侧重完整流程. Demo 开发环境:Mac os 10.9.4 ...
最新文章
- LeetCode实战:字符串相加
- Centos7 下nginx nginx-1.13.4 安装
- elasticsearch mapping之dynamic
- python 第一行 报错_初学Python-只需4步,爬取网站图片
- Dalsa线扫相机SDK下载和安装
- Linux之VM12+ CentOS7安装以及网络配置
- 【已解决】【Selenium】请教大神,知乎的注册页面如何切换到登录页面?
- obs,直播文字画面模糊处理
- Django笔记教程:三、Model进阶
- Mysql解决微信特殊符号昵称入库报错乱码
- 群晖 winscp php,WinSCP自动执行脚本
- 微信表情《程序员小黄第二季》上架啦!
- 七种PDF转Excel的转换方法,分分钟提高你的工作效率
- NANK南卡A2主动降噪耳机测评:长续航40dB深度降噪
- 哪个论文查重软件能保证查重效果?
- 5G打通云边端,自动驾驶、云游戏等应用加速演进
- URLConnection HttpURLConnection 网络请求
- Python 爬虫 之 爬虫的一些基本知识和基本操作(爬取视频、图片、获取网页源码等)整理
- 2022 hgame pwn wp
- php的内存马的原理与查杀方法
热门文章
- python一行代码的威力
- 检查等高线矛盾lisp_检查点线矛盾
- 2021年需要学习Python的自动化测试框架有哪些?你知道吗?
- linux防火墙伦堂,「linux专栏」自从看了这篇文章,我彻底搞懂了selinux和防火墙...
- python3基础知识点总结_python基础知识点总结
- 如何选择容器注册表?这里给出九个选项
- 如何在 Centos8 中安装 Lynis审计工具
- ASP.NET Web Pages – 文件夹简介
- 学习Linux命令神器-看不懂直接给你解释
- oracle rac应急_Support for Oracle RAC 框架资源组故障