Webサーバーからリモート通知を送信するアプリを作成しました。アプリを開発モードでテストしたところ、すべての通知が電話に正しく届きました。AppStoreのリリース後、アプリは通知を受信しなくなりました。
ここで私がやったことです:
ここで私がテストしたものです:
Xcodeでアプリに署名する方法は次のとおりです。
通知を送信するphpページのコードは次のとおりです。
$ctx = stream_context_create();
//stream_context_set_option($ctx, 'ssl', 'passphrase', 'development_pwd');
//stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck_development.pem');
//$fp = stream_socket_client('ssl://gateway.sandbox.Push.Apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); //test
stream_context_set_option($ctx, 'ssl', 'passphrase', 'production_pwd');
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck_production.pem');
$fp = stream_socket_client('ssl://gateway.Push.Apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); //production
echo "<p>Connection Open</p>";
if(!$fp){
echo "<p>Failed to connect!<br />Error Number: " . $err . " <br />Code: " . $errstrn . "</p>";
return;
} else {
echo "<p>Sending notification!</p>";
}
$i = 0;
foreach ($deviceToken as $dt) {
$dt = str_replace(' ' , '' , $dt);
$msg = chr(0) . pack('n',32) . pack('H*', $dt) . pack('n',strlen($payload)) . $payload;
echo "<p>" . $i . " - Message sent: " . $payload . "<br />Token: ". $dt . "<br />***" . $msg . "***</p>";
$result = fwrite($fp, $msg, strlen($msg));
$i++;
if (!$result)
echo '<p>Message not delivered ' . PHP_EOL . '!</p>';
else
echo '<p>Message successfully delivered ' . PHP_EOL . '!</p>';
}
fclose($fp);
echo "<p>Total Notifications Sent: " . $i . "</p>";
echo "<p>Connection Closed!</p>";
}
?>
結論:私のPCには、APNSプッシュ通知を受信するテストアプリがあります。 APNSプッシュ通知を受信しないまったく同じアプリをApp Storeでリリースしています。
私は本当に、この問題を修正するために私の力ですべてを作り、フォーラム、stackoverflow、およびAppleドキュメントの約1000ページを読みました。
私は私の問題の解決策を見つけるのを手伝ってくれるあなたのすべての人を喜んで追悼します!
あなたが言及したリンクは、サンドボックスAPNSリンクです。本番APNSリンクはApple documentation のとおりです:
gateway.Push.Apple.com、アウトバウンドTCPポート2195で本番環境にアクセスします。
確認すること:
製品とサンドボックスのデバイストークンは、同じデバイスでは異なります。
アドホックまたは配布の証明書を使用してデバイストークンを取得し、生成されたトークンを本番環境で使用してみてください。これは私にとってはうまくいきました。
私は同じ問題に出くわしました。プッシュ通知は、プロダクションではなく、開発モードで届きます。私も数回すべてをチェックし、すべてが大丈夫であると確信していました。
しかし、そうではありませんでした。それはプロセスの最初のステップでした。 csrを作成します。開発と本番用のcsrファイルを作成する必要はなく、両方の証明書に同じcsrファイルを使用することになりました。うまくいきませんでした...
たぶん、将来誰かが同じ間違いをすることで、時間を節約できます。