9

Tôi đang sử dụng this tutorial để tìm hiểu thông báo đẩy.Thông báo đẩy không nhận được trên iphone

<?php 

// Put your device token here (without spaces): 
$deviceToken = '1675ba8bb005740bb514222227f861c30230a81e6eed6bb6b8f353c57831341d'; 

// Put your private key's passphrase here: 
$passphrase = '111134'; 

// Put your alert message here: 
$message = 'My first push notification!'; 

//////////////////////////////////////////////////////////////////////////////// 

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

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

echo 'Connected to APNS' . PHP_EOL; 

// Create the payload body 
$body['aps'] = array(
'alert' => $message, 
'sound' => 'default' 
); 

// 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)); 
echo 'result =' . $result. PHP_EOL; 
if (!$result) 
echo 'Message not delivered' . PHP_EOL; 
else 
echo 'Message successfully delivered' . PHP_EOL; 

// Close the connection to the server 
fclose($fp); 

Tôi cũng định cấu hình ứng dụng để thông báo đẩy. Sau khi cấu hình cho push tôi cũng tạo lại provisioning profiles, xóa một cái cũ, cài đặt profile mới. Tôi chạy ứng dụng nó cung cấp cho tôi id thiết bị và sau đó tôi kết nối cả sandbox máy chủ và sản xuất để gửi thông báo đẩy với hồ sơ push tương đối của họ nhưng tôi vẫn không thể nhận được thông báo đẩy trên thiết bị của tôi.

Tôi cũng cài đặt ipusher trên thiết bị của mình và kiểm tra thông báo đẩy. chúng đến từ ứng dụng đó.

Một điều lạ tôi nhận thấy là tôi thay đổi nhận dạng ứng dụng của tôi và sử dụng bất kỳ id ứng dụng khác thì thẻ thiết bị vẫn giống nhau

Bây giờ vấn đề của tôi là tôi không nhận được thông báo push trên điện thoại của tôi.


Sự cố không có trong tiểu sử của tôi. Có thể là lỗi là mã php mà tôi đang sử dụng bởi vì khi tôi sử dụng các apns dễ dàng trên máy chủ từ xa sau đó nó sẽ gửi thông báo đẩy. Thông báo nhận được thời gian từ 6 đến 7 giờ. Tôi nghĩ điều này là do sự cố mạng ở phía thiết bị của tôi. Nhưng bây giờ nó hoạt động tốt sau 2 ngày trên hồ sơ sản xuất. Bây giờ, thông báo không mất thời gian để phân phối trên thiết bị của tôi nhưng mất khoảng 30 giây đến 5 phút trên một số thiết bị.


Có thể còn một vấn đề nữa nếu bạn không nhận được thông báo đẩy trên thiết bị của mình từ các ứng dụng khác, bạn nên kiểm tra kết nối DNS của mình.

+2

Đây là phần triển khai phía máy chủ về phần ứng dụng iphone. U có thể kiểm tra hướng dẫn này http://mobiforge.com/developing/story/programming-apple-push-notification-services http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part- 12 – iamsult

+0

tôi theo dõi raywenderlich để thực hiện iphone. để nhận mã thông báo thiết bị –

+0

Sự cố không có trong tiểu sử của tôi. Có thể là lỗi là mã php mà tôi đang sử dụng bởi vì khi tôi sử dụng các apns dễ dàng trên máy chủ từ xa sau đó nó sẽ gửi thông báo đẩy. Các thông báo nhận được thời gian là 6 đến 7 giờ. Tôi nghĩ điều này là do sự cố mạng ở phía thiết bị của tôi. Nhưng bây giờ nó hoạt động tốt sau 2 ngày trên hồ sơ sản xuất. Bây giờ, thông báo không mất thời gian để phân phối trên thiết bị của tôi nhưng mất khoảng 30 giây đến 5 phút trên một số thiết bị. –

Trả lời

2

Được rồi tôi cuối cùng đã nhận được sự cố của mình. Vấn đề là không có trong mã thực sự vấn đề là trong giá trị DNS sai đặt trong iphone của tôi. Iphone tự động đặt ip của router của tôi cho lĩnh vực DNS. Bây giờ tôi cung cấp cho các giá trị DNS của nhà cung cấp dịch vụ của tôi sau đó nó hoạt động tốt. Bây giờ tôi nhận được tin nhắn Push Ngay sau khi tôi gửi chúng.

Tôi hy vọng nó sẽ giúp người khác.

1

Kiểm tra chứng chỉ thông báo đẩy của bạn. chứng chỉ được liên kết với bất kỳ khóa riêng tư nào?

Nếu không, vui lòng tạo lại chứng chỉ thông báo đẩy bằng khóa cá nhân thích hợp được tạo từ chuỗi khóa của bạn.

Hãy xem tại Hướng dẫn dưới đây:

Apple Push Notification Tutorial:

cảm ơn,

MinuMaster

2

Thực hiện các dịch vụ thông tin phản hồi về phía máy chủ và cũng kiểm tra trên máy chủ bên đó trong vòng bao nhiêu thời lượng tất cả mã thông báo thiết bị được gửi đến APNS. Từ dịch vụ phản hồi, bạn sẽ biết rằng có bao nhiêu thiết bị đã nhận được thông báo ur. Nếu tất cả mã thông báo thiết bị được gửi từng cái một đến APN và APN không gửi bất kỳ danh sách nào qua dịch vụ phản hồi thì u không thể xử lý thời lượng nhận thông báo trên thiết bị.

1

Sử dụng UrbanAirShip. Theo tôi đó là giải pháp phía máy chủ tốt nhất vì nó bao gồm các thông báo Push-alike cho Android (C2DM) và Blakberry.

Thử tìm sự khác biệt giữa các tệp này với các tệp và hiểu chúng. Có thể là một giải pháp cho vấn đề của bạn.Dưới đây là mã của tôi:

<?php 

$message = 'Hello'; // $_GET or $_POST 
$badge = 3; // int 
$sound = 'default'; // string - sound name 
$development = true; // boolean 

$payload = array(); 
$payload['aps'] = array('alert' => $message, 'badge' => intval($badge), 'sound' => $sound); 
$payload = json_encode($payload); 

$apns_url = NULL; // Set Later 
$apns_cert = NULL; // Set Later 
$apns_port = 2195; 

if($development) 
{ 
    $apns_url = 'gateway.sandbox.push.apple.com'; 
    $apns_cert = '/path/apns.pem'; // relative address to an App Specific Certificate  file 
} 
else 
{ 
    $apns_url = 'gateway.push.apple.com'; 
    $apns_cert = '/path/cert-prod.pem'; 
} 

$stream_context = stream_context_create(); 
stream_context_set_option($stream_context, 'ssl','local_cert',$apns_cert); 

$apns = stream_socket_client('ssl://'.$apns_url.':'.$apns_port,$error,$error_string,2,STREAM_CLIENT _CONNECT,$stream_context); 

// You will need to put your device tokens into the $device_tokens array yourself 
$device_tokens = array(); // tokens!!! 

foreach($device_tokens as $device_token) 
{ 
    $apns_message = chr(0).chr(0).chr(32).pack('H*',str_replace(' ','',$device_token)).chr(0).chr(strlen($payload)).$payload; 
    fwrite($apns, $apns_message); 
} 

@socket_close($apns); 
@fclose($apns); 
?> 
8

Trước tiên hãy chắc chắn rằng bạn đang sử dụng:

  • Ứng dụng này được biên soạn với cung debug/release
  • keychain của bạn có giấy chứng nhận thông báo devlopment/sản xuất đẩy

sau đó sử dụng mã sau (được kiểm tra cả hai dev & sản xuất)

<?php 
// Comment these lines in production mode 
ini_set('display_errors','on'); 
error_reporting(E_ALL); 


// Apns config 

// true - use apns in production mode 
// false - use apns in dev mode 
define("PRODUCTION_MODE",false); 

$serverId = 1; 
$serverName = 'my-server-domain.com'; 

if(PRODUCTION_MODE) { 
$apnsHost = 'gateway.sandbox.push.apple.com'; 
} else { 
$apnsHost = 'gateway.push.apple.com'; 
} 

$apnsPort = 2195; 
if(PRODUCTION_MODE) { 
// Use a development push certificate 
$apnsCert = $_SERVER['DOCUMENT_ROOT'].'/apns/apns-dominos-development.pem'; 
} else { 
// Use a production push certificate 
$apnsCert = $_SERVER['DOCUMENT_ROOT'].'/apns/apns-dominos-production.pem'; 
} 


// --- Sending push notification --- 

// Insert your device token here 
$device_token = "<dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8>"; // Some Device Token 


// Notification content 

$payload = array(); 

//Basic message 
$payload['aps'] = array(
'alert' => 'testing 1,2,3..', 
'badge' => 1, 
'sound' => 'default', 
); 
$payload['server'] = array(
'serverId' => $serverId, 
'name' => $serverName 
); 
// Add some custom data to notification 
$payload['data'] = array(
'foo' => "bar" 
); 
$payload = json_encode($payload); 

$streamContext = stream_context_create(); 
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); 
stream_context_set_option($streamContext, 'ssl', 'passphrase', ""); 


$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error,  $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext); 


$deviceToken = str_replace(" ","",substr($device_token,1,-1)); 
echo $deviceToken; 
$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '',  $deviceToken)) . chr(0) . chr(mb_strlen($payload)) . $payload; 
fwrite($apns, $apnsMessage); 


//socket_close($apns); 
fclose($apns); 

?> 
+0

Bạn đang làm gì trong dòng này? và tại sao? $ deviceToken = str_replace ("", "", chất nền ($ device_token, 1, -1)); – RamshaS

+0

xóa dấu cách và hậu tố "<" tiền tố và ">". Mã thông báo thiết bị là chữ và số, không có dấu cách hoặc các ký tự khác – Tamir