在 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 中获取失败的设备令牌的主要内容,如果未能解决你的问题,请参考以下文章