这可能是一个老问题,但我仍然想知道少数用户没有收到推送通知的几个原因,而不是全部。
我已在应用程序中实现了推送,该应用程序适用于开发配置文件,特别配置文件和分发配置文件。所有设置和配置都非常谨慎,并且可以正常工作。但即使启用了Push并且给出了权限,也不是全部。
我将3个设备与3个配置文件保持一致,我使用TestFlight进行分发配置文件。
现在来自api,我们正在使用 gateway.push.apple.com
进行 Adhoc 和 TestFlight 构建,以及 {{1}对于开发,我们也试过改变这些。但我们仍然无法让所有用户都能使用它。
我们缺少哪些特定的东西?
更新
这就是我们gateway.sandbox.push.apple.com
的样子
Payload
感谢。
答案 0 :(得分:2)
虽然还有其他原因,但在非常高的百分比时间推动失败的原因是由于推动“方程式”已被打破。
有两个方程式,其中一个方程式必须严格遵循才能推动工作。
发展等式:
开发构建App +开发APN令牌+开发 证书+开发Apple网关==成功
生产方程:
App + Production APN令牌+制作的生产构建 证书+制作Apple网关==成功。
如果生产方程中有任何dev元素,或者在开发方程中有任何生产元素,则推送将不起作用。等式的所有四个要素必须是全部开发或全部生产。
当您通过Xcode运行应用程序时,默认情况下它将是应用程序的开发版本(可以在方案中进行更改,但除非您知道这一点,否则它将是调试版本)因此在使用时Xcode你必须使用开发方程来推动功能。如果您创建了一个临时分发或应用商店版本,那么它将是一个生产版本,您必须使用生产等式才能使其生效。
如果要创建广告/分发/应用商店构建等,那么导致失败的常见原因就是没有在构建设置中正确设置Xcode的代码签名和配置文件部分。
此外,应用程序的生产版本和应用程序的开发版本会产生不同的推送令牌,因此,如果您暂时将令牌硬编码到某个服务器测试脚本或类似内容中,那么您必须确保其正确的令牌。在旧版本的iOS中,一旦获得它们,它们实际上永远不会改变(它们可以,但是它很少见的情况)。但是在iOS9中不再是这种情况,令牌可以而且确实会发生变化,因此请始终确保您在服务器上使用的令牌是最新的。
还必须通过正确的网关发送推送,Apple开发网关是沙箱网关:
SSL://gateway.sandbox.push.apple.com:2195
生产网关是:
SSL://gateway.push.apple.com:2195
使用生产网关时,服务器必须使用生产证书进行签名,并在使用沙盒网关时使用开发证书进行签名。
如果对两个证书使用相同的密码,则可以在同一.pem文件中使用生产证书和开发证书对服务器进行签名。即您可以将所有提升证书和密钥连接到一个.pem文件中,并使用它来签署服务器。当使用Xcode和生产网关进行最终应用商店发布测试时,服务器当然需要使用沙箱网关。
答案 1 :(得分:0)
有以下原因未在设备上获取推送通知:
在我看来,这些是可能出现的情况。如果它适合您或现在,请告诉我。
答案 2 :(得分:0)
用它来发送测试通知。并且不要忘记将.pem添加到服务器,而不是添加.php文件
<?php
// Put your device token here (without spaces):
$deviceToken = '';
// Put your private key's passphrase here:
$passphrase = '';
// Put your alert message here:
$message = 'Salut!';
////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'yourFile.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));
if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;
// Close the connection to the server
fclose($fp);
答案 3 :(得分:0)
可能会出现几个问题: