ios推送基于YII第三方组件的类库

<?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);
            }
        }
    }
}

 

posted @ 2013-07-03 17:33  葬神  阅读(270)  评论(0编辑  收藏  举报