t-io支持ios 消息socket.io 推送消息吗

IOS开发之实现App消息推送(最新)(1)
好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的
好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适)
首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps:其实每一篇教程都有),先来看一张苹果官方对其推送做出解释的概要图。
Provider是给你手机应用发出推送消息的服务器,而APNS(Apple Push Notification Service)则是苹果消息推送服务器。你本地的服务器当需要给应用推送一条消息的时候,先要将消息发出到苹果推送服务器,然后再由苹果推送服务器将消息发到安装了该应用的手机。
接下来再看一张解释图:
根据上图的逻辑我来给大家解释一下:
1.你的IOS应用需要去注册APNS消息推送功能。
2.当苹果APNS推送服收到来自你应用的注册消息就会返回一串device token给你(很重要)
3.将应用收到的device Token传给你本地的Push服务器。
4.当你需要为应用推送消息的时候,你本地的推送服务器会将消息,以及Device Token打包发送到苹果的APNS服
5.APNS再将消息推送给目的iphone
1.从证书颁发机构颁发证书
打开你mac的钥匙串访问: 然后点击钥匙串访问
随后它会弹出一个窗口 用户电子邮件信息
就填写你苹果开发者账号的名称即可(应该是一个邮件名称),点击保存到磁盘的选项,点击继续,显示如下
点击存储,文件名为:CertificateSigningRequest.certSigningRequest 随后将他放在一个文件夹中我们取名push吧!
访问苹果开发者网址:/
选中MemberCenter选项,进入登陆页面,用你的苹果开发者账号登陆,过一会网页就会自动跳转到下图。
点击红色所选部分
内容进行下一步的操作。
选择Certificates选项,设置证书,如图所示先解释一下
Development选项的作用顾名思义就是用来作为开发使用的证书,Production选项则
是用来发布产品使用的,名称很陌生是不是,之前的开发者网页是没有这一选项的,可能是苹果把他修改了,用这个名称更加能让人
理解吧(字面上解释就是产品么)。两个选项生成证书的步骤是一样的,现在我们使用开发者的选项进行证书的制作,步骤如下:
选择Development选项
点击上面的加号选项,
选择APNS选项(开发么当然是在沙盒环境下了,模拟真实情况),然后Continue
这个AppID我们在下一部分讲如何生成,现在我用的是已经生成好的一个应用ID,继续Continue
这边就要选择在钥匙串访问环节下载下来的CertificateSigningRequest.certSigningRequest文件了,选择并生成
点击下载,得到aps_development .cer,保存到push文件中去。
新建一个AppID,选择网页上的AppIDs,然后点击右上角的 “加号”
App的取名只要按照苹果要求的就可以了
然后BundleID是比较重要的,在提交审核以及测试(苹果的TestFlight)和付费环节都需要用到,也只需按照苹果要求来写就好了。
接下来就是对你的应用需要使用苹果的哪些服务进行选择就行了,例如广告,游戏中心,推送,付费等等情况。
最后选择“Submit”选项,在下一个界面中选择“done”选项,这样我们设置AppID的步骤我们就完成了。
第五部分:生成Provisioning Profiles
这个配置概要文件分为两种,一种是为开发使用的,还有一种则是为发布到appStore上面。
创建发布版的ProvisioningProfile与开发版的流程相同,点击Development然后点击右上角的加号
会进入选择何种配置概要文件的界面
我们现在时测试,所以选择“IOS App Development”的选项,在下面的Distribution发布选项中有两个选择,“App Store”以及“Ad hoc”,你可以根据下面的描述
选择你发布所需的选项。点击Continue进入下一步。
选择你上一步创建的AppID,点击Continue 进行下一步
选择你的开发者账号,Continue进行下一步
在这一步上选择你的设备(你只有在这一步上勾选了你的设备,你才能在设备上用这个签名进行调试)。关于如何将你的设备号添加进去也是非常
简单的,选择左侧的"Devices",然后点击右上角的加号,在随后出来的页面上添加你设备的UUID(在XCode中可以查看到)以及name( 可以随便取,自己看的懂就行)
然后Register一下,照着流程走到最后一步就完成了。
好咋们继续回到上面的Provisioning Profile配置环节,当你选好了你的设备后点击“Continue”进入下一页,
输入一个文件名(最好是起的能看懂是干嘛的,当然也可以随便起),点击“Generate”进入下一个页面,在这个页面中就会有一个下载按钮让你下载这个文件,
我们把它下载下来放在Push文件夹中。
好了,前期的准备工作都已经做完了,现在让我们开始推送吧!(吼吼)
首先双击我们生成的 “aps_development .cer” 文件,进入钥匙串访问,找到我们的专用秘钥(根据在第二部分中从证书机构颁发证书操作中填写的常用名)
我在第二部分填写的是“silicon”,由于换了一台mac之前安装的没有了,之前没有截图,所以随便找了个图给大家看一下,凭大家的聪明才智应该不难理解吧。
然后右击导出,会弹出如下所示的图。
将他存储到push文件夹中,命名为“push.p12”,在这一步中导出会让你输入密码并验证,你可以自定义一个密码,例如abc123。
现在push文件夹中应该有几个文件“aps_development .cer” ,"push.p12",“CertificateSigningRequest.certSigningRequest”以及刚才下下来的配置概要文件。
接下来我们打开终端将他们生成.pem文件
1.把aps_development .cer文件生成.pcm文件,cd到push文件夹下
2.把push.p12文件生成为.pem文件
上边输入的密码则是你导出证书所设的密码,即abc123.接着还会让你输入.pem文件的密码,还是使用abc123好了,防止混淆。
这样我们在push文件夹中就又得到了两个文件,PushChatCert.pem和PushChatKey.pem。
3.把PushChatCert.pem和PushChatKey.pem合并为一个pem文件,
在push文件夹中又多了一个ck.pem文件,以上我们把需要使用的文件都准备好了
接下来就要测试一下啦,是不是很激动~
为了测试证书工作的状况,我们可以使用“telnet gateway.sandbox. 2195”来检测一下,如果显示
则表示成功了。
然后,我们使用我们生成的证书和私钥来设置一个安全的链接去链接苹果服务器
在终端输入如下命令:openssl s_client -connect gateway.sandbox.:2195 -cert PushChatCert.pem -key PushChatKey.pem
需要输入密码(abc123 我们刚才所设置的)。
然后他会返回一系列的数据,这里我就粘贴一部分啦:
CONNECTED()
depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
verify error:num=20:unable to get local issuer certificate
verify return:0
Certificate chain
。。。。。(省略)
。。。。。(省略)
。。。。。(省略)
Start Time:
: 300 (sec)
Verify return code: 0 (ok)
测试就到这里啦。。。
1.建立推送项目
在appdelegate.m中加入以上代码,
由于ios8的推送跟ios7及以下的不一样,所以需要加判断来注册消息推送。
会接收来自苹果服务器给你返回的deviceToken,然后你需要将它添加到你本地的推送服务器上。(很重要,决定你的设备能不能接收到推送消息)。
这个函数则是当设备接收到来自苹果推送服务器的消息时触发的,用来显示推送消息。
当注册失败时,触发此函数。
2.PHP服务端
将simplepush.php这个推送脚本也放在push文件夹中
deviceToken填写你接收到的token,passPhrase则填写你的ck.pem设置的密码。
此刻就是见证奇迹的时候了
使用终端进入到push文件夹,在终端输入 php simplepush.php
若显示以上提示则表示推送成功了。
附上一张成功图。
推送就到这边吧!
感谢这篇博客的指导:
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】红轴机械键盘、无线鼠标等753个大奖,先到先得,云栖社区首届博主招募大赛9月21日-11月20日限时开启,为你再添一个高端技术交流场所&&
基于大数据的移动云服务。帮助App快速集成移动推送的功能,在实现高效、精确、实时的移动推送的同时,极大地降低了开...
阿里云移动APP解决方案,助力开发者轻松应对移动app中随时可能出现的用户数量的爆发式增长、复杂的移动安全挑战等...
是一款简单高效的电子邮件发送服务,它构建在可靠稳定的阿里云基础之上,帮助您快速、精准地实现事务邮件、通知邮件和批...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
MaxCompute75折抢购
Loading...> 博客详情
摘要: T-io Im聊天demo分析
& & &作者在开源其框架的同时还附带了几个demo,如:简单的hello world、im等。接下来这篇博客将会围绕tio-examples-im-simple-client、tio-examples-im-simple-server展开分析和学习。
demo项目结构
& & im-simple分成三个maven子项目:
tio-examples-im-simple-client就是客户端聊天工具项目
tio-examples-im-simple-common保存了一些公用的类型定义和utils,
tio-examples-im-simple-server包含了聊天系统的服务端和一套附带了nginx的网页聊天工具。
& &整片博客是围绕着网页版聊天工具而写的。
& & & 首先介绍一下这个聊天系统demo大概交互的逻辑是怎么样子的,如下图:
demo中web聊天系统使用了websocket协议来和服务端进行通信。
demo中数据交互无论是浏览器端、还是服务端数据传输方式都使用了proto-buf(这个让我眼前一亮,之前只听说过客户端和服务器端采用proto-buf,demo里面竟然使用了js的proto-buf,因为之前接触js这一块不多,第一次看到就给跪了)。
& & 2.代码分析&
服务端初始化demo:
// 定义handler,所有的请求数据全部都由这个handler来处理,decode/encode/handler等等
// 如果您做web开发一定知道dispatcher的概念,这个handler会将数据解码,然后将数据分发给对应的handler处理业务
aioHandler = new ImServerAioHandler();
// listenr 可以在连接上、接收到消息、发送消息后等等回调其内部方法
aioListener = new ImServerAioListener();
// 服务端上下文初始化
serverGroupContext = new ServerGroupContext&&(aioHandler, aioListener);
serverGroupContext.setEncodeCareWithChannelContext(true);
aioServer = new AioServer&&(serverGroupContext);
aioServer.start(ip, port);
从初始化的几句代码中可以看出ImServerAioHandler 是聊天系统中的重中之重,我们来看一下里面的代码
// 握手请求
handlerMap.MAND_HANDSHAKE_REQ, new HandshakeReqHandler());
// 授权请求
handlerMap.MAND_AUTH_REQ, new AuthReqHandler());
// 聊天请求
handlerMap.MAND_CHAT_REQ, new ChatReqHandler());
// 加入群组请求
handlerMap.MAND_JOIN_GROUP_REQ, new JoinReqHandler());
// 心跳请求
handlerMap.MAND_HEARTBEAT_REQ, new HeartbeatReqHandler());
// 关闭连接请求
handlerMap.MAND_CLOSE_REQ, new CloseReqHandler());
/.. 在这里通过解析消息头之后获取下一步调用哪个handler来处理业务
public Object handler(ImPacket packet, ChannelContext&ImSessionContext, ImPacket, Object& channelContext) throws Exception
Command command = packet.getCommand();
ImBsHandlerIntf handler = handlerMap.get(command);
if (handler != null)
Object obj = handler.handler(packet, channelContext);
CommandStat.getCount(command).handled.incrementAndGet();
CommandStat.getCount(command).handled.incrementAndGet();
log.warn("找不到对应的命令码[{}]处理类", command);
当然,上面的其实都是业务代码,还没有很明显的看到框架代码,接下来我们看看怎样发送一条聊天的消息给一个群组。
ChatReqHandler.java是处理发送聊天消息的类:
// protobuf反序列化消息体
ChatReqBody chatReqBody = ChatReqBody.parseFrom(packet.getBody());
// demo这里写死了一些信息,消息发送者
Integer fromId = 111;
String fromNick = "test";
// 把消息发送给谁
Integer toId = chatReqBody.getToId();
String toNick = chatReqBody.getToNick();
String toGroup = chatReqBody.getGroup();
// 其实demo的代码这里写的不太好,如果chatReqBody==null,前面就报错了
if (chatReqBody != null)
// 构建消息体响应类
ChatRespBody.Builder builder = ChatRespBody.newBuilder();
builder.setType(chatReqBody.getType());
builder.setText(chatReqBody.getText());
builder.setFromId(fromId);
builder.setFromNick(fromNick);
builder.setToId(toId);
builder.setToNick(toNick);
builder.setGroup(toGroup);
builder.setTime(SystemTimer.currentTimeMillis());
//同样protobuf序列化
ChatRespBody chatRespBody = builder.build();
byte[] bodybyte = chatRespBody.toByteArray();
//组建即时聊天响应包
ImPacket respPacket = new ImPacket();
respPacket.MAND_CHAT_RESP);
respPacket.setBody(bodybyte);
// 如果是对群组发送,直接调用Aio.sendToGroup即可(框架代码)
if (Objects.equals(ChatType.CHAT_TYPE_PUBLIC, chatReqBody.getType()))
Aio.sendToGroup(channelContext.getGroupContext(), toGroup, respPacket);
} else if (Objects.equals(ChatType.CHAT_TYPE_PRIVATE, chatReqBody.getType()))
// 如果是对单个人发送,也有Aio.sendToUser方法(框架代码)
if (toId != null)
Aio.sendToUser(channelContext.getGroupContext(), toId + "", respPacket);
& & &看看,真正使用到框架的代码实际上就一行:Aio.sendToXXX静态方法。
那也许会有人问,框架是怎么知道这个group里面有哪些连接啊?框架怎么知道会有哪些连接的user呢?
& & &注意看众多handler中,其中有一个JoinReqHandler是在客户端调用加入群组命令的时候执行的:
public Object handler(ImPacket packet, ChannelContext&ImSessionContext, ImPacket, Object& channelContext) throws Exception
// 连接上下文绑定群组
Aio.bindGroup(channelContext, group);
& & &一个简单的bindGroup即可把这个连接绑定到一个组里面,从而通过Aio.sendToGroup即可轻松的给一个组发送消息。而在AuthReqHandler中同样调用了Aio.bindUser方法来绑定有用户连接(这个不贴代码了,贴多了界面太长,让人不想看)。
& & &保存user和group,作者使用的是一个带了读写锁的自己封装的DualHashBidiMap (apache工具包里面的,双向map,可以通过key获取value,可以通过value获取key)。
& & &总结t-io在聊天系统中的使用方法
创建了一个server端
客户端在鉴权的时候Aio.bindUser
客户端在加入群组的时候Aio.bindGroup
客户端在发送消息时Aio.sendToUser/Aio.sendToGroup即可
当然,只要你实现一下ClientAioHandler的heartbeatPacket方法,框架本身给实现了自动心跳检测,重连也只需要在初始化连接上下文时传入ReconnConf即可。
后面我自己设计config-server的时候,给客户端推送一组服务IP过去也是相当容易的事情啦。
棋牌类游戏交互也类似了,一桌四个人,一个的操作,发送到服务端做算法逻辑校验后,同时推送给其他三个人,好像这样实现起来也不复杂了。而需要关心的仅仅只是server本身的集群问题了。
& & demo中我最感兴趣的和我学到的
框架提供的user和group概念很方便
ByteBuffer消息头的定义方法和解析,demo里面定义消息头定义得很节省空间 ByteBuffer buffer = ByteBuffer.allocate(allLen);
buffer.order(groupContext.getByteOrder());
//这里比较有迷惑性,这个version并非随便乱定,而是需要根据后面是否使用压缩、序号同步等等标记出来的二进制
buffer.put(ImPacket.VERSION);
buffer.put((byte) packet.getCommand().getNumber());
buffer.put(isCompress ? (byte)1 : (byte)0);
buffer.putInt(packet.getSynSeq());
buffer.putShort((short)bodyLen);
这里注意,我差点被作者绕进去了,ImPacket.VERSION比较有迷惑性 //这是客户端解析第一个字节的定义,不是浏览器解析规则
//其实作者定义得version自己规定的只占用4个比特位,如:0B,后四位都是用来真正标示版本号
//实际上前面的几位是另外分出来标记是否压缩,是否同步序号等等
byte version = ImPacket.decodeVersion(firstbyte);
boolean isCompress = ImPacket.decodeCompress(firstbyte);
boolean hasSynSeq = ImPacket.decodeHasSynSeq(firstbyte);
boolean is4ByteLength = ImPacket.decode4ByteLength(firstbyte);
消息点对点发送和消息的群组发送性能和稳定性还有待我做做测试,后续在全面了解完t-io框架后准备弄一份关于性能测试的报告出来试试。
& & &同时感谢t-io作者对我的指导 !
已经关注了。
大神有关于t-io后端集群,不同t-io服务之间通信的例子么,比如用户a绑定咋t-io-1上,用户b绑定在t-io-2上,那么a和b通信肯定要跨域2个t-io服务,我之前做类似功能块用了第三方工具来通信(比如redis),不知道有没有更好的实践方式?先谢谢您的tio项目。
如果你觉得netty顺手,似乎也没有必要转战t-io,当然如果觉得不顺手或者不爽,那欢迎尝试一下t-io
引用来自“K不是你的帝”的评论大神有关于t-io后端集群,不同t-io服务之间通信的例子么,比如用户a绑定咋t-io-1上,用户b绑定在t-io-2上,那么a和b通信肯定要跨域2个t-io服务,我之前做类似功能块用了第三方工具来通信(比如redis),不知道有没有更好的实践方式?先谢谢您的tio项目。这个方案很多,譬如走jms,再或者用zk自己来实现类似的功能,根据自己掌握的技术情况进行灵活选择
引用来自“K不是你的帝”的评论大神有关于t-io后端集群,不同t-io服务之间通信的例子么,比如用户a绑定咋t-io-1上,用户b绑定在t-io-2上,那么a和b通信肯定要跨域2个t-io服务,我之前做类似功能块用了第三方工具来通信(比如redis),不知道有没有更好的实践方式?先谢谢您的tio项目。引用来自“talent-tan”的评论这个方案很多,譬如走jms,再或者用zk自己来实现类似的功能,根据自己掌握的技术情况进行灵活选择受教了
version只占了首字节的后4bit,其它bit用作其它用途了,主要是为了节省带宽
version我们平常自己定义版本号可能就随意定义一个数字对不,他这个demo version使用了一个字节,8个二进制位,后四位是真正的版本号,前面四位是做了其他标示。相当于一个version在标示版本号的同时,也决定了数据解析方式,比如是否用了gzip
确实不错,学习了
有人做过测试,去tio官网上面有的
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥> 博客详情
本文列举关注t-io的网友经常问到或质疑的问题
先来个资料汇总,再回答问题
利用t-io,30分钟开发一个高性能的即时通讯程序:&
码云收录地址:
花十分钟时间给JFinal写了个t-io插件:
talent-tan家的临时官网: ,由南京皓叶腾信息科技有限公司CEO提供主机支持
开源中国收录地址:
天篷小猪写的hello:
如何学习t-io? 这里有一章说了学习步骤:
t-io发布的性能数据是否有造假 被测试代码、测试代码、测试步骤都在,欢迎打假!
t-io的案例多吗 第一个月反馈给我的,我都有在官网列出,后面跟我反馈的太多了,就不一一列举了,目测现在有几十个的样子,后来付费入群的朋友有很多在用t-io。所以只要场景合适,大家可以放心使用t-io。
能和netty进行PK吗 作为一个框架,PK需要全方面的PK----易用性、稳定性、性能、开发复杂度、学习复杂度、内置功能,所以作为用户,自己各取所需就好。t-io已经接受过一些PK,后面不会再和其它框架进行PK,但是愿意辅助挑战者写t-io侧的PK程序(只提供帮助,并不亲自写PK程序)。
t-io能用于短连接吗? t-io最初是为长连接而设计的,已经自带了长连接常见场景功能,譬如绑定用户、绑定群组、各种数据统计、内置消息推送API等,所以尽管t-io在功能上用于短连接没有任何问题,但是这些自带功能会带来不必要的性能损耗。后面有计划用参数控制,当前场景是短连接还是长连接,以便在性能上更适合短连接。所以如果你的系统对短连接的性能要求不变态,可以用t-io,否则还是等后面的版本吧。
t-io支持集群吗? t-io作为一个即时通讯框架,本身并无是否支持集群一说。用t-io开发出一款产品后,这个产品才具有支持集群这一属性。
t-io支持HTTP吗? 暂无计划实现http协议,不过IM例子已经实现了websocket协议,并且也有demo演示。
t-io支持UDP吗? 暂不支持,也未列入计划中,如果哪天支持了,必然发新闻通知大家。
t-io支持.net、android、ios、php吗? t-io暂时只通运行在标准的jdk环境中,其它版本并无开发计划。
其它问题可以到这里来提问
用t-io实现websocket协议即可,目前官方有简单实现,t-io更多的是定位tcp长连接应用,然后内置了很多tcp长连接所需要的便捷的api
c-s通讯,只要满足双方交互协议就可以了,t-io对通讯对端没有特别要求。
引用来自“talent-tan”的评论c-s通讯,只要满足双方交互协议就可以了,t-io对通讯对端没有特别要求。好吧 昨天我用socket访问hello的服务端,都进入不了 encode()
decode()里面。。。我水平很有限
我应该在什么地方打断点呢 观察到 反应。。我对socket熟悉点,AIO刚接触,NIO使用过。 说清楚了t-io 如何接收 普通socket请求,肯定能吸引一大波人来使用:smile::thumbsup:
引用来自“talent-tan”的评论c-s通讯,只要满足双方交互协议就可以了,t-io对通讯对端没有特别要求。引用来自“忘战必危”的评论好吧 昨天我用socket访问hello的服务端,都进入不了 encode()
decode()里面。。。我水平很有限
我应该在什么地方打断点呢 观察到 反应。。我对socket熟悉点,AIO刚接触,NIO使用过。 说清楚了t-io 如何接收 普通socket请求,肯定能吸引一大波人来使用:smile::thumbsup:如果是helloworld例子,先启动server,然后在org.tio.mon.HelloAbsAioHandler.decode(ByteBuffer, ChannelContext)里打断点。
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥本文已收录于以下专栏:
相关文章推荐
原文链接:/industry/2.html
转自丰俊文的博客
经常有同学...
转自丰俊文的博客Apple对设备的控制非常严格,消息推送的流程必须要经过APNsAPNS的推送机制与Android上我们自己实现的推送服务不一样,Apple对设备的控制非常严格,消息推送的流程必须要经...
APNS的推送机制
与Android上我们自己实现的推送服务不一样,Apple对设备的控制非常严格,消息推送的流程必须要经过APNs:
这里 Provider 是指某个应用的Developer,...
使用推送消息,可提醒用户,召回玩家。延长游戏的寿命和收益!下面我们就一起来学习,cocos2d-x iOS集成push。
收到push消息:  
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)iOS9和iOS10消息推送简单区别 - 简书
iOS9和iOS10消息推送简单区别
1、App关闭的情况(Killed),点击消息启动App,首先执行
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
不论iOS9或者iOS10,launchOptions一般就是消息推送的内容。(扯个题外话,如果是点击3D Touch点击iCon进入App,这个launchOptions就是3D Touch的相关数据字典)。如果是iOS10,最好判断下,不处理,因为iOS10的代理方法didReceiveNotificationResponse会处理。
2、App正开着(在后台或者前台)
iOS9, 点击或接收到消息会执行
- (void)application:(UIApplication *)application didReceiveRemoteNotification
:(NSDictionary *)userInfo
可以通过判断 [UIApplication sharedApplication].applicationState 来判断是前台或者后台,
进一步处理跳转或者其他。
iOS10, 点击或接收到消息会执行
处理前台收到通知的代理方法,即App正开启着,用户正在浏览App内容
-(void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
NSDictionary * userInfo = notification.request.content.userI
NSLog(@"iOS10 前台 userInfo=%@",userInfo);
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]])
//处理远程推送
//处理本地推送
处理后台点击通知的代理方法,这里的后台和iOS9不一样,指App Killed(即关闭)或者App摁下Home键返回后台的情况
-(void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void (^)())completionHandler{
NSDictionary * userInfo = notification.request.content.userI
NSLog(@"iOS10 后台 userInfo=%@",userInfo);
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]])
//处理远程推送
//处理本地推送}

我要回帖

更多关于 ios 前台收到推送消息 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信