服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS消息推送原理及具体实现代码

iOS消息推送原理及具体实现代码

2021-01-29 15:40山天大畜 IOS

这篇文章主要为大家详细介绍了iOS 消息推送原理及具体实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、消息推送原理

在实现消息推送之前先提及几个于推送相关概念,如下图1-1:

iOS消息推送原理及具体实现代码

1、provider:就是为指定ios设备应用程序提供push的服务器,(如果ios设备的应用程序是客户端的话,那么provider可以理解为服务端[消息的发起者]);

2、apns:apple push notification service[苹果消息推送服务器];

3、iphone:用来接收apns下发下来的消息;

4、client app:ios设备上的应用程序,用来接收iphone传递apns下发的消息到制定的一个客户端app[消息的最终响应者];

上图可以分为三个阶段:

阶段一:provider[服务端]把要发送的消息,目的ios设备标识打包,发送给apns;

阶段二:apns在自身的已注册push服务的ios设备列表中,查找有相应标识的ios设备,并将消息发送到ios设备;

阶段三:ios设备把发送的消息传递给对应的应用程序,并且按照设定弹出push通知。

具体过程,如下图1-2:

1、[client app]注册消息推送;

2、[client app]跟[apns service]要devicetoken, client app接收devicetoken;

3、[client app]将devicetoken发送给[provider]push服务端程序;

4、当push服务端程序满足发送消息条件了,[provider]向[apns service]发送消息;

5、[apns service]将消息发送给[client app].

iOS消息推送原理及具体实现代码

二、消息推送实现

1、生成*.certsigningrequest文件,步骤如下:

[macbook-应用程序-实用工具-钥匙串访问-证书助手-从证书机构求证书-证书信息(用户电子邮箱地址{填写您的邮箱,如:your@email.com},常用名称{任意,如:pushdemo},请求是:{单选,选择‘存储到磁盘'})-继续-保存],这时会在您指定的地方生成你指定的文件,默认为certificatesigningrequest.certsigningrequest文件,这里命名为:pushdemo.certsigningrequest.在此*.certsigningrequest已经生成,具体操作步骤如图所示。

iOS消息推送原理及具体实现代码

iOS消息推送原理及具体实现代码

如果生成成功,则会在[钥匙串访问|登录|密钥]栏目中列出与*.certsigningrequest关联的密钥,这里是pushdemo,如图所示:

iOS消息推送原理及具体实现代码

2、新建一个app id(在苹果开发者账号中配置)

(1)登录ios dev center,登录成功后,点击(ios provisioning portal对应链接),如图所示:

iOS消息推送原理及具体实现代码

(2)创建new app id[app idsàmanageànew app id]( description{填写您对此app id的描述,如:ishop},bundle seed id(app id prefix){选择绑定app id前缀,如:默认选择generate new},bundle identifier(app id suffix){填写绑定app id后缀,如:com.yourcorp.ishop}),如下图所示:

iOS消息推送原理及具体实现代码

这样就会生成下面这条记录,如图所示:

iOS消息推送原理及具体实现代码

(3)配置上一步中生成的app id,让其支持消息推送[点击2-6中的configureà选中enable for apple push notification serviceà点击configure],如图所示:

iOS消息推送原理及具体实现代码

(4) generate a certificate signing request(生成部署请求认证)[点击2-7中的2configureàcontinueà步骤1生成的*certsigningrequest文件(这里是ishop.certsigningrequest)-generate-生成完成后将其下载下来,命名为:aps_developer.cer],双击aps_developer.cer证书{将证书与密钥关联,并将证书导入到macbook中},如下图所示:

iOS消息推送原理及具体实现代码

(5)创建development provisioning profiles[开发许可配置文件](provisioning| development|new profile),具体操作流程如下图所示:

iOS消息推送原理及具体实现代码

点击图中submit,生成development provisioning profiles[开发许可配置文件],这里是:ishopdevprofile.mobileprovision如下图所示:

iOS消息推送原理及具体实现代码

下载此开发许可证书(用于联机调试)。

总结,到现在为止,我们已经生成:a:*.certsigningrequest文件(在步骤(4)中使用,用于生成证书b)、b:aps_developer_identity.cer证书(在provider[push服务器]服务端应用使用)、c:*..mobileprovision开发许可配置文件(在client app客户端应用联机调试使用)。

3、新建一个项目

1. 创建一个"single view application" project,为省事,你设置的"company identifier" + "production“必须和step 5创建的app id的"bundle identifier"一致。
2. 在appdelegate.mfile的"didfinishlaunchingwithoptions" method里,添加下列代码 (用于为app register push notification feature):

?
1
2
3
//letthedeviceknowwewanttoreceivepushnotifications
[[uiapplicationsharedapplication]registerforremotenotificationtypes:
(uiremotenotificationtypebadge|uiremotenotificationtypesound|uiremotenotificationtypealert)];

3.在appdelegate.mfile里添加下列2个methods (用来handle register remote notification with device token和register error的events)
-(void)application:(uiapplication*)applicationdidregisterforremotenotificationswithdevicetoken:(nsdata*)devicetoken

?
1
2
3
4
5
6
7
8
{
nslog(@"mytokenis:%@",devicetoken);
}
 
-(void)application:(uiapplication*)applicationdidfailtoregisterforremotenotificationswitherror:(nserror*)error
{
nslog(@"failedtogettoken,error:%@",error);
}

4. 运行该app in real device (simulator doesn't support push notification)。这时你会在device上看到一个popup window (该窗口只会出现一次,重装app不会再出现),提示你该app会send push notification给你,如果同意则clickok,不同意则click "now allow”。如果选择了ok,那么在"setting > notifications“里会有你的app在list里。而且这时你的xcode output console会显示你的device token。

5: export "pushdemo" private key to a ".p12" file(该文件会在后面生成apns provider的.p12 or .pem file时用到)
1). right click "pushdemo“ private key and select "export ..."pushdemo
2). save the private key as “pushdemokey.p12” file, click save button
3). 这时会让你输入2次用于加密该.p12 file的密码,例如用"123321",接着会要求你输入一次your mac account password

6: 在5中生成的“pushdemokey.p12” file和step 6生成的"aps_development.cer" file是用于apns provider side的源文件,apns provider side进行push message时要用到的"cert + key" file就是通过这2个file来生成。该step就是用来生成for apns provider side (php version)要用到这个"cert + key" pem file.

1)open terminal, go to desktop (假设这2个file都在desktop里)
2)执行下列命令来生成和apns cer file对应的pem file "pushdemocert.pem"

opensslx509-inaps_development.cer-informder-outpushdemocert.pem

3)执行下列命令来生成和private key .p12 file对应的pem file "pushdemokey.pem" (注意:执行过程会要求你输入"pushdemokey.p12"创建时设置的密码,以及设置"pushdemokey.pem”的密码)

opensslpkcs12-nocerts-outpushdemokey.pem-inpushdemokey.p12

4)执行下列命令把step 11.2生成的cert pem file和step 11.3生成的key pem file合成为一个pem file"pushdemock.pem"

catpushdemocert.pempushdemokey.pem>pushdemock.pem

7:在5生成的“pushdemokey.p12” file和step 6生成的"aps_development.cer" file是用于apns provider side的源文件,该step是简单测试这2个file是否有效
1)open terminal, go to desktop (假设这2个file都在desktop里)
2) 执行下列命令来测试是否能够connect apple提供的不经加密(即不需使用任何证书!)的apns server

telnetgateway.sandbox.push.apple.com2195

如果你看到下列输出,则表示你的电脑可以connect apns. 如果出现error,那么check你的firewall是否允许outgoing connections on port 2195。
trying17.172.233.65...
connectedtogateway.sandbox.push-apple.com.akadns.net.
escapecharacteris'^]'.
press ctrl+c to close the connection.

3)执行下列命令来测试是否能够connect apple提供的经加密(需使用2) and 3)生成的2个pem file!)的apns "sandbox“ server for development.

openssls_client-connectgateway.sandbox.push.apple.com:2195-certpushdemocert.pem-keypushdemokey.pem

执行过程中会要你输入pushdemokey.pem生成时设置的密码。如果connect server成功,就会等待你输入字串,你可以输入任意字串,然后回车,就会disconnectserver。如果连接不成功,则openssl会显示错误信息。
注意:实际上有2个apns servers: the “sandbox” server (用于testing) the live server(用于production mode)。我们这里测试的是sandbox server。live apns server的操作类似。

8:创建provider server side (php version)
1). downloadsimplepush php codeto your mac machine and then unzip it.
2). 去掉simplepushfolder里的pk.pem (它没用),把step 11.4生成的"pushdemock.pem" copy tosimplepushfolder
3). 修改simplepush.phpfile下面几行:

?
1
2
3
4
5
6
7
8
9
// put your device token here (without spaces):
//device token来自step 10的第4点,在output console获取,注意:要去掉前后的尖括号,和中间的所有空格
$devicetoken= '43fcc3cff12965bc45bf842bf9166fa60e8240c575d0aeb0bf395fb7ff86b465';
// put your private key's passphrase here:
//该值是 3)生成pushdemokey.pem时设置的密码
$passphrase= '123456';
// put your alert message here:
$message= 'my first push notification!';
//.....stream_context_set_option($ctx, 'ssl', 'local_cert', 'pushdemock.pem');

4). 在terminal window里,go to the simplepush folder,然后执行下列命令,你的iphone应该会收到一条push message。

phpsimplepush.php

注意:如果你的app在iphone里是正在运行,而且app是在front end时,当它收到push message时是不会出现在iphone顶部的notification area的!

参考文章:http://mmz06.blog.163.com/blog/static/121416962011111710934946/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。     

延伸 · 阅读

精彩推荐
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25