从PHP发送推送通知时警告pack()


warning about pack() while sending push notification from PHP

我正在从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);