关闭

苹果推送(APNs)ios push小结

614人阅读 评论(0) 收藏 举报
分类:

简介

推送服务APNs(Apple Push Notification services)

苹果的推送服务APNs基本原理简单来说就是:苹果利用自己专门的推送服务器(APNs)接收来自我们自己的应用服务器的需要被推送的信息,然后推送到指定的iOS设备上,然后由设备通知到我们的应用程序,设备以通知或者声音的形式通知用户有新的消息。推送的前提是装有我们应用的设备需要向APNs服务器注册,注册成功后APNs服务器会返给我们一个device_token,拿到这个token后我们将这个token发给我们自己的应用服务器,当有需要被推送的消息时,我们的应用服务器会将消息按指定的格式打包,然后结合设备的device_token一并发给APNs服务器,由于我们的应用和APNs维持一个基于TCP的长连接,APNs将新消息推送到我们设备上,然后在屏幕上显示出新消息来。

1.Device连接APNs服务器并携带设备序列号

2.连接成功,APNs产生device_token并返回给Device

3.Device携带获取的device_token向我们自己的应用服务器注册,一定要将device_token发送给我们的应用服务器,因为在推送过程中,首先是由我们的应用服务器将需要推送的消息结合device_token按指定格式(后面会提到)打包然后发送给APNS服务器,然后由APNS服务器推送给我们的设备。


推送消息是个JSON结构体,最大值是 256 字节。alert标签的内容就是会显示在用户手机上的推送信息,badge显示的数量(注意是整型)是会在应用Icon右上角显示的数量,提示有多少条未读消息等,sound就是当推送信息送达是手机播放的声音,传defalut就标明使用系统默认声音,如果传比如“beep.wav”就会播放在我们应用工程目录下名称为beep.wav的音频文件。

要在这个结构中新增自定义数据,请加在aps空间之外。比如后台推送消息给应用同时要求应用打开某个页面:

{"aps":{"alert":"张三:国庆回家吗?","sound":"default"},"msg":"这里是额外消息,不显示在通知界面上。"}

具体步骤

打开“钥匙串”程序,(证书助理->从证书颁发机构请求证书),只填邮箱和常用名称,ca不用填,然后保存.certSigningRequest文件到磁盘。

iOS Dev Center 点击App IDs进入App ID列表。

为 App 开启 Push Notification 功能。(推送证书分为两个版本,一个是Development版,一个是Production版,分别对应开发证书和发布证书。)

上传刚才生成的.certSigningRequest文件,生成aps_development.cer推送证书,双击安装。

打开“钥匙串”程序,(选择登录与我的证书选项后)找到IOS Push Services那条。

右键导出,存储为cert.p12,(输入密码P*d),然后将该证书的折叠打开,导出“专用密钥”。存储为key.p12

接下来打开终端生成cert.pem

openssl pkcs12 -clcerts-nokeys-out cert.pem -in cert.p12
生成key.pem(先输入导出key.p12时设置的密码P*d, 然后设置一个新的密码,如pushpwd,这个密码后面php推送时要设置)
openssl pkcs12 -nocerts-out key.pem -in key.p12
合并成ck.pem
cat cert.pem key.pem > ck.pem

将这个ck.pem放在服务器上,与发送脚本放在同一个目录下。 测试这个key

openssl s_client -connect gateway.sandbox.push.apple.com:2195-cert cert.pem -key ck.pem


iOS程序处理

应用如何获取deviceToken。应用必须先注册使用push功能。

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{//Let teh device know we want to receive push notifications[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
    returnYES;
}
 
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
    NSLog(@"My token is:%@", deviceToken);
}-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
    NSLog(@"Failed tp get token, error:%@", error);
}

客户端接收push消息

如果应用已经启动,将调用AppDelegate的方法:
 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary*)userInfo {// userInfo 就是push消息的Payload}
 
如果应用还没有启动,通过push冷启动后,仍然能在启动后获取Payload:
 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {NSDictionary* userInfo =[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
      NSLog(@"Payload: %@", userInfo);
  }

php推送程序

<?php/* ini_set("display_errors", "On");
error_reporting(E_ALL | E_STRICT); */
 
// Put your device token here (without spaces):$deviceToken='af93167751347b0909a05b97fefa1c7525dbbad0608cd63d19b11cbeb4a7878c';// Put your private key's passwd here:$passphrase='这时填你生成key.pem时设置的密码';
 
// Put your alert message here:$message='Welcome to www.elesos.com';
 
////////////////////////////////////////////////////////////////////////////////
 
$ctx=stream_context_create();stream_context_set_option($ctx,'ssl','local_cert','client.pem');stream_context_set_option($ctx,'ssl','passphrase',$passphrase);
 
// Open a connection to the APNS server$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,'badge'=>1,'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;elseecho'Message successfully delivered'. PHP_EOL;
 
// Close the connection to the serverfclose($fp);

参考

https://developer.apple.com/library/IOs/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html

一步一步实现iOS应用PUSH功能

http://www.dapps.net/dev/code/apple-push-notification-services-tutorial-part-1.html

一步一步教你做ios推送

http://www.cnblogs.com/gpwzw/archive/2012/03/31/apple_push_notification_services_tutorial_part_1-2.html

http://www.cnblogs.com/gugupluto/p/3534118.html

http://blog.csdn.net/kylinbl/article/details/6729369

苹果推送机制APNs(一)

苹果推送机制APNs(二)

http://docs.jpush.cn/pages/viewpage.action?pageId=1343727

http://saeapns.sinaapp.com/doc.html


0
0
查看评论

HTTP/2 协议用于 iOS 推送提醒服务 (APNS)

苹果最近更新了他们的推送提醒服务协议,APNS。这个新版本的协议基于HTTP/2和JSON,相比于旧的二进制协议,新的协议有了巨大改进。新的APNS协议基于HTTP/2: 新的特性和功能: 基于JSON的请求和响应 对于每个通知,如果成功响应,将会返回200标识 不用再去猜测通知是否被接收到 ...
  • Rodgexue
  • Rodgexue
  • 2017-02-16 14:13
  • 696

golang 实现 iOS http2 推送 Apns通知

由于要用到viop和远程推送通知 并使用go作为后台语言 就找到了开源的https://github.com/RobotsAndPencils/buford  作为代码使用,但是 发现 这个开源代码在 生产环境下 无法推送消息 一直提示 :  the Topic header ...
  • jeffasd
  • jeffasd
  • 2017-04-11 14:46
  • 2071

iOS 远程消息推送 APNS推送原理和一步一步开发详解篇

前言:现在第三方推送也很多 ,比如极光,融云,信鸽,其原理也是相同利用APNS推送机制 ,前段公司让做自己的推送,1.避免device token被第三方泄露,保护手机设备信息,2.第三方部分开始收费,一些免费的以后谁又知道呢 ,不如自己创建,除了后台麻烦点,需要数据库来存储token相关字段(后台...
  • YUXIANG19876021
  • YUXIANG19876021
  • 2016-08-16 09:42
  • 12442

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

1.本模块使用C++ 和 Openssl 代码 实现了一个简单的apns客户端 2.本文的姐妹篇:基于boost 的苹果apns消息推送实现(1) 3.最初使用的sslv23/sslv2/sslv3只能和apple 建立连接,但一直是handshake失败, 最后换tls连接,握手成功! o...
  • xiexievv
  • xiexievv
  • 2015-03-20 17:07
  • 4621

iOS Apns推送消息Json格式

iOS 10 之前 { "aps":{ "alert":"内容", "badge":1, "sound":"default" ...
  • zykccss
  • zykccss
  • 2017-02-27 21:18
  • 2984

iOS消息推送机制详解(Push Notify - APNS)

由于客户的应用需求,要求在应用软件种加入消息推送的提示,根据提示信息打开响应的连接。 故对apple的消息推送机制做了一番研究。 消息推送首先需要几个必要的东西: 1 SLL证书(申请证书的过程不在详述,只是注意需要消息推送应用程序的apple ID一定不能用通配符,这里有2个SLL证...
  • xufeidll
  • xufeidll
  • 2012-07-09 20:18
  • 7277

iOS 推送全解析,你不可不知的所有 Tips!

推送服务可以说是所有 App 的标配,不论是哪种类型的 App,推送都从很大程度上决定了 App 的 打开率、使用率、存活率 。因此,熟知并掌握推送原理及方法,对每一个开发者来说都是必备技能,对每一个依赖 App 的公司来说都至关重要。 从 iOS 10 新增的 UserNotifi...
  • he317165264
  • he317165264
  • 2016-09-18 15:57
  • 4195

IOS的 推送 和 长连接 的区别

概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情。iOS中通知机制又叫消息机制,其包括两类:一类是本地通知;另一类是推送通知,也叫远程通知。两种通知在iOS中的表现一致,可以通过横幅或者弹出提醒两种形式...
  • ribavnu
  • ribavnu
  • 2016-06-02 15:37
  • 3668

IOS 结合个推实现推送问题

一、准备工作 1、一台mac 2、一部iphone 3、苹果开发者认证的账号 二、开始 1、用mac申请一个CertificateSigningRequest.certSigningRequest,这个步骤百度一大堆。 2、苹果开发者中心管理后台,新建app,勾选apns服务,第一个是开...
  • moniteryao
  • moniteryao
  • 2016-02-22 11:52
  • 3707

苹果推送APNS的一个容易错误的地方

在网上看了很多的apns的介绍,我看了大多都是PHP的讲解如何服务器对接苹果服务器以及发送推送,我这边就不介绍苹果APNS的原理了,不过其中有几个需要介绍的地方。需要注意 一、苹果服务器有两种连接方式 1,HTTP/2,这是苹果APNS在2015年12月份弄出来的,这个新版本的协议基于HTTP/2和...
  • chuanhehuan1
  • chuanhehuan1
  • 2016-03-10 21:02
  • 3350
    个人资料
    • 访问:197378次
    • 积分:5784
    • 等级:
    • 排名:第5327名
    • 原创:378篇
    • 转载:0篇
    • 译文:0篇
    • 评论:29条
    博客专栏
    文章分类
    最新评论