我创建了一个App来从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推送通知。 我在App Store上发布的应用程序完全相同,但没有收到APNS推送通知。
我真的竭尽全力解决这个问题并阅读了大约数千页的论坛,stackoverflow和Apple Documentations。
我愿意帮助每个帮助我找到问题解决方案的人!
答案 0 :(得分:16)
您提到的链接是Sandbox APNS链接。生产APNS链接是根据Apple documentation:
您可以访问 gateway.push.apple.com 的制作环境, 出站TCP端口2195。
要验证的事情很少:
答案 1 :(得分:13)
生产和沙盒的设备令牌对于同一设备是不同的。
因此,尝试使用Adhoc或Distribution证书获取设备令牌,并在生产中使用生成的令牌,这对我有用。
答案 2 :(得分:1)
我刚遇到同样的问题。推送通知到达开发模式,而不是生产。我也检查了几次,确信一切都很好。
但事实并非如此。这是这个过程的第一步。创建csr。我确信我没有必要为开发和生产创建一个csr文件,并最终为两个证书使用相同的csr文件。没有工作......
也许将来有人会犯同样的错误并节省一些时间。
答案 3 :(得分:0)
如果您使用的是Google Firebase云消息传递工具,请检查
1)确保与您的服务器团队一起,将服务器从开发更改为生产。
2)您的生产APN的证书(转换为.p12文件)是否已上传。
3)确保未从钥匙串访问中使用密钥导出.p12文件。(like this)
4)如果已经上传,则检查生产APN的证书的到期日期。 Google FCM会在生产APN的证书到期之日起2个月之前拒绝该证书。