【问题标题】:APNS Push Notifications Not Working on ProductionAPNS 推送通知不适用于生产
【发布时间】:2014-05-08 04:15:10
【问题描述】:

我创建了一个应用程序来从 Web 服务器发送远程通知。 当我在开发模式下测试应用程序时,所有通知都正确到达了手机,在 AppStore 发布后,应用程序不再收到通知。

这就是我所做的:

  1. 为生产和开发创建了一个私钥。
  2. 通过传递之前生成的 CertFile 在我的 App ID 上生成两个 SSL 证书。我 100% 确定已正确生成 2 个密钥并正确传递它们以从 AppID 下的开发中心下载 SSL 证书。
  3. 创建了一个用于开发的文件 .pem 和一个用于生产的文件(通过转换从我的 KeyChain 等等中提取的文件 .p12)。
  4. 创建了 2 个不同的配置文件,一个用于开发,一个用于生产,连接到步骤 1 的 AppID。
  5. 使用在第 4 步中创建的正确配置文件在 Build Settings 中为应用签名。
  6. 创建了一个 Web 应用来捕获和存储用户令牌。
  7. 创建了一个 php 页面来测试推送通知发送。

这是我测试的:

  1. 在沙盒链接上使用 telnet 测试开发生成的 .pem 文件,并获得了成功的答案。
  2. 在生产链接上使用 telnet 测试生产生成的 .pem 文件,并获得了成功的答案。
  3. 我 100% 肯定已在我的网络应用程序中存储了我 iPhone 的开发令牌。
  4. 我 100% 确信已在我的 Web 应用服务器上存储了我 iPhone 的生产令牌。
  5. 我 100% 肯定会通过我的 php 页面将正确的消息传递给 Apple 服务器(用于开发和生产)。
  6. php 页面始终从 Apple 服务器返回一条成功消息(用于开发和生产)。

这是我在 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 文档。

我愿意报复所有帮助我找到问题解决方案的人!

【问题讨论】:

  • 供您参考,即使令牌错误或过期,PHP 脚本也会返回“消息已成功传递”。
  • 是否需要为生产和开发创建两个 .csr 文件?

标签: ios xcode apple-push-notifications push


【解决方案1】:

如果您使用 Google Firebase 云消息传递方式,请检查

  1. 与您的服务器团队一起确保您的服务器已从开发变为生产。

  2. 您的生产 APN 证书(转换为 .p12 文件)是否已上传。

  3. 确保 .p12 文件未与钥匙串访问中的密钥一起导出。 (like this)

  4. 如果已上传,请检查生产 APN 证书的到期日期。 Google FCM 会在生产 APN 证书到期后 2 个月内拒绝证书。

【讨论】:

    【解决方案2】:

    我刚刚遇到了同样的问题。推送通知到达开发模式,而不是生产模式。我还检查了几次,确定一切都很好。

    但事实并非如此。这是该过程的第一步。创建 csr。我确信我不必为开发和生产创建一个 csr 文件,并最终为两个证书使用相同的 csr 文件。没用...

    也许将来有人会犯同样的错误,现在可以节省一些时间。

    【讨论】:

    • 您的意思是为生产和开发创建相同的 csr 文件不正确吗?我应该创建两个 csr 文件,一个用于 prd,另一个用于 dev?
    • 我重新创建了 csr 文件,然后是开发和生产证书。但没有运气。
    【解决方案3】:

    同一设备的生产和沙盒设备令牌不同。

    所以尝试使用 Adhoc 或分发证书获取设备令牌,并在生产中使用生成的令牌,这对我有用。

    【讨论】:

      【解决方案4】:

      您提到的链接是 Sandbox APNS 链接。生产 APNS 链接根据 Apple documentation 是:

      您在 gateway.push.apple.com 访问生产环境, 出站 TCP 端口 2195。

      需要验证的几件事:

      1. 您的 AppId 已启用分发 APNS。
      2. 您已创建分发 APNS SSL 证书并安装在您的构建机器上(用于 App Store 提交)。
      3. 您已在服务器上安装第 2 步中的 SSL 证书。
      4. 您没有误用 Development APNS SSL 证书。

      【讨论】:

      • 其实我用的是生产链接(gateway.push.apple.com),我第一篇贴错开发链接了。
      • 1.它已启用 2. 是 3. 是 4. 否 ...我尝试使用 telnet 和苹果服务器成功响应证书...
      • 我添加了更多关于我所做的事情的信息,你能帮帮我吗?
      • 嗨@prelite,你的问题解决了吗?我面对同样的问题,无法弄清楚。如能指出,不胜感激
      • 是的,问题与生产证书的错误生成有关。网上有很多教程并没有显示正确的生成方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多