5

この問題に対処する SO に関する多くの投稿があることは知っていますが、残念ながら、私は PHP プログラミングにそれほど詳しくなく、どこかで答えられていない質問があります。

Apple プッシュ通知のチュートリアルの多くは、stream_socket_client() を介して接続を作成します。しかし、それらのほとんどにはフラグ「STREAM_CLIENT_PERSISTENT」がありません。このフラグは接続を本当に永続的にしますか? もしそうなら、いつ閉鎖されますか?ドキュメントには、ページのリロード時にも接続が維持されると記載されています。これはセッションによって異なりますか?

このフラグのないバージョンは機能していますが、製品証明書などを入力するとすぐに APNS によってブロックされるのではないかと心配しています (ここで説明します)。前もって感謝します。

4

1 に答える 1

6

Predefined Constantsに関する PHP ドキュメントに従って、APNS 接続でSTREAM_CLIENT_PERSISTENTを使用すると、ページの読み込み間で接続をアクティブに保つ必要があります。これは APNS 接続の要件ですペイロードを送信した後の切断は、サービス拒否攻撃の可能性があると見なされるため、スロットルが発生します。

既存の接続以外でクライアントに問題がある場合は、次の方法を試してみてください。これは、これまで 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 を使用することをお勧めします。Uban Airship は、各クライアントに毎月 250,000 回の無料プッシュを提供し、APN サーバーへの接続を処理します。そこからAPIを使用します。あなたのクライアントと話すために。

于 2012-08-01T13:21:47.680 に答える