2013-10-08 100 views
4

我正在使用GCM推送通知服務的android應用程序。目前我被困在創建一個服務器。 GCM文檔提供的指南是用java編寫的,我不知道如何實現。研究了一段時間後,我發現GCMSharp在GitHub上,它使用C#服務器爲GCM推送通知到android在C#

PushSharp - https://github.com/Redth/PushSharp

但截至目前,我是新來創建服務器,而且不知道如何開始。服務器實際上是一個Web服務,它一直在監聽請求,並在獲得請求時將它引導到將通知推送到客戶端電話的GCM?

如果是的話,我是否在Web服務中實現它,例如WCF?

回答

5

你可以按照this教程。

實際上是服務器的Web服務,不斷聆聽要求 並在得到一個請求時,它引導到推動 通知到客戶手機GCM?

您不需要聽取請求。 GCM Push直接將任何消息推送至設備而沒有任何請求。欲瞭解更多詳情,請閱讀documentation

+0

如果是這樣,那麼實現服務器有什麼用?在它寫的文檔中:您必須實現的第三方應用程序服務器。此應用程序服務器通過所選的GCM連接服務器將數據發送到啓用GCM的Android應用程序。 是不是我們實現發送消息的服務器? – user2857001

+0

您需要在後端執行的所有操作都是在用戶註冊到GCM服務器並將其保存在數據庫中時從Android設備收集設備令牌。當您想推送消息時,您可以要求Google服務器使用設備令牌和您的API密鑰發送消息。 –

+0

哦!服務器也僅用於註冊設備ID並檢索設備ID。爲了從設備A發送到設備B,設備A將從服務器獲取設備B的ID,並使用GCM將通知推送到設備B? – user2857001

1

我已經在另一個線程上回答了這個問題,我在這裏重複。代碼看起來有點長,但它的工作。通過在C#項目中實現以下代碼,我在掙扎了兩天之後,向我的手機發送了推送通知。我提到了一個關於這個實現的鏈接,但是找不到它在這裏發佈。所以將與我分享我的代碼。如果您想在線測試通知,您可以訪問此link

注:我已經hardcorded apiKey,DEVICEID和POSTDATA,請繞道 的apiKey,設備ID和POSTDATA在您的請求,並從 方法體中刪除。如果你想傳遞的消息字符串也

public string SendGCMNotification(string apiKey, string deviceId, string postData) 
{ 
    string postDataContentType = "application/json"; 
    apiKey = "AIzaSyC13...PhtPvBj1Blihv_J4"; // hardcorded 
    deviceId = "da5azdfZ0hc:APA91bGM...t8uH"; // hardcorded 

    string message = "Your text"; 
    string tickerText = "example test GCM"; 
    string contentTitle = "content title GCM"; 
    postData = 
    "{ \"registration_ids\": [ \"" + deviceId + "\" ], " + 
     "\"data\": {\"tickerText\":\"" + tickerText + "\", " + 
       "\"contentTitle\":\"" + contentTitle + "\", " + 
       "\"message\": \"" + message + "\"}}"; 


    ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateServerCertificate); 

    // 
    // MESSAGE CONTENT 
    byte[] byteArray = Encoding.UTF8.GetBytes(postData); 

    // 
    // CREATE REQUEST 
    HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://android.googleapis.com/gcm/send"); 
    Request.Method = "POST"; 
    Request.KeepAlive = false; 
    Request.ContentType = postDataContentType; 
    Request.Headers.Add(string.Format("Authorization: key={0}", apiKey)); 
    Request.ContentLength = byteArray.Length; 

    Stream dataStream = Request.GetRequestStream(); 
    dataStream.Write(byteArray, 0, byteArray.Length); 
    dataStream.Close(); 

    // 
    // SEND MESSAGE 
    try 
    { 
     WebResponse Response = Request.GetResponse(); 
     HttpStatusCode ResponseCode = ((HttpWebResponse)Response).StatusCode; 
     if (ResponseCode.Equals(HttpStatusCode.Unauthorized) || ResponseCode.Equals(HttpStatusCode.Forbidden)) 
     { 
      var text = "Unauthorized - need new token"; 
     } 
     else if (!ResponseCode.Equals(HttpStatusCode.OK)) 
     { 
      var text = "Response from web service isn't OK"; 
     } 

     StreamReader Reader = new StreamReader(Response.GetResponseStream()); 
     string responseLine = Reader.ReadToEnd(); 
     Reader.Close(); 

     return responseLine; 
    } 
    catch (Exception e) 
    { 
    } 
    return "error"; 
} 

public static bool ValidateServerCertificate(
object sender, 
X509Certificate certificate, 
X509Chain chain, 
SslPolicyErrors sslPolicyErrors) 
{ 
    return true; 
} 

你可能不熟悉,像apiKey,DEVICEID話。別擔心,我會解釋他們是什麼以及如何創建這些。

apiKey
什麼&原因是:這將請求發送到GCM服務器時將使用的密鑰。
如何創建:Refer this post

DEVICEID
什麼&原因:此ID也被稱爲RegistrationId。這是識別設備的唯一ID。當你想發送一個 通知給特定的設備時,你需要這個ID。
如何創建 :這取決於您如何實現應用程序。對於科爾多瓦 我使用了一個簡單的pushNotification Plugin你可以簡單地使用這個插件創建一個 deviceId/RegistrationId。要做到這一點,你需要有 a senderId。谷歌如何創建一個senderId它真的很簡單=)

如果有人需要一些幫助發表評論。

快樂編碼。
-Charitha-