在 apns.php 中获取失败的设备令牌

Posted

技术标签:

【中文标题】在 apns.php 中获取失败的设备令牌【英文标题】:Get failed device token in apns.php 【发布时间】:2016-11-21 06:19:55 【问题描述】:

大家好, 这是我的 Apns.php 文件。

      <?php
      //error_reporting(E_ALL);
      # -*- coding: utf-8 -*-
      ##
      ##     Copyright (c) 2010 Benjamin Ortuzar Seconde <bortuzar@gmail.com>
      ##
      ##     This file is part of APNS.
      ##
      ##     APNS is free software: you can redistribute it and/or modify
      ##     it under the terms of the GNU Lesser General Public License as
      ##     published by the Free Software Foundation, either version 3 of
      ##     the License, or (at your option) any later version.
      ##
      ##     APNS is distributed in the hope that it will be useful,
      ##     but WITHOUT ANY WARRANTY; without even the implied warranty of
      ##     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      ##     GNU General Public License for more details.
      ##
      ##     You should have received a copy of the GNU General Public License
      ##     along with APNS.  If not, see <http://www.gnu.org/licenses/>.
      ##
      ##
      ## $Id: Apns.php 168 2010-08-28 01:24:04Z Benjamin Ortuzar Seconde $
      ##

      /**
       * Apple Push Notification Server
       */
      class Apns
      
          protected $server;
          protected $keyCertFilePath;
          protected $passphrase;
          protected $stream;


              /**
               * Connects to the APNS server with a certificate and a passphrase
               *
               * @param <string> $server
               * @param <string> $keyCertFilePath
               * @param <string> $passphrase
               */
          function __construct($server, $keyCertFilePath ,$passphrase)

              $this->server = $server;
              $this->keyCertFilePath = $keyCertFilePath;
              $this->passphrase = $passphrase;
              $this->connect();
          


          /**
               * Connects to the server with the certificate and passphrase
               *
               * @return <void>
               */
          private function connect()

              $ctx = stream_context_create();
              stream_context_set_option($ctx, 'ssl', 'local_cert', $this->keyCertFilePath);
              // assume the private key passphase was removed.
              stream_context_set_option($ctx, 'ssl', 'passphrase', $this->passphrase);
              $this->stream = stream_socket_client($this->server, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
              if (!$this->stream) 
                  throw new Exception("<br/>Failed to connect $err $errstr");
              
              else 
                  //print "<br/>Opening connection to: $this->server";
              
          
              /**
               * Sends a message to device
               * 
               * @param <string> $deviceToken
               * @param <string> $message
               * @param <int> $badge
               * @param <string> $sound
               */
              public function sendMessage($deviceToken, $message, $badge = NULL, $sound = NULL,$uid=NULL,$type=NULL,$sid=NULL,$io=NULL)

                  //generate the payload
                  $payload = $this->generatePayload($message, $badge, $sound,$uid,$type,$sid,$io);
                  //send payload to the device.
                  $this->sendPayload($deviceToken, $payload);
              
              /*
               *
               * Generates the payload
               * 
               * @param <string> $message
               * @param <int> $badge
               * @param <string> $sound
               * @return <string>
               */
              protected function generatePayload($message, $badge = NULL, $sound = NULL,$uid=NULL,$type=NULL,$sid=NULL,$io=NULL) 
                  $body = array();
                   //message
                  $body['aps'] = array('alert' => $message);
                   //badge
                   if ($badge) 
                       $body['aps']['badge'] = $badge;
                   
                    //sound
                   if ($sound) 
                        $body['aps']['sound']=$sound;
                  
                  if ($uid) 
                        $body['aps']['uid'] = $uid;
                  
                  if ($type) 
                        $body['aps']['type'] = $type;
                  
                  if ($sid!=NULL) 
                      $body['aps']['sid'] = $sid;
                  
                  if ($io!=NULL) 
                      $body['aps']['io'] = $io;
                  
                  $payload = json_encode($body);

                  echo "<pre>"; print_r($payload);die;

                  return $payload;
              
              /**
               * Writes the contents of payload to the file stream
               * 
               * @param <string> $deviceToken
               * @param <string> $payload
               */
          protected function sendPayload($deviceToken, $payload)
              $msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
              //$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ','', $deviceToken)) . pack("n",strlen($payload)) . $payload;
              fwrite($this->stream, $msg);
          
          /**
               * Gets an array of feedback tokens
               *
               * @return <array>
               */
          public function getFeedbackTokens() 
              $feedback_tokens = array();
              //and read the data on the connection:
              while(!feof($this->stream)) 
                  $data = fread($this->stream, 38);
                  if(strlen($data))       
                      $feedback_tokens[] = unpack("N1timestamp/n1length/H*devtoken", $data);
                  
              
              return $feedback_tokens;
          
          /**
               * Closes the stream
               */
          function __destruct()
                //  print "<br/>Clossing connection to: $this->server";
                  fclose($this->stream);
          
      //end of class
      ?>
我要查找哪个设备没有收到ios通知。 有些设备收到通知,有些则收不到。 我想获取未收到通知的失败设备令牌。 失败的设备令牌被插入到我的数据库中。我该怎么办?

您能否帮助我并给出正确的解决方案来获取失败的设备令牌。 ?

提前致谢!

【问题讨论】:

【参考方案1】:

Apple 不会告诉你以下内容:

    不会告诉消息是否发送成功 2.不会告诉用户是否选择退出推送通知

【讨论】:

可以使用来自 Apns.php 的 getFeedbackTokens() 这些函数。但我不知道如何使用上述功能。

以上是关于在 apns.php 中获取失败的设备令牌的主要内容,如果未能解决你的问题,请参考以下文章

继续发送推送通知,丢弃 ios 的失败设备

如何在本机反应中获取设备令牌

获取推送通知的生产 iOS 设备令牌

如何使用 Xamarin 在 iOS 13 中获取设备令牌?

如何仅在用户下载应用程序后获取设备令牌?

无法在 react-native 中获取 iOS 推送通知设备令牌