通过PHP与APNS持久连接

时间:2012-06-08 10:09:06

标签: php ios push-notification apple-push-notifications

我知道在SO上有很多帖子可以解决这个问题,不幸的是我在PHP编程方面并不是那么先进,我有一个问题在其他地方没有得到解答:

Apple推送通知的许多教程都是通过stream_socket_client()创建连接的。但他们中的大多数都缺少“STREAM_CLIENT_PERSISTENT”旗帜。这个标志会使连接真的持久吗?如果是的话什么时候会被关闭?文档说它在页面重新加载时也会保持连接状态。这取决于会议吗?

没有此标志的版本正在运行,但我担心APNS会在我输入生产证书等时阻止我(描述here)。 提前谢谢。

1 个答案:

答案 0 :(得分:6)

根据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";
}

?>

消息来源:How to get started with APNS for iPhone or iTouch

我想花点时间,指出,我没有测试过这些代码,我现在没有iPhone应用程序来测试这个,所以我可以告诉你这是否真的有效。

如果对你来说可行,我会建议您使用Uban Airship代替,因为他们每月为每个客户提供250,000次免费推送,并为您处理与APN服务器的连接,从那里开始使用他们的APIs与您的客户交谈。