PHP发送推式通知无法连接:111连接被拒绝

时间:2018-08-25 07:10:41

标签: php ios apple-push-notifications

我正在尝试设置推送通知,我从Apple开发人员那里获得了证书,无法在ios应用上推送通知,并且我有一个PHP脚本可以发送推送通知。我的托管服务提供商将我的帐户的出站端口2195列入了白名单。但是推送通知仍然无法正常工作,我收到此错误

  

无法连接:111连接被拒绝

我正在使用开发证书,并且在我的Apple开发者帐户中启用了它们。

<?php 

class PushNotifications {

    private static $passphrase = 'PASSPHRASE';

    public function iOS($data, $devicetoken) {

        $deviceToken = $devicetoken;

        $ctx = stream_context_create();

        stream_context_set_option($ctx, 'ssl', 'local_cert', 'Certificates.pem');
        stream_context_set_option($ctx, 'ssl', 'passphrase', self::$passphrase);

        $fp = stream_socket_client(
            'ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

        if (!$fp)
        {
            exit("Failed to connect: $err $errstr" . PHP_EOL);
        }

        $body['aps'] = array('alert' => array('title' => $data['mtitle'], 'body' => $data['mdesc'],),'sound' => 'default');

        $payload = json_encode($body);

        $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

        $result = fwrite($fp, $msg, strlen($msg));

        fclose($fp);

        if (!$result)
            return 'Message not delivered' . PHP_EOL;
        else
            return 'Message successfully delivered' . PHP_EOL;

    }

    private function useCurl(&$model, $url, $headers, $fields = null) {

        $ch = curl_init();
        if ($url) {
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            if ($fields) {
                curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
            }
            $result = curl_exec($ch);
            if ($result === FALSE) {
                die('Curl failed: ' . curl_error($ch));
            }

            curl_close($ch);

            return $result;
        }
    }

}
?>

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

确保您仍然没有受到阻止(从php主机运行此命令):

telnet gateway.sandbox.push.apple.com 2195

如果连接被拒绝,则问题仍然出在您的主机提供商或您与APNS之间的某人。

或者,如果您没有外壳访问权限,则:

fsockopen('gateway.sandbox.push-apple.com.akadns.net', 2195);

答案 1 :(得分:0)

我已找到问题并解决。

问题出在.pem证书中。不知何故,一个文件中有两个用于生产和开发.pem文件的证书。带有两个证书的同一个.pem文件已经存在很长时间了,但是APNs仅在几个月前停止工作。也许苹果方面进行了升级/更改。

但是,解决方案是从.pem文件中删除第二个证书。之后,APN开始工作,现在就可以工作。

答案 2 :(得分:0)

希望尝试一下,它对您有用。

消息数据

$pushnoti = array();
$pushnoti['type'] = 'message_notification';
$pushnoti['body'] = array( 'message' => "Your Order id Completed");
send_notification_iphone ($deviceToken, $pushnoti);

通知功能

function send_notification_iphone( $deviceToken, $data) {

    // Put your private key's passphrase here:
    $passphrase = self::$passphrase;
    $pem = 'ck.pem';
    $ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', $pem);
    // Open a connection to the APNS server
    $fp = stream_socket_client(
        'ssl://gateway.sandbox.push.apple.com:2195', $err,
        $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
    if (!$fp)
        exit("Failed to connect: $err $errstr" . PHP_EOL);
    $message['body'] = $data['body'];
    $body['aps'] = array( 'alert' => $data['body']['message'], 'body' => $data['body'], 'type'=> $data['type'] );
    $body['badge'] =3;
    $body['sound'] ='cat.caf';
    // Encode the payload as JSON
    $payload = json_encode($body);
    // Build the binary notification
    $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
    // Send it to the server
    $result = fwrite($fp, $msg, strlen($msg));
    if (!$result)
        echo 'Message not delivered' . PHP_EOL;
    else
        // Close the connection to the server
        fclose($fp);
}

答案 3 :(得分:0)

我也遇到了这个错误。请记住以下几点:

  1. ios推送证书文件的路径应正确。使用设备令牌和推送证书检查在线门户。
  2. 您的服务器已启用2195端口。使用telnet命令检查终端。
  3. 如果使用

    ,请检查您的php版本支持的ssl
      

    ssl://gateway.sandbox.push.apple.com

    和tls(如果使用

      

    tls://gateway.sandbox.push.apple.com

  4. 您在推送或令牌等中发送的数据应等于或小于苹果文档中提到的指定字节。链接在下面提到。

您还可以使用api get reference来发送推送,开发服务器:

  

api.development.push.apple.com:443

生产服务器:

  

api.push.apple.com:443

https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html#//apple_ref/doc/uid/TP40008194-CH11-SW1