说它正在使用“一个简单的 php 应用程序”有点含糊。有了更多关于服务器上的事件流和“php 应用程序”之间的差异的信息,我们可能会得出一些更合理的结论。
除此之外,如果您还没有,请查看来自 raywenderlich 的 Ali Hafizji 的精彩教程(两部分)。它对你需要的几乎所有东西都有详细的解释,我自己用过几次(不过看起来它已经更新了)。您说您正在服务器上安装 .p12,而我很确定他正在将其与私钥一起转换为 .pem 文件。
还要确保服务器使用正确的令牌,因为您设备的令牌在开发中与分发时不同。
您还应该在服务器端放置一些健康检查(在 .php 或您用来建立连接的任何内容中gateway.push.apple.com
),以确保您的服务器实际上正在发送任何内容。IE 如果您使用 mysql 来访问您的令牌,请记下 aif(!$connection){die(mysql_error());}
或其他内容。这也应该在建立与 Apple 的连接时完成。使用 php 和 stream_socket_client,你可以这样写:
$fp = stream_socket_client(
'ssl://gateway.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);//$ctx=Stream context
if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);
通知的实际推送,或者至少是我一直在使用的 php 方式,fwrite()
返回一个布尔值,表示它是否成功,所以你可以这样做$result = fwrite($fp, $msg, strlen($msg));
,$result
如果失败则为 0。
还要确保您已连接到您打算使用的系统(沙盒与否)。我可能离这里很远,但我想我曾经尝试在连接到 Apple 的沙盒系统时使用生产配置文件向我的设备发送通知,但没有收到任何东西。您说您的证书是“开发”,请仔细检查其他所有内容。
再说一次,我的服务器上有这个 .php 代码,我不完全确定你所说的“简单的 php-app 有效,但服务器无效”是什么意思。