찾다
php教程php手册PHP实现APNS推送

PHP实现APNS推送

Jun 06, 2016 pm 08:07 PM
apnshttpphp성취하다푸시

参考http://code.google.com/p/apns-php/作为修改 上面的项目实现很完全,其中包括了队列。服务端实现等,但是功能过于复杂。简单的使用觉得不顺手! 用了几个小时,参考其过程,写了一个class文件,直接使用即可。简单且好理解 闲话少说,上代码 ?php/*** @

参考http://code.google.com/p/apns-php/作为修改
上面的项目实现很完全,其中包括了队列。服务端实现等,但是功能过于复杂。简单的使用觉得不顺手!

用了几个小时,参考其过程,写了一个class文件,直接使用即可。简单且好理解
闲话少说,上代码

<?php /**
* @file apns.php
* @synopsis  apple APNS class
* @author Yee, <rlk002@gmail.com>
* @version 1.0
* @date 2012-09-17 11:27:59
*/
<span id="more-996"></span>
    class APNS
    {
        const ENVIRONMENT_PRODUCTION = 0;
        const ENVIRONMENT_SANDBOX = 1;
        const DEVICE_BINARY_SIZE = 32;
        const CONNECT_RETRY_INTERVAL = 1000000;
        const SOCKET_SELECT_TIMEOUT = 1000000;
        const COMMAND_PUSH = 1;
        const STATUS_CODE_INTERNAL_ERROR = 999;
        const ERROR_RESPONSE_SIZE = 6;
        const ERROR_RESPONSE_COMMAND = 8;
        const PAYLOAD_MAXIMUM_SIZE = 256;
        const APPLE_RESERVED_NAMESPACE = 'aps';
        protected $_environment;
        protected $_providerCertificateFile;
        protected $_rootCertificationAuthorityFile;
        protected $_connectTimeout;
        protected $_connectRetryTimes = 3;
        protected $_connectRetryInterval;
        protected $_socketSelectTimeout;
        protected $_hSocket;
        protected $_deviceTokens = array();
        protected $_text;
        protected $_badge;
        protected $_sound;
        protected $_customProperties;
        protected $_expiryValue = 604800;
        protected $_customIdentifier;
        protected $_autoAdjustLongPayload = true;
        protected $asurls = array('ssl://gateway.push.apple.com:2195','ssl://gateway.sandbox.push.apple.com:2195');
        protected $_errorResponseMessages = array
                            (
                                0   => 'No errors encountered',
                                1 => 'Processing error',
                                2 => 'Missing device token',
                                3 => 'Missing topic',
                                4 => 'Missing payload',
                                5 => 'Invalid token size',
                                6 => 'Invalid topic size',
                                7 => 'Invalid payload size',
                                8 => 'Invalid token',
                                self::STATUS_CODE_INTERNAL_ERROR => 'Internal error'
                            );
        function __construct($environment,$providerCertificateFile)
        {
            if($environment != self::ENVIRONMENT_PRODUCTION && $environment != self::ENVIRONMENT_SANDBOX) 
            {
                throw new Exception(
                    "Invalid environment '{$environment}'"
                );
            }
            $this->_environment = $environment;
            if(!is_readable($providerCertificateFile)) 
            {
                throw new Exception(
                    "Unable to read certificate file '{$providerCertificateFile}'"
                );
            }
            $this->_providerCertificateFile = $providerCertificateFile;
            $this->_connectTimeout = @ini_get("default_socket_timeout");
            $this->_connectRetryInterval = self::CONNECT_RETRY_INTERVAL;
            $this->_socketSelectTimeout = self::SOCKET_SELECT_TIMEOUT;
        }
        public function setRCA($rootCertificationAuthorityFile)
        {
            if(!is_readable($rootCertificationAuthorityFile)) 
            {
                throw new Exception(
                    "Unable to read Certificate Authority file '{$rootCertificationAuthorityFile}'"
                );
            }
            $this->_rootCertificationAuthorityFile = $rootCertificationAuthorityFile;
        }
        public function getRCA()
        {
            return $this->_rootCertificationAuthorityFile;
        }
        protected function _connect()
        {
            $sURL = $this->asurls[$this->_environment];
            $streamContext = stream_context_create(
                array
                    (
                        'ssl' => array
                        (
                            'verify_peer' => isset($this->_rootCertificationAuthorityFile),
                            'cafile' => $this->_rootCertificationAuthorityFile,
                            'local_cert' => $this->_providerCertificateFile
                        )
                    )
                );
            $this->_hSocket = @stream_socket_client($sURL,$nError,$sError,$this->_connectTimeout,STREAM_CLIENT_CONNECT, $streamContext);
            if (!$this->_hSocket) 
            {
                throw new Exception
                (
                    "Unable to connect to '{$sURL}': {$sError} ({$nError})"
                );
            }
            stream_set_blocking($this->_hSocket, 0);
            stream_set_write_buffer($this->_hSocket, 0);
            return true;
        }
        public function connect()
        {
            $bConnected = false;
            $retry = 0;
            while(!$bConnected) 
            {
                try 
                {
                    $bConnected = $this->_connect();
                }catch (Exception $e) 
                {
                    if ($nRetry >= $this->_connectRetryTimes) 
                    {
                        throw $e;
                    }else 
                    {
                        usleep($this->_nConnectRetryInterval);
                    }
                }
                $retry++;
            }
        }
        public function disconnect()
        {
            if (is_resource($this->_hSocket)) 
            {
                return fclose($this->_hSocket);
            }
            return false;
        }
        protected function getBinaryNotification($deviceToken, $payload, $messageID = 0, $Expire = 604800)
        {
            $tokenLength = strlen($deviceToken);
            $payloadLength = strlen($payload);
            $ret  = pack('CNNnH*', self::COMMAND_PUSH, $messageID, $Expire > 0 ? time() + $Expire : 0, self::DEVICE_BINARY_SIZE, $deviceToken);
            $ret .= pack('n', $payloadLength);
            $ret .= $payload;
            return $ret;
        }
        protected function readErrorMessage()
        {
            $errorResponse = @fread($this->_hSocket, self::ERROR_RESPONSE_SIZE);
            if ($errorResponse === false || strlen($errorResponse) != self::ERROR_RESPONSE_SIZE) 
            {
                return;
            }
            $errorResponse = $this->parseErrorMessage($errorResponse);
            if (!is_array($errorResponse) || empty($errorResponse)) 
            {
                return;
            }
            if (!isset($errorResponse['command'], $errorResponse['statusCode'], $errorResponse['identifier'])) 
            {
                return;
            }
            if ($errorResponse['command'] != self::ERROR_RESPONSE_COMMAND) 
            {
                return;
            }
            $errorResponse['timeline'] = time();
            $errorResponse['statusMessage'] = 'None (unknown)';
            if (isset($this->_aErrorResponseMessages[$errorResponse['statusCode']])) 
            {
                $errorResponse['statusMessage'] = $this->_errorResponseMessages[$errorResponse['statusCode']];
            }
            return $errorResponse;
        }
        protected function parseErrorMessage($errorMessage)
        {
            return unpack('Ccommand/CstatusCode/Nidentifier', $errorMessage);
        }
        public function send()
        {
            if (!$this->_hSocket) 
            {
                throw new Exception
                (
                    'Not connected to Push Notification Service'
                );
            }
            $sendCount = $this->getDTNumber();
            $messagePayload = $this->getPayload();
            foreach($this->_deviceTokens AS $key => $value)
            {
                $apnsMessage = $this->getBinaryNotification($value, $messagePayload, $messageID = 0, $Expire = 604800);
                $nLen = strlen($apnsMessage);
                $aErrorMessage = null;
                if ($nLen !== ($nWritten = (int)@fwrite($this->_hSocket, $apnsMessage))) 
                {
                    $aErrorMessage = array
                    (
                        'identifier' => $key,
                        'statusCode' => self::STATUS_CODE_INTERNAL_ERROR,
                        'statusMessage' => sprintf('%s (%d bytes written instead of %d bytes)',$this->_errorResponseMessages[self::STATUS_CODE_INTERNAL_ERROR], $nWritten, $nLen)
                    );
                }
            }
        }
        public function addDT($deviceToken)
        {
            if (!preg_match('~^[a-f0-9]{64}$~i', $deviceToken)) 
            {
                throw new Exception
                (
                    "Invalid device token '{$deviceToken}'"
                );
            }
            $this->_deviceTokens[] = $deviceToken;
        }       
        public function getDTNumber()
        {
            return count($this->_deviceTokens);
        }
        public function setText($text)
        {
            $this->_text = $text;
        }
        public function getText()
        {
            return $this->_text;
        }
        public function setBadge($badge)
        {
            if (!is_int($badge)) 
            {
                throw new Exception
                (
                    "Invalid badge number '{$badge}'"
                );
            }
            $this->_badge = $badge;
        }
        public function getBadge()
        {
            return $this->_badge;
        }
        public function setSound($sound = 'default')
        {
            $this->_sound = $sound;
        }
        public function getSound()
        {
            return $this->_sound;
        }
        public function setCP($name, $value)
        {
            if ($name == self::APPLE_RESERVED_NAMESPACE) 
            {
                throw new Exception
                (
                    "Property name '" . self::APPLE_RESERVED_NAMESPACE . "' can not be used for custom property."
                );
            }
            $this->_customProperties[trim($name)] = $value;
        }
        protected function _getPayload()
        {
            $aPayload[self::APPLE_RESERVED_NAMESPACE] = array();
            if (isset($this->_text)) 
            {
                $aPayload[self::APPLE_RESERVED_NAMESPACE]['alert'] = (string)$this->_text;
            }
            if (isset($this->_badge) && $this->_badge > 0) 
            {
                $aPayload[self::APPLE_RESERVED_NAMESPACE]['badge'] = (int)$this->_badge;
            }
            if (isset($this->_sound)) 
            {
                $aPayload[self::APPLE_RESERVED_NAMESPACE]['sound'] = (string)$this->_sound;
            }
            if (is_array($this->_customProperties)) 
            {
                foreach($this->_customProperties as $propertyName => $propertyValue) 
                {
                    $aPayload[$propertyName] = $propertyValue;
                }
            }
            return $aPayload;
        }
        public function setExpiry($expiryValue)
        {
            if (!is_int($expiryValue)) 
            {
                throw new Exception
                (
                    "Invalid seconds number '{$expiryValue}'"
                );
            }
            $this->_expiryValue = $expiryValue;
        }
        public function getExpiry()
        {
            return $this->_expiryValue;
        }
        public function setCustomIdentifier($customIdentifier)
        {
            $this->_customIdentifier = $customIdentifier;
        }
        public function getCustomIdentifier()
        {
            return $this->_customIdentifier;
        }       
        public function getPayload()
        {
            $sJSONPayload = str_replace
            (
                '"' . self::APPLE_RESERVED_NAMESPACE . '":[]',
                '"' . self::APPLE_RESERVED_NAMESPACE . '":{}',
                json_encode($this->_getPayload())
            );
            $nJSONPayloadLen = strlen($sJSONPayload);
            if ($nJSONPayloadLen > self::PAYLOAD_MAXIMUM_SIZE)
            {
                if ($this->_autoAdjustLongPayload) 
                {
                    $maxTextLen = $textLen = strlen($this->_text) - ($nJSONPayloadLen - self::PAYLOAD_MAXIMUM_SIZE);
                    if ($nMaxTextLen > 0)
                    {
                        while (strlen($this->_text = mb_substr($this->_text, 0, --$textLen, 'UTF-8')) > $maxTextLen);
                        return $this->getPayload();
                    }else
                    {
                        throw new Exception
                        (
                            "JSON Payload is too long: {$nJSONPayloadLen} bytes. Maximum size is " .
                            self::PAYLOAD_MAXIMUM_SIZE . " bytes. The message text can not be auto-adjusted."
                        );
                    }
                }else
                {
                    throw new Exception
                    (
                        "JSON Payload is too long: {$nJSONPayloadLen} bytes. Maximum size is " .
                        self::PAYLOAD_MAXIMUM_SIZE . " bytes"
                    );
                }
            }
            return $sJSONPayload;
        }   
    }
?>


使用办法:

    include 'apns.php';
    $rootpath = 'entrust_root_certification_authority.pem';  //ROOT证书地址
    $cp = 'production_push_certificates.pem';  //provider证书地址
    $apns = new APNS(0,$cp);
    try
    {
        $apns->setRCA($rootpath);  //设置ROOT证书
        $apns->connect(); //连接
        $apns->addDT('b9d98721b5586b61a00fbfa0d61a033954e1bfb8faaae3dfc5a1382xxxxxx');  //加入deviceToken
        $apns->setText('这是一条测试信息');  //发送内容
        $apns->setBadge(1);  //设置图标数
        $apns->setSound();  //设置声音
        $apns->setExpiry(3600);  //过期时间
        $apns->setCP('fljt',array('type' => '1','url' => 'http://www.google.com.hk'));  //自定义操作
        $apns->send();  //发送
    }catch(Exception $e)
    {
        echo $e;
    }

下载文件:apns

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음