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. 清华AI学堂班:姚期智担任首席教授,2019年首批招收30人
  2. 有序标称变量(Categorical Features)编码为数值变量(Continuous Features​​​​​​​)详解及实践
  3. JAVA I/O系统。
  4. map/reduce的概念
  5. python编程思维培养_Python教学:编程如何培养学生计算思维-最新教育资料
  6. 程序高手和菜鸟的区别是什么?
  7. Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组...
  8. CGContext转CC
  9. Octave入门基础
  10. 最简单的基于FFmpeg的libswscale的示例附件:测试图片生成工具
  11. 自动化CodeReview - ASP.NET Core请求参数验证
  12. php 获取当天是星期几,获取当天或某个日期是星期几
  13. 通行宝深交所上市:市值84亿 腾讯云与上汽是股东
  14. IC、FPGA验证学习
  15. ride导入自定义python库
  16. 在国企的日子(第三章中部 出差)
  17. 这,才是有本事的男人
  18. 电脑安装android4.0虚拟机,尝鲜Android 4.0 PC端虚拟机安装指南
  19. 谈B2B电商平台与大数据
  20. 迫在眉睫的企业内控与跃跃欲试的IT

热门文章

  1. Python基础:异常处理
  2. 构造方法:构造方法的格式和执行时机;构造方法的作用;构造方法的注意事项;
  3. c语言wifi热点源码,C#Win7设置WiFi热点源码
  4. c#怎么连接MySQL
  5. XXE漏洞介绍及利用
  6. 聚苯乙烯/超高分子量聚乙烯合金包覆多孔SiO复合微球/聚苯乙烯微球载金属卟啉的研究
  7. java变量的定义_Java变量_Java变量概念定义
  8. python中rect函数_使用类和函数的面向对象Python-rectangle
  9. MySQL数据库web客户端管理工具软件
  10. SimpleDateFormat的12小时制和24小时制