iOS - 没有推送通知的常见原因

时间:2016-06-06 13:34:06

标签: php ios objective-c swift apple-push-notifications

这可能是一个老问题,但我仍然想知道少数用户没有收到推送通知的几个原因,而不是全部。

我已在应用程序中实现了推送,该应用程序适用于开发配置文件特别配置文件分发配置文件。所有设置和配置都非常谨慎,并且可以正常工作。但即使启用了Push并且给出了权限,也不是全部。

我将3个设备与3个配置文件保持一致,我使用TestFlight进行分发配置文件。

现在来自api,我们正在使用 gateway.push.apple.com 进行 Adhoc TestFlight 构建,以及 {{1}对于开发,我们也试过改变这些。但我们仍然无法让所有用户都能使用它。

我们缺少哪些特定的东西?

更新

这就是我们gateway.sandbox.push.apple.com的样子

Payload

感谢。

4 个答案:

答案 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)

有以下原因未在设备上获取推送通知:

  1. 证书密码和服务器端代码中添加的密码不同。
  2. 推送通知有效负载的大小超出。根据苹果标准,它应低于2048 KB。它被称为有效载荷。如果您的有效负载(通知对象)大小大于2048 KB,那么APNS将不会处理它,因此设备无法获取它。
  3. 从iPhone应用程序发送到服务器的设备令牌错误。请参阅Get device token
  4. 最后,如果服务器正在为iOS和Android发送推送通知,那么请确保您正在向正确的设备发送通知,因为iOS将从APNS获取它,而android将从GCM获取它。在这种情况下,在注册时,您可以从用户获取设备类型并将其保存在数据库中。因此,它可以在发送通知时使用。
  5. 在我看来,这些是可能出现的情况。如果它适合您或现在,请告诉我。

答案 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)

可能会出现几个问题:

  1. 收到了一些通知但并非全部:如果您要发送多个通知 恐惧,同时推送通知,只收到少数通知 不!这是预期的行为。 APNS保持QoS(质量) 使用推送应用程序为每个设备排队服务。这个的大小 queue是1,所以如果你发送多个通知,那么最后一个 通知被覆盖。
  2. 连接到推送通知服务的问题:一种可能性 可能是防火墙阻塞了APNS使用的端口。 确保取消阻止这些端口。另一种可能性是 私钥和CSR文件错误。请记住每个App ID 拥有独特的CSR和私钥组合。