9

这是我的服务器端代码或 android 端代码。此代码仅适用于英文消息。如果我使用 Unicode 章程,例如使用阿拉伯语,那么它不会显示任何内容来代替阿拉伯语。由于英语阿拉伯语混合,它跳过了唯一的阿拉伯语包机。

请给我解决方案。谢谢!

这是我的 C# 代码

private string SendNotification(string authstring, string id, string msg)
    {
        try
        {
            ServicePointManager.ServerCertificateValidationCallback = (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => true;
            WebRequest request = WebRequest.Create("https://android.googleapis.com/gcm/send");
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";

            request.Headers.Add(string.Format("Authorization: key={0}", authstring));
            string collaspeKey = Guid.NewGuid().ToString("n");
            string postData = string.Format("registration_id={0}&data.payload={1}&collapse_key={2}", id, msg, collaspeKey);
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            request.ContentLength = byteArray.Length;
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();
            WebResponse response = request.GetResponse();
            dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();
            reader.Close();
            dataStream.Close();
            response.Close();

            return responseFromServer;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

这是我捕获消息的 Android 端代码。

@Override
protected void onMessage(Context context, Intent intent) {        
    String message = ArabicUtilities.reshape(intent.getExtras().getString("payload"));
}
4

3 回答 3

9

André Oriani 有修复的总体思路。即使消息被放置在请求的正文中,它仍然需要进行 url 编码。

string postData = string.Format("registration_id={0}&data.payload={1}&collapse_key={2}", id, msg, collaspeKey);

应该替换为

string postData = string.Format("registration_id={0}&data.payload={1}&collapse_key={2}", id, HttpUtility.UrlEncode(msg), HttpUtility.UrlEncode(collaspeKey));

您需要添加对 System.Web 的引用才能使用 HttpUtility。有关详细信息,请参阅使用 C# 进行 URL 编码

于 2012-09-06T21:24:50.257 回答
2

您是否考虑过使用 base64 对通过 GCM 发送的字符串进行编码?这样,您将消除所有编码问题。

于 2012-08-09T09:47:37.517 回答
2

这是用Java为我解决的问题:

在服务器端:

encodedMessage = URLEncoder.encode(message, "UTF-8");

在应用程序中:

decodedMessage = URLDecoder.decode(message, "UTF-8");
于 2015-02-12T20:22:02.700 回答