9

私はthis tutorialを使用してプッシュ通知を学習しています。プッシュ通知が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); 

また、プッシュ通知用にアプリを設定します。プッシュを設定した後、プロビジョニングプロファイルも再作成し、古いプロファイルを削除して新しいプロファイルをインストールします。 私はそれが私にデバイスIDを与えるアプリケーションを実行し、私は両方のサーバーのサンドボックスとプロダクションをプッシュ通知を送信するために彼らの相対プッシュプロファイルを接続するが、私はまだ私のデバイス上のプッシュ通知を受信することができません。

また、デバイスにipusherをインストールし、プッシュ通知をチェックします。彼らはそのアプリケーションから来ています。私は気づく

一つ奇妙なことは、私は自分のアプリケーション識別子を変更し、他のアプリのIDを使用することで、デバイストークンは同じまま

今私の問題は、私は私のデバイス上のプッシュ通知を受信して​​いないです。


問題は私のプロファイルにありません。エラーは私が使用しているPHPコードです。なぜなら、リモートサーバー上の簡単なapnsを使用すると、プッシュ通知が送信されるからです。 通知の受信時間は6〜7時間です。これは私のデバイス側のネットワークの問題が原因だと思います。 しかし、今は2日後には正常に動作しています。現在、通知はデバイスで配信する時間がないものの、一部のデバイスでは30秒から5分かかります。


あなたは、あなたは、接続のためにあなたのDNSを確認する必要があり、あまりにも他のアプリからあなたのデバイス上のプッシュ通知を受けていない場合は、1つの以上の問題が存在する場合があります。

+2

これはサーバー側の実装部分ですが、iphoneアプリケーションの部分はどうですか? Uはこのチュートリアルをチェックできますhttp://mobiforge.com/developing/story/programming-apple-push-notification-services http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part- 12 – iamsult

+0

iphoneの実装にはraywenderlichに従います。デバイストークンを取得するために –

+0

問題は私のプロファイルにありません。エラーは私が使用しているPHPコードです。なぜなら、リモートサーバー上の簡単なapnsを使用すると、プッシュ通知が送信されるからです。受信した通知は6〜7時間でした。これは私のデバイス側のネットワークの問題が原因だと思います。しかし、今は生産現場で2日後にうまくいきます。現在、通知はデバイスで配信する時間がないものの、一部のデバイスでは30秒から5分かかります。 –

答えて

2

私はついに私の問題を解決しました。問題はコードでは実際には問題は私のiPhoneに設定された間違ったDNS値です。私は自動的にDNSフィールドのルータのIPを置きます。今私は私のサービスプロバイダのDNS値を与えるそれは正常に動作します。今私はそれらを送った瞬間にプッシュメッセージを受信して​​います。

私は他の人に役立つことを願っています。

1

プッシュ通知証明書を確認してください。証明書はどの秘密鍵と関連していますか?

キーチェーンから生成された適切な秘密鍵でプッシュ通知証明書を再作成してください。

チュートリアル以下をご覧ください:

Apple Push Notification Tutorial:

おかげで、

MinuMaster

2

は、サーバー側でのフィードバックサービスを実装し、また、どのくらいの中にいることをサーバー側で確認してくださいすべてのデバイストークンがAPNSに送信されます。 フィードバックサービスから、どのくらいのデバイスがur通知を受け取ったかを知ることができます。 すべてのデバイストークンが1つずつAPNに送信され、APNがフィードバックサービスを介してリストを送信しない場合、デバイスで通知を受信する期間を処理できません。

1

UrbanAirShipを使用してください。私の意見では、それはAndroid(C2DM)とBlakberryのためのPush-alike通知を含んでいるので、最も良いサーバー側のソリューションです。

ファイルとの違いを見つけて理解してください。あなたの問題の解決策かもしれません。

<?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

まずあなたが使用していることを確認してください:ここに私のコードです

アプリケーションをデバッグ/リリースの提供してコンパイルされ
  • キーチェーンはdevlopment /制作プッシュ通知証明書を持って

次のコードを使用します(dev &の両方の製品でテスト済み)

<?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

この行で何をしていますか?なぜ? $ deviceToken = str_replace( ""、substr($ device_token、1、-1)); – RamshaS

+0

スペースと "<"接頭辞と ">"接尾辞を削除します。 デバイストークンは英数字で、スペースやその他の文字は使用できません – Tamir

関連する問題