3

asp.netでandroid gcmと関連するサーバー側の作業を正常にセットアップする方法に成功しました。しかし、私の問題は、サーバーから送信された最後の通知のみが表示されることです。

すべての通知を表示したいのは、同じcollapse_key または特定のデバイスに送信されたすべてのメッセージを表示するためにgcmコードまたはサーバー側コードで変更したものです。

サーバー側からの私のコードは以下の通りです

public void SendCommandToPhone(String sCommand)
{
    String DeviceID = "";
    DeviceID = "APA91bF9SSDEp-UPU8UwvctGt5ogfrSw0UdilTWlCujqItHcr-eiPJ31ZDI-IeqTbLr92ZOPF31bXtB1_5gNEPHAq82N4ji0stm4cy9U0Yuk0Awhjl9PS02okuc9rRhJobkgOt-ofm5Br0KR-Y";
    WebRequest tRequest;
    tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send");
    tRequest.Method = "post";
    //tRequest.ContentType = "application/json";
    tRequest.ContentType = "application/x-www-form-urlencoded";
    tRequest.Headers.Add(string.Format("Authorization: key={0}", "AIzaSyBgCKDhyHnRmmu8jCfmupHVJA8cVkIa-XEZS"));
    String collaspeKey = Guid.NewGuid().ToString("n");
    String postData = string.Format("registration_id={0}&data.message={1}&collapse_key={2}", DeviceID, "YourMessage", collaspeKey);
    Byte[] byteArray = Encoding.UTF8.GetBytes(postData);
    tRequest.ContentLength = byteArray.Length;
    Stream dataStream = tRequest.GetRequestStream();
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();
    WebResponse tResponse = tRequest.GetResponse();
    dataStream = tResponse.GetResponseStream();
    StreamReader tReader = new StreamReader(dataStream);
    String sResponseFromServer = tReader.ReadToEnd();
    tReader.Close();
    dataStream.Close();
    tResponse.Close();
}

Androidアプリ側のコードは以下の通り onMessage(Context arg0, Intent arg1)

NotificationManager notificationManager = (NotificationManager) arg0
            .getSystemService(Context.NOTIFICATION_SERVICE);
    Notification note = new Notification(R.drawable.ic_launcher,
            "meaNexus Notification", System.currentTimeMillis());

    Intent notificationIntent = new Intent(arg0, Main.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
            | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(arg0, 0,
            notificationIntent, 0);
    note.setLatestEventInfo(arg0, String.valueOf(R.string.app_name), message, pendingIntent);
    note.number = count++;
    note.defaults |= Notification.DEFAULT_SOUND;
    note.defaults |= Notification.DEFAULT_VIBRATE;
    note.defaults |= Notification.DEFAULT_LIGHTS;
    note.flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(0, note);
4

2 に答える 2

10

公式ドキュメントより

collapse_key

デバイスがオフラインのときに同様のメッセージのグループを折りたたむために使用される任意の文字列。これにより、最後のメッセージのみがクライアントに送信されます。これは、電話がオンラインに戻ったときに電話に大量のメッセージが送信されないようにするためです。メッセージが送信される順序が保証されていないため、「最後の」メッセージが、実際にはアプリケーション サーバーによって送信された最後のメッセージではない可能性があることに注意してください。

したがって、デバイスにすべてのメッセージを受信させたい場合は、メッセージごとに異なる折りたたみキーを使用できます..

EDIT1:通知の問題

通知コードは次のとおりです。

notificationManager.notify(0, note);

notifiy()メソッドの Java doc に従ってください。ステータスバーに表示される通知を投稿します。同じIDの通知がアプリケーションによってすでに投稿されていて、まだキャンセルされていない場合は、更新された情報に置き換えられます.

そのため、メソッド呼び出しで別の ID を使用して、バーにnotificationManager.notify()複数投稿します。notificationnotification

于 2013-01-03T07:41:50.923 に答える
0

アプリケーションに GCM を実装しようとしたときに、同じ問題が発生しました。

第 3 部のアプリケーションには C# を使用しました。最初は、通知ごとに同じ collapse_key を使用しました。そのため、最後の 1 つだけを受け取りました。

そのため、GCM サーバー経由でデバイスに通知を送信する関数を呼び出すときは、別の collapse_key を使用してみてください。たとえば、currentTime を使用してみてください。

于 2013-01-03T09:16:13.633 に答える