アプリがインストールした何万ものiOSデバイスに通知をプッシュする必要があります。 PushSharpでそれを実行しようとしていますが、ここでいくつかの基本的な概念が欠落しています。最初は、これを実際にWindowsサービスで実行しようとしましたが、機能させることができませんでした。_Push.QueueNotification()呼び出しからnull参照エラーが発生しました。次に、文書化されたサンプルコードが実行したことを正確に実行し、それが機能しました。
PushService _Push = new PushService();
_Push.Events.OnNotificationSendFailure += new ChannelEvents.NotificationSendFailureDelegate(Events_OnNotificationSendFailure);
_Push.Events.OnNotificationSent += new ChannelEvents.NotificationSentDelegate(Events_OnNotificationSent);
var cert = File.ReadAllBytes(HttpContext.Current.Server.MapPath("..pathtokeyfile.p12"));
_Push.StartApplePushService(new ApplePushChannelSettings(false, cert, "certpwd"));
AppleNotification notification = NotificationFactory.Apple()
.ForDeviceToken(deviceToken)
.WithAlert(message)
.WithSound("default")
.WithBadge(badge);
_Push.QueueNotification(notification);
_Push.StopAllServices(true);
問題#1:これは完全に機能し、iPhoneに通知がポップアップ表示されます。ただし、プッシュサービスと呼ばれるため、サービスのように動作すると想定しました。つまり、インスタンス化して、Windowsサービス内で_Push.StartApplePushService()を呼び出す可能性があります。そして、実際に通知をキューに入れることを考えました。これはフロントエンド(管理アプリなど)で実行できます。
PushService Push = new PushService();
AppleNotification notification = NotificationFactory.Apple()
.ForDeviceToken(deviceToken)
.WithAlert(message)
.WithSound("default")
.WithBadge(badge);
Push.QueueNotification(notification);
明らかに(そして私がすでに言ったように)、それは機能しませんでした-最後の行はnull参照例外をスローし続けました。
これをサービス/クライアントの方法で設定する方法を示す他の種類のドキュメントを見つけるのに問題があります(すべてを一度に呼び出すだけではありません)。それは可能ですか、それともPushSharpをどのように利用すべきかという点を見逃していますか?
問題#2:また、一度に多くのデバイストークンをループして通知をキューに入れることなく、それらをターゲットにする方法を見つけることができないようです。それが唯一の方法ですか、それともここでも何かが足りないのですか?
前もって感謝します。
@ baramuse すべてを説明しました。サービスの「プロセッサ」を確認したい場合は、 https://github.comで私のソリューションを参照できます。/vmandic/DevUG-PushSharp ここで、必要なワークフローを実装しました。つまり、winサービス、winプロセッサ、または同じコアプロセッサを使用するWebAPIアドホックプロセッサです。
私が読んだものとそれをどのように使用しているかから、「サービス」キーワードはあなたを誤解させるかもしれません...
これは、一度構成して開始するという意味でサービスです。この時点から、キューシステム内に新しい通知をプッシュするのを待ち、何かが発生するとすぐにイベントを発生させます(配信レポート、配信エラー...)。これは非同期であり、10000通知をプッシュ(=キュー)し、イベントハンドラーを使用して後で結果が返されるのを待つことができます。
ただし、それでも通常のオブジェクトインスタンスとして作成し、アクセスする必要があります。 「外部リスナー」(たとえばhttp/tcp/ipc接続)は公開されないため、ビルドする必要があります。
私のプロジェクトでは、SendNotification関数のみを公開しながら、構成とインスタンスの有効期間を処理する小さなセルフホストWebサービス(ServiceStackに依存)を作成しました。
そして問題#2については、確かに「バッチキュー」はありませんが、キュー関数がすぐに戻るので(エンキューして後でプッシュ)、デバイストークンリストにループするだけです。 ...。
public void QueueNotification(Notification notification)
{
if (this.cancelTokenSource.IsCancellationRequested)
{
Events.RaiseChannelException(new ObjectDisposedException("Service", "Service has already been signaled to stop"), this.Platform, notification);
return;
}
notification.EnqueuedTimestamp = DateTime.UtcNow;
queuedNotifications.Enqueue(notification);
}