根据Predefined Constants上的 PHP 文档,将STREAM_CLIENT_PERSISTENT与 APNS 连接一起使用应该在页面加载之间保持连接处于活动状态。这是 APNS 连接的要求,因为它会限制您,因为它会在发送有效负载后将任何断开连接视为潜在的拒绝服务攻击。
如果您在 presisitent 连接之外的客户端有任何问题,您可能想尝试以下方法,因为这是迄今为止我见过的在 PHP 中处理 APNS 连接的最佳方式。这使用来自PHPXMLRPC的客户端,因此您必须下载该包。
<?php
include '../vendors/xmlrpc.inc';
$hostName = 'localhost'; # Your services endpoint here.
$rpcPath = '';
$port = 7077;
if($_GET['action'] == 'provisioning')
{
$echoString = new xmlrpcmsg(
'provision',
array(
php_xmlrpc_encode('appid'),
php_xmlrpc_encode('/path/to/certificate.pem'),
php_xmlrpc_encode('sandbox'),
php_xmlrpc_encode(100)
)
);
$continue = TRUE;
}
if($_GET['action'] == 'notify')
{
$echoString = new xmlrpcmsg(
'notify',
array(
php_xmlrpc_encode('paparazzme'),
php_xmlrpc_encode(array('6bcda...', '7c008...')),
php_xmlrpc_encode(array(array("aps" => array("alert" => "Hello User 1" )), array("aps" => array("alert" => "Hello User 2" ))))
)
);
$continue = TRUE;
}
if($continue == true)
{
# Create a client handle and send request
$client = new xmlrpc_client($rpcPath, $hostName, $port);
# A little verbose debug
$client->setDebug(2);
# The response
$response = &$client->send($echoString);
# Check if response is good
if (! $response->faultCode())
print "\nReturned string is: " . php_xmlrpc_decode($response->value()) . "\n";
else
print "An error occurred: \nCode: " . $response->faultCode() . " Reason: '" . htmlspecialchars($response->faultString()) . "'\n";
}
?>
资料来源:如何开始使用适用于 iPhone 或 iTouch 的 APNS
我想花点时间指出,我没有测试任何代码,我现在没有 iPhone 应用程序来测试它,所以我可以告诉你这是否真的有效。
如果对您可行,我建议您改用 Uban Airship,因为他们确实每月向每个客户提供 250,000 次免费推送,并为您处理与 APN 服务器的连接,从那里您使用他们的API与您的客户交谈。