APNS推送通知不适用于生产

pre*_*ite 22 xcode push apple-push-notifications ios

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

这就是我做的:

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

这是我测试的:

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

以下是我在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>";
}
?>
Run Code Online (Sandbox Code Playgroud)

结论:我的PC上有测试应用程序,可以接收APNS推送通知.我在App Store上发布的完全相同的应用程序没有收到APNS推送通知.

我真的竭尽全力解决这个问题并阅读了大约数千页的论坛,stackoverflow和Apple Documentations.

我愿意帮助我帮助我找到问题解决方案的每个人!

gag*_*wal 16

您提到的链接是Sandbox APNS链接.生产APNS链接是根据Apple 文档是:

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

几件事要验证:

  1. 您的AppId已启用分发APNS.
  2. 您已创建分发APNS SSL证书并已安装在您的构建计算机上(用于App Store提交).
  3. 您已在服务器上的步骤2中安装了SSL证书.
  4. 您没有错误地使用开发APNS SSL证书.


小智 13

Production和Sandbox的设备令牌对于同一设备是不同的.

因此,尝试使用Adhoc或Distribution证书获取设备令牌,并在生产中使用生成的令牌,这对我有用.