我已经为我的应用程序实现了示例推送通知服务.
现在我在沙盒环境中测试.
当我手动调用PHP脚本通过APN推送通知时,我收到通知.
当我使用crontab编写调度程序来自动传递通知时,我没有收到通知.我收到的邮件错误是:
PHP Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:
error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure in /Users/aspire/Desktop/SimplePush/simplepush.php on line 21
PHP Warning: stream_socket_client(): Failed to enable crypto in /Users/aspire/Desktop/SimplePush/simplepush.php on line 21
PHP Warning: stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /Users/aspire/Desktop/SimplePush/simplepush.php on line 21
Failed to connect: 0
Run Code Online (Sandbox Code Playgroud)
有人可以解释问题是什么吗?
我试过这个解决方案:
iptables -I OUTPUT -p tcp --dport 2195 -j ACCEPT
/etc/init.d/iptables stop
/etc/init.d/iptables start
Run Code Online (Sandbox Code Playgroud)
但仍无法访问该端口.
如果我需要为APNS打开更多端口,请告诉我.
有没有人拥有Apple推送通知服务使用的所有IP地址的完整列表?
我知道Apple使用内容分发网络来分发这些请求,DNS查找将返回靠近请求者位置的服务器 - 我遇到的问题是找到处理美国内容的所有这些服务器.
例如:
$ nslookup gateway.push.apple.com
Non-authoritative answer:
canonical name = gateway.push-apple.com.akadns.net.
Address: 17.172.238.216
Address: 17.172.238.224
Address: 17.172.238.226
Run Code Online (Sandbox Code Playgroud)
等等
每次查询DNS时此列表都会更改 - 但所有地址似乎都在17.172.238.x范围内 - 但不能保证明天或下周我会看到不同的范围.
但是,对于测试推送服务器,我已经在不同的子网中获得了结果.有时我得到一组地址:
$ nslookup gateway.sandbox.push.apple.com
Non-authoritative answer:
canonical name = gateway.sandbox.push-apple.com.akadns.net.
Address: 17.149.34.66
Address: 17.149.34.65
Run Code Online (Sandbox Code Playgroud)
还有其他时候,我会得到这些地址:
Address: 17.172.233.65
Address: 17.172.233.66
Run Code Online (Sandbox Code Playgroud)
我将使用Apple推送通知服务的服务器将在公司防火墙后面,我需要为生产和测试网关打开端口2195和2196 - 但是,我的防火墙团队需要特定的IP地址而不是主机名.
我担心如果我只是要求防火墙团队允许我到目前为止看到的IP地址,那么当DNS服务器决定提供不同的范围时,我的服务器将在一天或一周后停止工作.
如果有人有生产和测试环境的综合列表,我会很感激.
更新: 我试过要求防火墙团队打开Apple的整个IP块(17.0.0.0/8),但他们不会这样做 - 我需要缩小地址范围.
最后更新 - 2016年10月16日
即使这个问题已经结束,我想我会添加一个解释我最终解决方案的说明 - 并不是任何寻找答案的人都想听到的.我永远无法超越CDN使用的不断变化的地址,所以我最终放弃并从Rackspace租用了一台外部服务器.我得到了最小的服务器,唯一运行它的是一个端口转发器,它监听2195和2916并将连接发送给Apple.
我在Rackspace服务器上使用了一个简单的iptables配置,只允许从我的公司网关连接2195/2916,然后让我的防火墙团队打开一条通往外部服务器上静态IP地址的路径.防火墙团队很高兴,实现了单一路径,外部服务器可以连接到Apple使用的整个17.0.0.0/8范围.
我已经从这个Apns代码完成了php和Objective c的apns代码
并从此链接设置证书
用于向ios设备发送通知的沙箱和生产apns在我的服务器上运行完美.我将代码和相同的证书移动到客户端服务器,然后发送通知不起作用.
我调试所有的PHP代码,发现它停在这行代码
private function _connectSSLSocket($development) {
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $this->apnsData[$development]['certificate']);
$this->sslStreams[$development] = stream_socket_client($this->apnsData[$development]['ssl'], $error, $errorString, 100, (STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT), $ctx);
if(!$this->sslStreams[$development]){
$this->_triggerError("Failed to connect to APNS: {$error} {$errorString}.");
unset($this->sslStreams[$development]);
return false;
}
return $this->sslStreams[$development];
}
Run Code Online (Sandbox Code Playgroud)
apns.log文件显示错误"无法连接到APNS:110连接超时".
没有弄错.为什么我会收到此错误而不向ios设备发送通知?任何人都可以指导我吗?