多个

时间:2016-07-14 09:49:14

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

我编写了一个向iOS设备发送推送通知的功能。它现在发送推送到100多个设备。但有时它不会发送推送通知。当我通过基于推送通知识别的过程进行调试时,整个过程失败。但问题是所有推送令牌的格式都是有效的。所以我的初始代码是这样的。

   $certificatePath = CERTIFICATE_PATH . "/".APN_CERTIFICATE_FILE;
   $streamContext = stream_context_create();

   stream_context_set_option($streamContext, 'ssl', 'local_cert', $certificatePath);
   stream_context_set_option($streamContext, 'ssl', 'passphrase', APN_PASSWORD);

   $apns = stream_socket_client(APN_HOST . ':' . APN_PORT , $error, $errorString, 2, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $streamContext);
    if (!$apns) {
        echo "Failed to connect $err $errstrn";
        return false;
    } 

    $payload = array();
    $payload['aps'] = array('alert' =>$message,'title'=>$title, 'sound' => 'default','data'=>array());
    $payload = json_encode($payload);

    foreach ($pushTokens as $pushToken)
    {
        $pushToken = str_replace(' ', '', $pushToken);
        if(!ctype_xdigit($pushToken))
            continue;

        $apnsMessage = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $pushToken)) . pack        ("n",strlen($payload)) . $payload;
        $rst = fwrite($apns, $apnsMessage);

    }
    fclose($apns);

作为修复,我将代码更改为不同的方式。我知道这个代码很昂贵,因为它为每个推送通知打开和关闭连接。

$certificatePath = CERTIFICATE_PATH . "/".APN_CERTIFICATE_FILE;
            $streamContext = stream_context_create();

            stream_context_set_option($streamContext, 'ssl', 'local_cert', $certificatePath);
            stream_context_set_option($streamContext, 'ssl', 'passphrase', APN_PASSWORD);


            $payload = array();
            $payload['aps'] = array('alert' =>$message,'title'=>$title, 'sound' => 'default','data'=>array());
            $payload = json_encode($payload);

            foreach ($pushTokens as $pushToken)
            {
                $apns = stream_socket_client(APN_HOST . ':' . APN_PORT , $error, $errorString, 2, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $streamContext);
                if (!$apns) {
                    echo "Failed to connect $err $errstrn";
                    return false;
                } 

                $pushToken = str_replace(' ', '', $pushToken);
                if(!ctype_xdigit($pushToken))
                    continue;

                $apnsMessage = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $pushToken)) . pack        ("n",strlen($payload)) . $payload;
                $rst = fwrite($apns, $apnsMessage);
                fclose($apns);
            }

我想知道fwrite或其他地方是否存在问题。感谢有人可以帮助我使用我的第一种方法,因为它是速度,并以最少的资源运行。

0 个答案:

没有答案
相关问题