14

アプリがインストールされている何万もの 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 : また、一度に多くのデバイス トークンを対象にする方法を見つけることができないようです。それらをループして一度に 1 つずつ通知をキューに入れる必要があります。それが唯一の方法ですか、それともここでも何か不足していますか?

前もって感謝します。

4

2 に答える 2

4

@baramuseがすべてを説明しました。サービス「プロセッサ」を見たい場合は、https://github.com/vmandic/DevUG-PushSharpで私のソリューションを参照してください。ここで、求めるワークフローを実装しました。サービス、win プロセッサ、または同じコア プロセッサを使用する Web API アドホック プロセッサですらあります。

于 2014-11-25T14:02:21.250 に答える
3

私が読んだ内容と使用方法から、「サービス」というキーワードは誤解を招く可能性があります...

一度設定して起動するサービスです。この時点から、キュー システム内に新しい通知がプッシュされるのを待ち、何かが発生するとすぐにイベントを発生させます (配信レポート、配信エラーなど)。これは非同期であり、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);
}
于 2013-02-05T05:21:33.403 に答える