2014-10-26 25 views
6

Ứng dụng của tôi vẫn đang được phát triển và tôi đã sử dụng hướng dẫn này để gửi Thông báo đẩy iOS bằng cách sử dụng PHP và SSL.Làm cách nào để gửi Thông báo đẩy iOS bằng TLS và PHP?

http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1

Nó được làm việc nhưng nó gần đây đã được khấu hao vì Apple gần đây đã quyết định bỏ học SSL ngay lập tức ảnh hưởng đến tất cả các ứng dụng trong việc phát triển và ứng dụng trong sản xuất đã cho đến khi 29 tháng 10 để thay đổi mã của họ.

Tôi muốn biết cách thực hiện tương tự bằng TLS thay vì SSL.

Đây là những gì php của tôi đã từng làm việc trông giống như:

$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); 

tôi đã cố gắng thêm một giấy chứng nhận Entrust như Apple gợi ý:

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'tls', 'local_cert', 'ck.pem'); 
stream_context_set_option($ctx, 'tls', 'passphrase', $passphrase); 
stream_context_set_option($ctx, 'tls', 'cafile', 'entrust_2048_ca.cer'); 
$fp = stream_socket_client('tls://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

Nhưng nó vẫn không hoạt động. Bạn có bất cứ đề nghị để sửa chữa nó?

Trả lời

3
$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); 
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 
stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer'); 
$fp = stream_socket_client('tls://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

nếu bạn làm việc trong một môi trường localhost đừng quên tải về tệp giấy chứng nhận entrust_2048_ca.cer

+0

Nó vẫn không hoạt động. Nó không phải là cho một môi trường localhost như tôi đang thử nghiệm trên máy chủ của tôi. Một lần nữa, tất cả mọi thứ được sử dụng để làm việc trước khi thông báo của Apple. Bất kỳ đề xuất nào khác? Cảm ơn. – Joe

+0

Đối với tôi, nó cũng không hoạt động. Tôi đã tải xuống entrust_2048_ca.cer từ https://www.entrust.net/downloads/root_request.cfm, thêm tùy chọn quán cà phê và thay đổi ssl thành tsl cho lược đồ URL. Kết quả tương tự - nó cho biết Tin nhắn đã được gửi thành công, nhưng không có thông báo trên thiết bị. Nếu gửi tin nhắn bằng cách khác (sử dụng ruby) - sẽ được gửi. – Slabko

+0

Nó hoạt động ở địa phương env ít nhất. Chưa thử nghiệm ở phía máy chủ nhưng nó hoạt động. – Jeet

2
<?php 
$message = 'aa_' . rand(10000,99999); 

$deviceToken = array(
    'xxxxxx' 
); 

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'passphrase', '111111'); 
stream_context_set_option($ctx, "ssl", "local_cert", './apns.pem'); 

$fp = NULL; 
$errno = NULL; 
$errstr = NULL; 

$fp = stream_socket_client("tls://gateway.sandbox.push.apple.com:2195", $errno, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

if($fp === FALSE){ 
    exit('error message'); 
} 

$content = array("aps" => array("alert" => $message, "badge" => 4, "sound" => 'default', "code" => 200)); 
$data = json_encode($content); 

foreach ($deviceToken as $token) { 
    $msg = chr(0) . pack("n", 32) . pack("H*", $token) . pack("n", strlen($data)) . $data; 
    fwrite($fp, $msg); 
    fflush($fp); 
} 

fclose($fp); 
0

Dưới đây là một vài lời khuyên rằng nên có thể giúp bạn tìm ra:

  1. Đi tới entrust.net/downloads/root_request.cfm và tải xuống entrust_2048_ca.cer

  2. Thêm mã sau: stream_context_set_option ($ ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer');

  3. Đảm bảo đường dẫn đúng: '../folder/file/ck.pem'?

  4. Chuyển đổi và thử cả hộp cát và liên kết ssl trực tiếp.

  5. Chuyển dev và pem sản xuất và thử cả hai.

Các vấn đề liên quan