我们的代码大致是这样子的:

如果推送多条,在表面套一个for循环即可。

代码写完,一实行,嘿,收到推送了。
以为ios推送功能就这么完成了。

php推送ios技巧文 php实现ios推送碰到的坑 React

我们大概有几万用户须要推送,上线一运行,创造推送完成一小部分之后就无法推送了,缘故原由是被苹果给封了ip。
后来官网一查,原来频繁的连接会被苹果认为是攻击性的访问,因此被封了ip,过一段韶光才能解封。

网上查不了不少资料,创造网友们写的干系的博客教程,都是和我们一样,推送一条就连接一次apns,然后write,然后关闭连接。
推送下一条时再连接,write。
很少有人提到频繁连接被封的事情。

经由一段韶光研究,创造可以一次连接进行多次推送。
改进方法是将外层的for循环放到里面,这样就避免了频繁连接。
改进后的代码大致如下

以为问题就这么完美的办理了,然而新的问题又涌现了。

假设我们现在推送500条,但是有一部分token是失落效了的,失落效的缘故原由可能是用户卸载了app等。
当循环wirte这500条数据的过程中,如果中间有一条token是无效的,会导致后续的正常的token无法推送。
见下图:

在碰着失落效的token后,apns会忽略后面的token,然后在间隔一小段韶光后断开连接。
韶光可能是一两秒。

为理解决这个可能,我们只须要在apns断开的时候,进行重连即可。

改进后的代码如下:

到了这一步,问题已经办理了大半。
有心的朋友该当也创造了一个问题,一旦涌现失落效的token,紧随其后的token就受到了无妄之灾,明明是正常的token,却无法推送。

办理的办法只能一个:失落效的token不要进行推送就好了。
那么问题来了,我们如何判断一个token是否失落效?在进行wirte的时候,苹果并没有返回给我们推送的结果,我们并不知道这个token是否正常,是否推送成功。

但是苹果给我们供应了一个feedback的接口,我们可以查到失落效的token。
备注:要考试测验推送失落败了之后,苹果才知道token失落效。

代码大致如下:

将失落效的token存起来,下次推送的时候不要推送就可以了。