当前位置:首页 > PHP教程 > php类库 > 列表

php APNS苹果推送通知服务的服务器端公共类

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-15 11:38:09 浏览: 评论:0 

APNS(英文全称:Apple Push Notification Service),中文翻译为:苹果推送通知服务,[1] 该技术由苹果公司提供的APNS服务,下面来看一个比较完善的苹果推送通知服务的php服务器端公共类.

前段时间开发的一套APNS推送平台效率很差,通过再次深入研究苹果的消息推送服务,总结了不少经验,同时也参考了网上一些技术blog的博文,重新完善了此前写过的一个PHP类,代码如下:

  1. <?php 
  2. /** 
  3.  * ApplePush 苹果消息推送公共类 
  4.  */ 
  5. class ApplePush 
  6.      
  7.     const STATUS_CODE_INTERNAL_ERROR = 999; 
  8.     const ERROR_RESPONSE_SIZE = 6; 
  9.     const ERROR_RESPONSE_COMMAND = 8; 
  10.      
  11.     protected $_errorResponseMessages = array
  12.         0 => 'No errors encountered'
  13.         1 => 'Processing error'
  14.         2 => 'Missing device token'
  15.         3 => 'Missing topic'
  16.         4 => 'Missing payload'
  17.         5 => 'Invalid token size'
  18.         6 => 'Invalid topic size'
  19.         7 => 'Invalid payload size'
  20.         8 => 'Invalid token'
  21.         self::STATUS_CODE_INTERNAL_ERROR => 'Internal error' 
  22.     ); 
  23.      
  24.     /** 
  25.      * APNS server url 
  26.      *  
  27.      * @var string 
  28.      */ 
  29.     protected $apns_url = 'ssl://gateway.push.apple.com:2195'; //沙盒地址:ssl://gateway.sandbox.push.apple.com:2195 
  30.      
  31.     /** 
  32.      * 推送数据 
  33.      *  
  34.      * @var string 
  35.      */ 
  36.     private $payload_json
  37.      
  38.     /** 
  39.      * 数据流对象 
  40.      *  
  41.      * @var mixed 
  42.      */ 
  43.     private $fp
  44.      
  45.     /** 
  46.      * 设置APNS地址 
  47.      *  
  48.      * @param string $url 
  49.      */ 
  50.       
  51.     public function setApnsUrl($url
  52.     { 
  53.         if (emptyempty($url)) { 
  54.             return false; 
  55.         } else { 
  56.             $this->apns_url = $url
  57.         } 
  58.         return true; 
  59.     } 
  60.      
  61.     /** 
  62.      * 设置推送的消息 
  63.      *  
  64.      * @param string $body 
  65.      */ 
  66.     public function setBody($body
  67.     { 
  68.         if (emptyempty($body)) { 
  69.             return false; 
  70.         } else { 
  71.             $this->payload_json = json_encode($body); 
  72.         } 
  73.         return true; 
  74.     } 
  75.      
  76.     /** 
  77.      * Open 打开APNS服务器连接 
  78.      *  
  79.      * @param string $pem 证书 
  80.      * @param string $passphrase 证书密钥 
  81.      */ 
  82.     public function open($pem$passphrase
  83.     { 
  84.         if (emptyempty($pem)) { 
  85.             return false; 
  86.         } 
  87.         if (emptyempty($passphrase)) { 
  88.             return false; 
  89.         } 
  90.         $ctx = stream_context_create(); 
  91.         stream_context_set_option($ctx'ssl''local_cert'$pem); 
  92.         stream_context_set_option($ctx'ssl''passphrase'$passphrase); 
  93.         $fp = stream_socket_client($this->apns_url, $err$errstr, 60, STREAM_CLIENT_CONNECT, $ctx); 
  94.         if (!$fp) { 
  95.             return false; 
  96.         } 
  97.         $this->fp = $fp
  98.         return true; 
  99.     } 
  100.      
  101.     /** 
  102.      * Send 推送 
  103.      *  
  104.      * @param string $token 
  105.      */ 
  106.     public function send($token$id
  107.     { 
  108.         $msg = pack('CNNnH*', 1, $id, 864000, 32, $token) . pack('n'strlen($this->payload_json)) . $this->payload_json; 
  109.         // Send it to the server 
  110.         $result = fwrite($this->fp, $msgstrlen($msg)); 
  111.         return $result
  112.     } 
  113.      
  114.     public function readErrMsg() 
  115.     { 
  116.         $errInfo = @fread($this->fp, self::ERROR_RESPONSE_SIZE); 
  117.         if ($errInfo === false || strlen($errInfo) != self::ERROR_RESPONSE_SIZE) {  //开源软件:phpfensi.com 
  118.             return true; 
  119.         } 
  120.         $errInfo = $this->parseErrMsg($errInfo); 
  121.         if (!is_array($errInfo) || emptyempty($errInfo)) { 
  122.             return true; 
  123.         } 
  124.         if (!isset($errInfo['command'], $errInfo['statusCode'], $errInfo['identifier'])) { 
  125.             return true; 
  126.         } 
  127.         if ($errInfo['command'] != self::ERROR_RESPONSE_COMMAND) { 
  128.             return true; 
  129.         } 
  130.         $errInfo['timeline'] = time(); 
  131.         $errInfo['statusMessage'] = 'None (unknown)'
  132.         $errInfo['errorIdentifier'] = $errInfo['identifier']; 
  133.         if (isset($this->_aErrorResponseMessages[$errInfo['statusCode']])) { 
  134.             $errInfo['statusMessage'] = $this->_errorResponseMessages[$errInfo['statusCode']]; 
  135.         } 
  136.         return $errInfo
  137.     } 
  138.     protected function parseErrMsg($errorMessage
  139.     { 
  140.         return unpack('Ccommand/CstatusCode/Nidentifier'$errorMessage); 
  141.     } 
  142.      
  143.     /** 
  144.      * Close APNS server 关闭APNS服务器连接 
  145.      *  
  146.      */ 
  147.     public function close() 
  148.     { 
  149.         // Close the connection to the server 
  150.         fclose($this->fp); 
  151.         return true; 
  152.     } 
  153. ?>

Tags: APNS苹果推送 php推送通知

分享到: