1

Android デバイスでアプリを最適化しています。したがって、私のアプリはバックグラウンドでスリープしていますが、優先度の高い GCM メッセージを受信すると起動するはずです。ここに記載されているよう

優先度高。GCM は優先度の高いメッセージをすぐに配信しようとします。これにより、GCM サービスは可能な場合にスリープ状態のデバイスを起動し、アプリ サーバーへのネットワーク接続を開くことができます。たとえば、インスタント メッセージング、チャット、または音声通話アラートを備えたアプリは、通常、ネットワーク接続を開き、GCM が遅延なくデバイスにメッセージを配信することを確認する必要があります。

そしてここに

GCM は、優先度の高い GCM メッセージによって Doze およびアプリ スタンバイのアイドル モードで動作するように最適化されています。GCM の優先度の高いメッセージを使用すると、ユーザーのデバイスが Doze になっている場合やアプリがアプリ スタンバイ モードになっている場合でも、アプリを確実に起動してネットワークにアクセスできます。Doze モードまたはアプリ スタンバイ モードでは、システムはメッセージを配信し、アプリにネットワーク サービスへの一時的なアクセスと部分的なウェイクロックを与えてから、デバイスまたはアプリをアイドル状態に戻します。

このコードを使用して、C# サーバーから Android デバイスに優先メッセージを送信します。

private string SendMessageUsingGCM(String sRegistrationId, string sTextToSend, string sCollapseKey)
{
    String GCM_URL = @"https://gcm-http.googleapis.com/gcm/send";
    bool flag = false;
    string sError = "";

    StringBuilder sb = new StringBuilder();
    sb.AppendFormat("registration_id={0}&collapse_key={1}", sRegistrationId, sCollapseKey);
    sb.AppendFormat("&delay_while_idle=0&priority=high");
    sb.AppendFormat("&data.msg=" + HttpUtility.UrlEncode(sTextToSend));  //Para poder enviar caracteres especiales como ä, ë, arábigos...
    string msg = sb.ToString();

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(GCM_URL);
    req.Method = "POST";
    req.ContentLength = msg.Length;
    req.ContentType = "application/x-www-form-urlencoded";
    req.Timeout = 20000;

    req.Headers.Add("Authorization:key=" + MyAthorizationKey);

    try
    {
        using (StreamWriter oWriter = new StreamWriter(req.GetRequestStream()))
        {
            oWriter.Write(msg);
        }

        using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
        {
            using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
            {
                string respData = sr.ReadToEnd();

                if (resp.StatusCode == HttpStatusCode.OK)   // OK = 200
                {
                    if (respData.StartsWith("id="))
                        flag = true;
                    else
                        sError = respData;
                }
                else if (resp.StatusCode == HttpStatusCode.InternalServerError)   // 500
                    sError = "Internal server error. Try later.";
                else if (resp.StatusCode == HttpStatusCode.ServiceUnavailable)    // 503
                    sError = "Server not available temnporatily. Try later.";
                else if (resp.StatusCode == HttpStatusCode.Unauthorized)          // 401
                    sError = "The API Key is not valid.";
                else
                    sError = "Error: " + resp.StatusCode;
            }
        }
    }
    catch (WebException e)
    {   //The remote server returned an error: (502) Bad Gateway. //Más info: http://stackoverflow.com/questions/2159361/error-502-bad-gateway-when-sending-a-request-with-httpwebrequest-over-ssl
        //The remote server returned an error: (500) Internal Server Error. Más info: http://stackoverflow.com/questions/4098945/500-internal-server-error-at-getresponse
        sError = "WebException: " + e.ToString();
    }
    catch (Exception e)
    {
        sError = "Exception: " + e.ToString();
    }


    if (flag == true)
        return "Ok";

    return "Error " + sError;
}

しかし、私のアプリは起きません。デバイスのロックを解除しても。

最適化されたリストにあるためにデバイスがアプリを「ブロック」すると、アプリはそれ以上メッセージを受信しないことがわかりました。システムがアプリを完全に強制終了しているようで、GCM メッセージを受信しません。Lollipop を搭載した Galaxy S4 を使用しています。何か助けはありますか?

4

1 に答える 1

1

プレーン テキスト形式は、メッセージの優先度をサポートしていません。優先度フィールドを使用するには、application/json 形式を使用する必要があります。

于 2016-03-15T06:23:47.577 に答える