iosはYIIサードパーティコンポーネントベースのクラスライブラリをプッシュする

11280 ワード

<?php
namespace common\extensions\push;
use \CComponent;

/**
 * @desc    iphone       
 */
class ApnsPush extends CComponent{

    //    
    public $cert;
    
    //ipad    
    public $ipadCert;
    
    //  
    public $passphrase;
    
    public $applePushUrl     = 'ssl://gateway.push.apple.com:2195'; //ssl://gateway.sandbox.push.apple.com:2195    
    public $defaultConf        = array(
                                'badge' => 0,
                                'sound' => 'default',
                                'ispad' => 0,
                                'alert' => '',
                                'token' => ''
                            );
    public $failedSend        = array();
    public $resendTime        = 0;
    public $maxResendTime    = 10;

    function init()
    {
        
    }
    
    /**
     *     
     * @param boolean $ispad
     */
    function getCert($ispad = false)
    {
        return $ispad ? (empty($this->ipadCert) ? $this->cert : $this->ipadCert) : $this->cert;
    }
    
    function getPayload($data = array())
    {
        $body = array();
        strlen($data['alert']) > 87 && $data['alert'] = mb_convert_encoding(substr($data['alert'], 0, 87), 'UTF-8', 'UTF-8') . '...';
        $body['aps']['alert'] = $data['alert'];
        $body['aps']['badge'] = (int) $data['badge'];
        $body['aps']['sound'] = $data['sound'];
        $body = array_merge($body, array_diff_assoc(array_merge($data, $this->defaultConf), $this->defaultConf));
        return $body;
    }

    /**
     *   
     * @param array $sendInfo
     * @return boolean
     */
    function send($sendInfo = array())
    {
        $ctx = stream_context_create();
        $sendInfo = array_merge($this->defaultConf, $sendInfo);
        stream_context_set_option($ctx, 'ssl', 'local_cert', $this->getCert($sendInfo['ispad']));
        stream_context_set_option($ctx, 'ssl', 'passphrase', $this->passphrase); //
        $fp = stream_socket_client($this->applePushUrl, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
        if (!$fp)
        {
            return false;
        }
        $payload = json_encode($this->getPayload($sendInfo));
        //echo strlen($payload); //        ,      256    strlen  256         。
        $msg = chr(0) . pack("n", 32) . pack('H*', str_replace(' ', '', $sendInfo['token'])) . pack("n", strlen($payload)) . $payload;
        fwrite($fp, $msg);
        fclose($fp);
        return true;
    }
    
    /**
     *     
     * @param array $batchSendInfo
     */
    function batchSend($batchSendInfo = array())
    {
        $this->failedSend = array();
        if( ! empty($batchSendInfo))
        {
            foreach ($batchSendInfo as $val)
            {
                if( ! $this->send($val))
                {
                    $this->failedSend[] = $val;
                }
            }
            if( ! empty($this->failedSend) && $this->resendTime < $this->maxResendTime )
            {
                $this->resendTime++;
                $this->batchSend($this->failedSend);
            }
        }
    }
}