【发布时间】:2014-05-08 04:15:10
【问题描述】:
我创建了一个应用程序来从 Web 服务器发送远程通知。 当我在开发模式下测试应用程序时,所有通知都正确到达了手机,在 AppStore 发布后,应用程序不再收到通知。
这就是我所做的:
- 为生产和开发创建了一个私钥。
- 通过传递之前生成的 CertFile 在我的 App ID 上生成两个 SSL 证书。我 100% 确定已正确生成 2 个密钥并正确传递它们以从 AppID 下的开发中心下载 SSL 证书。
- 创建了一个用于开发的文件 .pem 和一个用于生产的文件(通过转换从我的 KeyChain 等等中提取的文件 .p12)。
- 创建了 2 个不同的配置文件,一个用于开发,一个用于生产,连接到步骤 1 的 AppID。
- 使用在第 4 步中创建的正确配置文件在 Build Settings 中为应用签名。
- 创建了一个 Web 应用来捕获和存储用户令牌。
- 创建了一个 php 页面来测试推送通知发送。
这是我测试的:
- 在沙盒链接上使用 telnet 测试开发生成的 .pem 文件,并获得了成功的答案。
- 在生产链接上使用 telnet 测试生产生成的 .pem 文件,并获得了成功的答案。
- 我 100% 肯定已在我的网络应用程序中存储了我 iPhone 的开发令牌。
- 我 100% 确信已在我的 Web 应用服务器上存储了我 iPhone 的生产令牌。
- 我 100% 肯定会通过我的 php 页面将正确的消息传递给 Apple 服务器(用于开发和生产)。
- 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