iOS原生实现推送

一、iOS推送机制

Provider是给你手机应用发出推送消息的服务器,而APNS(Apple Push Notification Service)则是苹果消息推送服务器。你本地的服务器当需要给应用推送一条消息的时候,先要将消息发出到苹果推送服务器,然后再由苹果推送服务器将消息发到安装了该应用的手机。

接下来再看一张解释图:

根据上图的逻辑:

1. iOS应用需要去注册APNS消息推送功能;

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

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

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

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

二、申请推送证书

证书分为开发推送证书和生产推送证书,当在开发真机测试时使用开发推送证书.p12,在AdHoc(打包测试)及上线时使用生产推送证书.p12。

三、后台集成推送环境(集成以开发环境为实例)

接下来我们打开终端将他们生成.pem文件:

1.  把aps_development .cer文件生成.pcm文件,cd到push文件夹下

yangliang:~ apple$ openssl x509 -in aps_development.cer-inform der -out PushCert.pem

2.  将开发证书p.12生产.pem文件:

yangliang:Jpush apple$ openssl pkcs12 -nocerts -outPushCertKey.pem -in 生产证书.p12

进行该步骤是要验证证书的秘钥(需要验证两次密码ABC123)

Enter Import Password:

MAC verified OK

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:

yangliang:Jpush apple$

上边输入的密码则是你导出证书所设的密码,即ABC123 接着还会让你输入.pem文件的密码,还是使用ABC123好了,防止混淆。

这样我们在push文件夹中就又得到了两个文件,。

3.  把PushCert.pem和PushCertKey.pem合并为一个pem文件:

yangliang:Jpush apple$ cat PushCert.pem pushCertKey.pem> ck.pem

在push文件夹中又多了一个ck.pem文件,以上我们把需要使用的文件都准备好了

四、测试环境

为了测试证书工作的状况,我们可以使用“telnet gateway.sandbox.push.apple.com2195”来检测一下,如果显示:

yangliang:Jpush apple$ telnetgateway.sandbox.push.apple.com 2195

Trying 17.188.137.58...

Connected to gateway.sandbox.push-apple.com.akadns.net.

Escape character is '^]'.

则表示成功。

最后使用我们生成的证书和私钥来设置一个安全的链接去链接苹果服务器:

yangliang:Jpush apple$ openssl s_client -connectgateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushKey.pem

需要输入密码(ABC123我们刚才所设置的)。

当返回下面数据时则表示连接成功:

CONNECTED(00000003)

depth=1 /C=US/O=Entrust, Inc./OU=Seewww.entrust.net/legal-terms/OU=(c) 2012 Entrust, Inc. - for authorized useonly/CN=Entrust Certification Authority - L1K

verify error:num=20:unable to get localissuer certificate

verify return:0

---

Certificate chain

0s:/C=US/ST=California/L=Cupertino/O=AppleInc./CN=gateway.sandbox.push.apple.com

i:/C=US/O=Entrust, Inc./OU=See www.entrust.net/legal-terms/OU=(c) 2012Entrust, Inc. - for authorized use only/CN=Entrust Certification Authority -L1K

1s:/C=US/O=Entrust, Inc./OU=See www.entrust.net/legal-terms/OU=(c) 2012 Entrust,Inc. - for authorized use only/CN=Entrust Certification Authority - L1K

i:/O=Entrust.net/OU=www.entrust.net/CPS_2048 incorp. by ref. (limitsliab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Certification Authority(2048)

---

Server certificate

-----BEGIN CERTIFICATE-----

MIIFUTCCBDmgAwIBAgIRAP/KN+WwyNu6AAAAAFDYCGYwDQYJKoZIhvcNAQELBQAw

gboxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL

Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg

MjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxLjAs

BgNVBAMTJUVudHJ1c3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBMMUswHhcN

MTYwNTA1MTcyMjM1WhcNMTgwNTAyMTc1MjM0WjB0MQswCQYDVQQGEwJVUzETMBEG

A1UECBMKQ2FsaWZvcm5pYTESMBAGA1UEBxMJQ3VwZXJ0aW5vMRMwEQYDVQQKEwpB

cHBsZSBJbmMuMScwJQYDVQQDEx5nYXRld2F5LnNhbmRib3gucHVzaC5hcHBsZS5j

b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDu8g0rJ6zbAczB/gpg

QSDkK9ftwW38Z8bAgsV1uZXvYfjmq8h69bIy0v1TMie03mEMSm/WVHWisCFSJSIG

11QX3Z6mgw+Qff4M3VccSTZaPiEofCp/feUXQqzImBhe4/RVyem9n6ZURAYyWYN9

4xTedpSgvQQb5aTnEpmTGMgxL7pKBRRErtKB6PlqixJ176AisR4Q2KxVYwGakM9e

a34qj+qbVu+v6B8XXV1CUA4OmS59dpQ5YXBYdHFEaqaDs+IhUrElB2hAg7Gcc649

O/EeQqjs8VwsmGM+FYIftvfkyCfeJz1Lfk9fdNMcAm4jWh/n2LzqPT1fZaDS9L1E

z1vjAgMBAAGjggGVMIIBkTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB

BQUHAwEGCCsGAQUFBwMCMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZW50

cnVzdC5uZXQvbGV2ZWwxay5jcmwwSwYDVR0gBEQwQjA2BgpghkgBhvpsCgEFMCgw

JgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvcnBhMAgGBmeBDAEC

AjBoBggrBgEFBQcBAQRcMFowIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmVudHJ1

c3QubmV0MDMGCCsGAQUFBzAChidodHRwOi8vYWlhLmVudHJ1c3QubmV0L2wxay1j

aGFpbjI1Ni5jZXIwKQYDVR0RBCIwIIIeZ2F0ZXdheS5zYW5kYm94LnB1c2guYXBw

bGUuY29tMB8GA1UdIwQYMBaAFIKicHTdvFM/z3vU981/p2DGCky/MB0GA1UdDgQW

BBQilGEKLJhxmPA0qq6OtdmvSADjszAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUA

A4IBAQB9KaD/0IUHBykbu1detIDPgDCkvEkcTg+Aoge6h1yj1wkSv3d94mJif+jy

/p9Yz0Uf69d7tMAK8nrefin4cBFSdJpj9HSk0AUaQoDFAz+BLuGMN8J05iwWKYf+

IkS7sr+z3RgGkFyH9XCMAu+MrvCz/r+SIuM6AO2/F/iwmBU1UrerbCjBfPxM+sNB

BU0lUv0w0Xm3/ZyDh+Em0u15vM8D4NtkK6v0K+3GdgBU6xGgpX68eqszSIbkRzMu

Hke/uLEPEGV/r6N1NSgQqbajUVgqUCrG3GPHsmuVHCFWSP1YYc+2FwKYOLEUgbma

yYBeaZ+LYzqYxyZzBvj+jTaRKi56

-----END CERTIFICATE-----

subject=/C=US/ST=California/L=Cupertino/O=AppleInc./CN=gateway.sandbox.push.apple.com

issuer=/C=US/O=Entrust, Inc./OU=Seewww.entrust.net/legal-terms/OU=(c) 2012 Entrust, Inc. - for authorized use only/CN=EntrustCertification Authority - L1K

---

Acceptable client certificate CA names

/C=US/O=Apple Inc./OU=Apple CertificationAuthority/CN=Apple Root CA

/C=US/O=Apple Inc./OU=Apple CertificationAuthority/CN=Apple Application Integration Certification Authority

/C=US/O=Apple Inc./OU=Apple WorldwideDeveloper Relations/CN=Apple Worldwide Developer Relations CertificationAuthority

/C=US/ST=CA/L=Cupertino/O=AppleInc./OU=Internet Software and Services/CN=iCloudTest/emailAddress=APNS-Dev@group.apple.com

/CN=Apple Application Integration 2Certification Authority/OU=Apple Certification Authority/O=Apple Inc./C=US

---

SSL handshake has read 3522 bytes and written2155 bytes

---

New, TLSv1/SSLv3, Cipher is AES256-SHA

Server public key is 2048 bit

Secure Renegotiation IS supported

Compression: NONE

Expansion: NONE

SSL-Session:

Protocol  : TLSv1

Cipher    : AES256-SHA

Session-ID:

Session-ID-ctx:

Master-Key:7BD6F71EAF67BDB0ED6186E7471DDC701E255FE10CD6647DBC82A05D83BE682BC704E293EE85AC6A5B094DB70542E2A9

Key-Arg   : None

Start Time: 1480319802

Timeout   : 300 (sec)

Verify return code: 0 (ok)

---

五.服务器端推送脚本(PHP):

将iOSJpush.php这个推送脚本也放在push文件夹中(iOSJpush.php见附件):

deviceToken填写你接收到的token,passPhrase则填写你的ck.pem设置的密码(即ristone2016)。

使用终端进入到push文件夹,在终端输入

$ php iOSJpush.php

Connected to APNS

Message successfully delivered

若显示以上提示则表示推送成功了。

附上推送图片:

iOSJpush.php

<?php

// ??????????deviceToken???????????????

//ios10

//$deviceToken = '715458212b09cf55c3385cc665f76a187f5abcd9db3f1888a9a69a60ee14413d';

//ios9

$deviceToken = 'e0cba87a9c99769c5fe1051fa3ac5b8fade2aaa6e732742c39a8dad3d46d4111';

// Put your private key's passphrase here:

$passphrase = 'ABC123';

// Put your alert message here:

$message = '[晨读]马上到吃饭时间了';

$ctx = stream_context_create();

stream_context_set_option($ctx, 'ssl','local_cert', '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);

//?????????????appstore??????

$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',

'badge' =>+1,

'type' =>1

);

// 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);

?>

iOS实现服务器原生推送相关推荐

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

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

  2. 服务器主动推送消息数据给客户端

    1 引言 这个问题第一次是我在实现一个导师的方案的时候所发现的,一开始我需要实现服务器与客户端的密钥协商和数据传递,服务器需要主动分发(推送)密钥给客户端,因为以前没有做过相关编码,后来只能想到用反向 ...

  3. 传腾讯计划出售美团全部股权,知情人士辟谣;苹果证实iOS 16要大量推送广告;Linux 6.0-rc1 发布|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  4. 传腾讯计划出售美团全部股权,知情人士辟谣;苹果证实iOS 16要大量推送广告;Linux 6.0-rc1 发布|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  5. IOS开发之----远程推送通知

    原文地址:IOS开发之----远程推送通知作者:倒計時 玩了一年的iPhone了各种App的远程通知接收了不少,每次接收到的时候,就在反思,这丫的怎么实现的! 由于工作方面一直没有接触的机会,所以只好 ...

  6. iOS客户端如何测试推送

    当我们在客户端实现推送跳转需求后,但是服务器还没有做好后台的配置,此时需要测试收到推送消息之后能否按照预期,执行我们的代码.但在这个情况下如何去做呢.这里可以提供给大家两个选择. 1. 封装好处理逻辑 ...

  7. 苹果iOS系统下的推送机制及实现

    苹果iOS系统下的推送机制及实现 浏览:785次  出处信息 width="336" height="280" frameborder="0" ...

  8. python http2_实战 | Python使用HTTP2实现苹果原生推送

    原标题:实战 | Python使用HTTP2实现苹果原生推送 本文约 4405 字,读完可能需要 6 分钟. 作者:风中纸鸢 原文: 说起苹果的推送,可能很多开发人员就开始头疼了,因为实现苹果推送服务 ...

  9. iOS开发之消息推送 —— 远程消息推送入门

    每次看到iOS的远程消息推送,总是感觉很头大,即便后来项目都做完了,还是觉得摸不着远程推送的脉门,网上介绍的资料虽多,但不是写的太简单了,就是写的太详细了,不能一下抓住要点,今天终于能够抽出点时间,来 ...

最新文章

  1. Linux端日志加密,Linux学习--第十三天--日志、系统运行级别、grub加密
  2. (译)如何使用box2d来做碰撞检测(且仅用来做碰撞检测)
  3. Centos 安装Docker
  4. Kotlin实战指南六:可空类型、非可空类型
  5. 使用SQLPLUS生成HTML报表
  6. android miui ios,从iOS到Android——小米11及小米生态实际使用体验
  7. 95-36-210-ChannelHandler-系统Channel-TimeoutHandler1
  8. 备份k8s_树莓派k8s集群安装kafka集群及监控
  9. php指定编码创建,MYSQL创建数据库时指定编码
  10. 关于Tuxera NTFS mac还有你不知道的用法!教程来啦!
  11. 酒店ETL管理解决方案
  12. flutter 仿微信朋友圈发布图片
  13. 500VIP源码下载
  14. Dubbo3的Triple协议踩坑记录
  15. [转]拍照怎么搜题?(下)
  16. 观念理解论创业设计思维
  17. H5移动端滑动表格固定表头和首列(纯css实现)
  18. ssm毕设项目校园排球联赛管理系统y513u(java+VUE+Mybatis+Maven+Mysql+sprnig)
  19. tesseract验证码训练部骤
  20. 【实战】聊聊幂等设计

热门文章

  1. 过亿海量数据处理分析
  2. RISC-V SiFive U64内核——HPM硬件性能监视器
  3. MySQL 数据库连接
  4. 数据处理之one-hot
  5. 百度地图查询数据结果
  6. 用PS调出人像冷色艺术效果
  7. ws2812驱动总结(包括对时序的详细分析,代码基于STC15系列单片机)
  8. CF514B Han Solo and Lazer Gun
  9. 红米5plus刷android one,安卓刷机必备!TWRP恢复工具添加支持红米5/雷蛇手机
  10. virtualenv virtualenvwrapper