我正在尝试通过PushSharp向IOS设备发送推送通知。对于Android,它的工作原理。对于IOS,对StopAllServices()
的调用永远挂起,而不调用任何异常处理程序。
问题可能是我获得了.pem证书文件,而pushsharp需要.p12文件吗?
代码如下:
var br = new PushBroker();
br.OnNotificationSent += br_OnNotificationSent;
br.OnNotificationFailed += br_OnNotificationFailed;
br.OnChannelException += br_OnChannelException;
br.OnServiceException += br_OnServiceException;
br.OnDeviceSubscriptionChanged += br_OnDeviceSubscriptionChanged;
br.OnDeviceSubscriptionExpired += br_OnDeviceSubscriptionExpired;
br.OnChannelCreated += br_OnChannelCreated;
br.OnChannelDestroyed += br_OnChannelDestroyed;
var appleCert = Resource1.ck; // this is a pem file, not a p12 file!!! could this be the problem?
var sandbox = true;
br.RegisterAppleService(new ApplePushChannelSettings(!sandbox, appleCert, "223684"));
// password given to me by ios developer
var deviceIds = new string[] { "09eddcb8b89494adf802a0caf97d5daaa789a53f52d8c544dbdcf39f2c0b619a" };
foreach (var did in deviceIds)
{
br.QueueNotification(
new AppleNotification()
.ForDeviceToken(did)//the recipient device id
.WithAlert("test: " + DateTime.Now.ToString())//the message
.WithBadge(1)
.WithSound("sound.caf"));
}
br.StopAllServices(waitForQueuesToFinish: true); // hangs forever, no callbacks are called
我正在使用通过Git获取的PushSharp,并且我自己使用Visual Studio 2013编译,截至昨天。
如果代码在控制台应用程序和asp.net应用程序中,则会发生挂起。
我正在使用沙箱,因为有人告诉我。如果我使用生产服务器,我会收到一个异常,告诉我该证书是针对沙盒的。
感谢您对冻结原因的任何暗示。
答案 0 :(得分:4)
我们花了一整天的时间来猜测问题! 最终它出现了错误的Newtonsoft.Json版本 我们解决方案中的一些项目依赖于此库的旧版本,因此我们在Web项目的/ bin文件夹中获取错误版本的运气不佳。
答案 1 :(得分:1)
您可以等待几秒钟br_OnNotificationFailed
或任何其他事件。它应该包含一些错误描述。
尽管如此,我发现PushSharp对证书使用有严格的要求。 PEM应该没问题但是它还不够,即使你从文件中导入它 - 你应该在Windows证书库中拥有所有必要的证书(pem本身及其依赖):
将您的PEM导入本地计算机\根存储,将其私钥的读取访问权限提供给正在运行的应用程序的用户
< / LI>从Apple site证书 Apple全球开发者关系证书颁发机构和 Apple Root CA 导入本地计算机\受信任的根证书颁发机构< / EM>
将 Entrust Secure CA 证书(对于iOS Developer Library中所述的SSL)导入本地计算机\受信任的根证书颁发机构
< / LI> 醇>答案 2 :(得分:1)
最后这是证书问题。 PushSharp不接受我给出的.pem。只有当我获得了使用本指南创建的.p12时
https://code.google.com/p/apns-sharp/wiki/HowToCreatePKCS12Certificate
,问题解决了。
但是,PushSharp应该引发异常而不是挂起。
答案 3 :(得分:1)
ASP.NET应用程序不是使用PushSharp的理想位置。如果可能的话,最好使用Windows服务或其他一些基础设施。原因是在ASP.NET应用程序中,应用程序池(AppPool)可以重新启动,并且通常不在您的直接控制之下,这意味着如果PushSharp可能在发送过程中的所有排队通知可能会丢失,如果PushSharp没有正常清理。
如果必须在ASP.NET应用程序中运行PushSharp,最好的方法是在Global.asax文件中创建单一的PushBroker实例。您应该在Web应用程序的生命周期内保留此单例实例,包括在应用程序结束时调用pushBroker.StopAllServices()(Global_asax中的Application_End)。
您可以通过以其他方式保留要发送的通知来帮助缓解由于无法预料的应用程序池终止或重新启动而丢失的邮件,并且只有在OnNotificationSent事件触发后才将其从该持久性存储中删除。这仍然不完美(您可能会冒多次通知交付的风险),但对大多数人来说可能已经足够了。
每次发送通知时都不应该创建和销毁PushBroker实例,因为这会使用不必要的资源,如果您使用的是Apple APNS,它们要求您尽可能长时间地保持与服务器的连接。发送通知。您还应该在Global.asax中的Application_Ended事件中调用pushBroker.StopAllServices()。请记住,PushSharp可以正常工作。