我正在从PHP向iPhone发送推送通知。
连接已成功建立,但它会给我类似的错误:
Connection Established
Warning: pack() [function.pack]: Type i: too few arguments in C:'xampp'htdocs'BiiMe'checkAvailableProduct.php on line 68
M{"aps":{"alert":"BiiMe finds product for you","badge":"3","sound":"default"}} M{"aps":{"alert":"BiiMe finds product for you","badge":"3","sound":"default"}}
Warning: socket_close(): supplied resource is not a valid Socket resource in C:'xampp'htdocs'BiiMe'checkAvailableProduct.php on line 79
我的代码是:
function pushToIphone($deviceToken, $badge){
ini_set('display_errors','on');
error_reporting(E_ALL);
// $apnsHost = 'gateway.sandbox.push.apple.com';
$apnsHost = 'gateway.push.apple.com';
$apnsPort = 2195;
$pem_path = dirname(__FILE__);
$pem_path = $pem_path .''cert';
$apnsCert = $pem_path.''apns_cer.pem';
echo $apnsCert."<br/>";
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
if($apns) {
echo "Connection Established<br/>";
$payload = array();
$payload['aps'] = array('alert' => 'BiiMe finds product for you', 'badge' => $badge, 'sound' => 'default');
//$payload['server'] = array('serverId' => $serverId, 'name' => $serverName);
$payload = json_encode($payload);
apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
//$apnsMessage = chr(0) . chr(0) . chr(32) . pack('nic*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
echo $apnsMessage;
print_r($apnsMessage);
fwrite($apns, $apnsMessage);
} else {
echo "Connection fail<br/>";
}
//socket_close($apns);
socket_close($apns);
fclose($apns);
}
生成给定错误消息的行似乎在代码中被注释掉了。
Warning: pack() [function.pack]: Type i: too few arguments
意味着它到达了格式化字符串中的"i",但没有更多的参数要格式化。nic*
的格式字符串至少需要3个参数,但您只提供了一个。
只要$deviceToken是十六进制字符串,您取消注释的代码看起来应该可以正常工作。
它只是来了,因为我发送了错误的设备令牌它只需要数字、字符和空间。禁止使用特殊字符
socket_close();
不使用。
Use fclose(apns);
而不是socket_close(apns);