2015-04-18 2 views
0

Я использовал этот PHP кодPush уведомление не работает в Iphone

$query = "SELECT * FROM iphone_register"; 
$result_iphone = mysql_query($query); 
$fetres = mysql_num_rows($result_iphone); 

while ($rows = mysql_fetch_object($result_iphone)) { 

    $deviceToken = $rows->device_id; 

    $passphrase = '******'; 
    $message = 'New Push Notification!'; 

    $badge = 1; 

    $ctx = stream_context_create(); 
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); 
    stream_context_set_option($ctx, 'ssl', 'passphrase', $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' => 'new notification is arrived', 
     'body'=> $message, 
     'badge' => $badge, 
     'sound' => 'newMessage.wav' 
    ); 

    $payload = json_encode($body); 

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

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

if (!$result) { 
    echo 'Error, notification not sent' . PHP_EOL; 
} else { 
    echo 'notification sent!' . PHP_EOL; 
} 

fclose($fp); 

Когда я отправить уведомление толчок к устройству с сервера, то я получил следующее сообщение об ошибке.

Я стараюсь изменить файл ck.pem для решения проблемы.

но это не работает. Поэтому я не думаю, что у него есть проблема с файлом ck.pem(Certificate).

Warning: stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Connection refused) in /home/sunstate/public_html/sunstate_api/gcm_message.php on line 55 Failed to connect: 111 Connection refused

+0

Привет, вы тестируете для разработки или выпуска? – vivekDas

+0

Также см. ["Проверить ошибку: num = 20" при подключении к gateway.sandbox.push.apple.com] (http://stackoverflow.com/a/23351633/608639). Вы должны обеспечить три вещи: (1) TLS 1.0 или выше; (2) Индикация сервера Nam; (3) * Сертифицирующий орган Entrust.net (2048) * root. – jww

ответ

0

Попробуйте, пожалуйста, под кодом жесткого кодирования маркера устройства.

<?php 
$deviceToken = 'yourdevicetoken'; // masked for security reason 

// Passphrase for the private key (ck.pem file) 
$pass = 'xxxxx'; 

// Get the parameters from http get or from command line 
$message = $_GET['message'] or $message = $argv[1] or $message = 'Message received from BRL server'; 
$badge = (int)$_GET['badge'] or $badge = (int)$argv[2]; 
$sound = $_GET['sound'] or $sound = $argv[3]; 
//$deviceToken = $_GET['deviceToken']; 

// Construct the notification payload 
$body = array(); 
$body['aps'] = array('alert' => $message); 
if ($badge) 
$body['aps']['badge'] = $badge; 
if ($sound) 
$body['aps']['sound'] = $sound; 

/* End of Configurable Items */ 

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck_dev.pem'); 

// assume the private key passphase was removed. 
stream_context_set_option($ctx, 'ssl', 'passphrase', $pass); 

$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr,60,STREAM_CLIENT_CONNECT, $ctx); 
if (!$fp) { 
    print "Failed to connect $err $errstr\n"; 
    return; 
} 
else { 
    print "Connection OK\n"; 
} 

$payload = json_encode($body); 
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload; 
print "sending message :" . $payload . "\n"; 
fwrite($fp, $msg); 
fclose($fp); 
?> 

Скопируйте этот код в .php файл и загрузить его на сервер и запустить этот файл из браузера, добавив фактический маркер устройства.

Также, если вы используете какой-либо сервер хостинга, вам необходимо установить SSL на этом сервере и попросить их открыть порт, связанный с уведомлением, которое было заблокировано провайдером.

Смежные вопросы