繁体   English   中英

Apple Push Notifications系统未收到消息! (PHP)

[英]Apple Push Notifications System Not Receving Message! (PHP)

这是我编写的用于发送苹果推送通知的代码。 在device_tokens中,我正在发送一个数组,其中包含要向其发送消息的所有令牌。 由于某些原因,我停止从该系统接收消息。

它曾经工作过!

private function send_iphone_notification($device_tokens, $message) 
{
    define("PRODUCTION_MODE", true);

    $apnsPort = 2195;

    // Choose dev or production apns host and certificate
    if(PRODUCTION_MODE) {
        $apnsHost = 'gateway.push.apple.com';
        $apnsCert = $_SERVER['DOCUMENT_ROOT'].'/ant/www/apns/PushIphone.pem';
    } else {
        $apnsHost = 'gateway.sandbox.push.apple.com';
        $apnsCert = $_SERVER['DOCUMENT_ROOT'].'/ant/www/apns/CertificatesDev.pem';
    }
    // Notification content
    $payload = json_encode(array('notification_from_panel' => 1, 'aps' => array('alert' => $message, 'badge' => 1, 'sound' => 'default')));

    $streamContext = stream_context_create();
    stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
    stream_context_set_option($streamContext, 'ssl', 'passphrase', "");

    // loop all devices tokens
    foreach ($device_tokens as $device_token) 
    {                       
        try {
            $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
        } catch(Exception $e) {
            echo $e->getMessage();
            continue;
        }
        $deviceToken = str_replace(" ","",substr($device_token,1,-1));
        //echo $deviceToken;
        $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(mb_strlen($payload)) . $payload;
        fwrite($apns, $apnsMessage);

        //socket_close($apns);
        fclose($apns);
    }

}

我在使用Apple的推送服务方面有一些经验,我不得不说,Apple似乎有适当的soem限制。

首先,您不需要关闭和打开每条消息的套接字连接。 这样可以节省您很多时间。 另一方面,在发送下一条消息之前,您必须检查连接是否断开。

无论如何,当您每秒连接一百次并发送消息时,苹果似乎不太喜欢它。 苹果在过去也阻止了我。

但是,当您使用已建立的连接发送消息,并且在某个时刻该连接返回错误/已断开连接时,您不知道他停止了什么消息。 但是您可以为每个消息定义一个标识符,并检查连接断开时返回的错误。

我注意到,苹果服务器延迟了几秒钟才返回错误。 这使得很难以简单的方式来处理它。

我已经编写了一个课程来处理所有这些问题,但没有时间来发布它! 如果您对此感兴趣,请在https://github.com/tinned-software/PHP-Tinned-MobilePush上检查github项目。

我希望尽快完成文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM