PushSharp APNS 服务在 Windows 关闭后停止工作

Posted

技术标签:

【中文标题】PushSharp APNS 服务在 Windows 关闭后停止工作【英文标题】:PushSharp APNS Service Stop working after windows shutdown 【发布时间】:2013-11-28 12:09:30 【问题描述】:

我可以通过沙盒 APNS 服务器使用 Push Sharp 成功地将通知发送到我的 iPhone 设备,但我遇到了问题。

我已经生成了 .cer 和 .p12 文件,然后成功地将它们安装在我的 windows 8 开发机器上。

我使用this 教程在我的 Windows 8 机器上安装证书。

昨天一切正常,我已成功发送通知。我关闭了我的系统,然后第二天当我尝试运行代码时,我得到了以下异常:

消息是意外的或格式错误的 pushsharp

我尝试了 Google 上提供的不同解决方案,但没有任何帮助。然后我从我的机器上删除证书,然后重新安装它们,一切又开始工作了。

为了使服务万无一失,我关闭了系统以检查通知发送是否失败,是的,它再次失败并出现相同的异常。

我再次删除了证书并重新安装以更正问题。我不知道实际的问题是什么?是什么让 PUSHSharp 在关机后停止发送通知。

注意:Windows 防火墙已禁用。 任何的想法?

【问题讨论】:

【参考方案1】:

过去几周我一直在使用 PushSharp,并且没有遇到过这个问题。但是,我的环境是 Windows 7。在 iPhone Developer Program Portal 中创建适当的推送通知证书后,您应该已经下载了一个名为 apn_developer_identity.cer 的文件。如果你还没有这样做,你应该打开/导入这个文件到钥匙串,进入你的登录部分。

最后,如果您过滤钥匙串以显示您的登录容器的证书,您应该会看到您的证书已列出。展开证书,下面/附加到它应该有一个密钥。

右键单击或 Ctrl+单击相应的证书并选择导出。钥匙串会要求您选择要导出的密码。选择一个并记住它。您最终应该得到一个 .p12 文件。您需要此文件和您选择的密码才能在此处使用通知和反馈库。

OpenSSL

这里是如何使用 open ssl 创建一个 PKCS12 格式文件,你需要你的开发者私钥(可以从钥匙串中导出)和 CertificateSigningRequest??.certSigningRequest

    将 apn_developer_identity.cer(der 格式)转换为 pem: openssl x509 -in apn_developer_identity.cer -inform DER -out apn_developer_identity.pem -outform PEM

    接下来,将 p12 私钥转换为 pem(需要输入至少 4 个字符的密码): openssl pkcs12 -nocerts -out private_dev_key.pem -in private_dev_key.p12

    (可选):如果要从私钥中删除密码: openssl rsa -out private_key_noenc.pem -in private_key.pem

    获取证书和密钥(带或不带密码)并创建 PKCS#12 格式文件: openssl pkcs12 -export -in apn_developer_identity.pem -inkey private_key_noenc.pem -certfile CertificateSigningRequest??.certSigningRequest -name "apn_developer_identity" -out apn_developer_identity.p12

使用这些步骤生成 p12 文件后,您实际上不需要将其捕捉到控制台。您只需对代码进行如下更改:

 var appleCert = File.ReadAllBytes("C:/Certificate/aps_dev_identity.p12");

希望这会有所帮助。

【讨论】:

需要与我的 iPhone 开发人员确认此事。 这个问题与 ApplePushChannelSettings.cs 中的 SkillSsl 属性有关。当将此属性更改为 true 时,不会在 ApplePushChannel 中创建 Ssl 流(请参阅 ApplePushChannel.cs 中的第 516 行)。我不知道创建安全流时出了什么问题,您能说明一下吗?此外,将 SkillSsl 更改为 true 解决了问题,但在运行反馈服务​​时出现以下异常:“消息意外或格式错误”。你能再解释一下吗?【参考方案2】:

自 2012 年以来我一直在研究 MOON APNS,它工作正常,但从最近几天开始,我收到以下错误消息

错误消息:System.Security.Authentication.AuthenticationException:对 SSPI 的调用失败,请参阅内部异常。

System.ComponentModel.Win32Exception:收到的消息是 意外或格式错误

解决方法:在 PushNotification.cs 文件中替换

_apnsStream.AuthenticateAsClient(host, certificates, System.Security.Authentication.SslProtocols.Ssl3, false);

_apnsStream.AuthenticateAsClient(host, certificates, System.Security.Authentication.SslProtocols.Tls, false);

因为,我没有从苹果方面找到任何确认,但我从 github.com 找到了解决方案,它对我们有用。

苹果似乎贬低了“不安全”的 SSL 协议。

【讨论】:

【参考方案3】:

首先检查您是否可以先使用 this one 之类的 C# 代码进行通知,然后再担心安装。当我尝试执行代码时,我收到了相同的消息,我不关心安装,并通过确保我使用类型为 .p12 而不是 .pem 的证书来解决它,并确保 .p12 具有密码。我现在可以从我电脑中的控制台 C# 应用程序向我的 iPhone 发送通知。

【讨论】:

以上是关于PushSharp APNS 服务在 Windows 关闭后停止工作的主要内容,如果未能解决你的问题,请参考以下文章

PushSharp 默认情况下是不是会并行调用 APNs?

如何发送 APNS PushSharp 发送通知。它在 asp.net 中的 localhost 工作,但是当我们在 Windows 服务器中托管 API 时失败

突然无法使用 PushSharp 连接到 APNS 沙箱环境

Pushsharp Apns 通知错误:“InvalidToken”

对 Apple 的 APNS 的 PushSharp 通知不起作用,不会引发任何异常

如何在 Push Sharp 库中的 APNS 有效负载中添加类别以进行交互式通知 ios