对 Apple 的 APNS 的 PushSharp 通知不起作用,不会引发任何异常
Posted
技术标签:
【中文标题】对 Apple 的 APNS 的 PushSharp 通知不起作用,不会引发任何异常【英文标题】:PushSharp notifications to Apple's APNS not working, not throwing any exceptions 【发布时间】:2012-12-14 02:25:49 【问题描述】:我不知道为什么这不起作用,也没有抛出任何错误。没有任何订阅的事件被触发(包括OnNotificationSent
和OnNotificationSendFailure
)。代码与 PushSharp 的 sample code in GIT 几乎相同,唯一的区别是它在线程内运行:
public class MyNotificationService
ILog _log = LogManager.GetLogger("");
PushService _PushService;
public void Start()
PushService _PushService;
byte[] appleCert = File.ReadAllBytes("myCert.p12");
_PushService = new PushService();
_PushService.Events.OnChannelCreated += Events_OnChannelCreated;
_PushService.Events.OnChannelDestroyed += Events_OnChannelDestroyed;
_PushService.Events.OnChannelException += Events_OnChannelException;
_PushService.Events.OnDeviceSubscriptionExpired += Events_OnDeviceSubscriptionExpired;
_PushService.Events.OnDeviceSubscriptionIdChanged += Events_OnDeviceSubscriptionIdChanged;
_PushService.Events.OnNotificationSendFailure += Events_OnNotificationSendFailure;
_PushService.Events.OnNotificationSent += Events_OnNotificationSent;
_PushService.StartApplePushService(new ApplePushChannelSettings(false, appleCert, "myPass"));
_MainThread = new Thread(() =>
try
var nt = NotificationFactory.Apple()
.ForDeviceToken("60A378B0FF0628FB52461C6F9F2CEDAA29A05D52F97EF2E811")
.WithAlert("Test")
.WithSound("default")
.WithCustomItem("data", "some other data")
.WithBadge(7);
_PushService.QueueNotification(nt);
catch (Exception e)
_log.Error("In main thread", e);
);
_MainThread.Start();
static void Events_OnDeviceSubscriptionIdChanged(PlatformType platform, string oldDeviceInfo, string newDeviceInfo, Notification nt)
//Currently this event will only ever happen for android GCM
_log.Debug("Device Registration Changed: Old-> " + oldDeviceInfo + " New-> " + newDeviceInfo);
static void Events_OnNotificationSent(Notification nt)
_log.Debug("Sent: " + nt.Platform.ToString() + " -> " + nt.ToString());
static void Events_OnNotificationSendFailure(Notification nt, Exception notificationFailureException)
_log.Error("Failure: " + nt.Platform.ToString() + " -> " + notificationFailureException.Message + " -> " + nt.ToString());
static void Events_OnChannelException(Exception exception, PlatformType platformType, Notification nt)
_log.Error("Channel Exception: " + platformType.ToString() + " -> " + exception.ToString());
static void Events_OnDeviceSubscriptionExpired(PlatformType platform, string deviceInfo, Notification nt)
_log.Debug("Device Subscription Expired: " + platform.ToString() + " -> " + deviceInfo);
static void Events_OnChannelDestroyed(PlatformType platformType, int newChannelCount)
_log.Debug("Channel Destroyed for: " + platformType.ToString() + " Channel Count: " + newChannelCount);
static void Events_OnChannelCreated(PlatformType platformType, int newChannelCount)
_log.Debug("Channel Created for: " + platformType.ToString() + " Channel Count: " + newChannelCount);
同样,没有任何事件被触发(没有记录,没有命中断点)。奇怪的是,调用StopAllServices
会永远挂起,显然什么也没做。我已经多次检查了我的配置文件和证书,但没有发现它们有任何问题。有什么想法吗?
编辑:
原来问题只能在我从 Windows Service .Net 项目运行时重现。从控制台应用程序,一切正常。我以为是权限问题阻止了网络访问,但我无法让它工作。
【问题讨论】:
我一直在PushService
下看到一条红线,我是否缺少要包含的内容?
【参考方案1】:
我遇到了同样的问题!我在我的 exe 引用的 dll 中使用 push sharp。我通过将以下内容添加到我的 app.config 来解决问题:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
确保 Newtonsoft.Json dll 在您的 bin 文件夹中!
【讨论】:
有关此答案的更多信息:我删除了项目中较旧的 json 引用,并向较新的 json dll(随 pushsharp 提供)添加了一个引用,然后对我的配置进行了列出的更改文件并开始工作【参考方案2】:我遇到了类似的问题。我在我的 ASP.Net MVC 应用程序中使用了 PushSharp。确保您的应用程序中的 Newtonsoft.Json 版本与您的 PushSharp 版本中的版本相同。
【讨论】:
这为我解决了问题。除了创建通道之外,我没有触发任何事件,然后它会不断地突进,而不会超时或抛出异常。原来该网络项目引用了旧版本的 Newtownsoft - 删除了旧 DLL 并添加了绑定重定向到新版本和繁荣,收到推送通知。不确定它是否有任何区别,但我也参考了旧的 JdSoft.APNS 库(PushSharp 的前身),我也同时删除了它......【参考方案3】:您的服务是否作为“LocalSystem”运行?如果不是,请尝试将其安装为“LocalSystem”。
也许该服务没有网络访问权限,因此没有连接到 Internet 或数据库。
顺便说一句,设备令牌似乎很短,但如果它作为控制台应用程序工作,它应该作为服务工作。
【讨论】:
【参考方案4】:第一
我也有同样的问题。不会触发任何事件,但会传递通知。仍在寻找答案。 也许this link 会有所帮助。
第二次(关于“StopAllServices 永远挂起”)
也许this 会有所帮助。简而言之 - 不应提供空设备令牌
【讨论】:
我遇到了没有事件触发的问题。原来是因为我在调用RegisterService
之后添加了事件处理程序。它们必须在之前添加。以上是关于对 Apple 的 APNS 的 PushSharp 通知不起作用,不会引发任何异常的主要内容,如果未能解决你的问题,请参考以下文章
APNS Apple 推送通知服务未收到来自 Apple 的成功消息