ご覧のとおり、Google はプッシュ通知システムを移行しています。
http://developer.android.com/guide/google/gcm/c2dm.html
Asp.Net アプリケーションを使用して Google Cloud Messaging (GCM) を実装するためのサンプルまたはガイドラインはありますか?
ご覧のとおり、Google はプッシュ通知システムを移行しています。
http://developer.android.com/guide/google/gcm/c2dm.html
Asp.Net アプリケーションを使用して Google Cloud Messaging (GCM) を実装するためのサンプルまたはガイドラインはありますか?
私にとっては問題なく機能し、役立つ可能性のあるコードがあります。テストしました...
void send(string regId)
{
var applicationID = "xxxxxxxx";
var SENDER_ID = "xxxxx";
var value = txtMsg.Text;
WebRequest tRequest;
tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send");
tRequest.Method = "post";
tRequest.ContentType = " application/x-www-form-urlencoded;charset=UTF-8";
tRequest.Headers.Add(string.Format("Authorization: key={0}", applicationID));
tRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID));
// string postData = "{ 'registration_id': [ '" + regId + "' ], 'data': {'message': '" + txtMsg.Text + "'}}";
string postData = "collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.message=" + value + "&data.time=" + System.DateTime.Now.ToString() + "®istration_id=" + regId + "";
Console.WriteLine(postData);
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();
lblStat.Text = sResponseFromServer;
tReader.Close();
dataStream.Close();
tResponse.Close();
}
これがc#のコードです
WebRequest tRequest;
tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send");
tRequest.Method = "post";
tRequest.ContentType = "application/x-www-form-urlencoded";
tRequest.Headers.Add(string.Format("Authorization: key={0}", GoogleAppID));
String collaspeKey = Guid.NewGuid().ToString("n");
String postData=string.Format("registration_id={0}&data.payload={1}&collapse_key={2}", DeviceID, "Pickup Message" + DateTime.Now.ToString(), 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();
しばらく前に、プッシュ通知を送信するために C2DM をいじっていました。このページに記載されている変更に従ってコードを変更しました: http://developer.android.com/guide/google/gcm/c2dm.html#server GCMサービスを利用するために:
Private Sub btnPush_Click(sender As Object, e As System.EventArgs) Handles btnPush.Click
lblResponse.Text = SendNotification(AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA)
End Sub
私の SendNotification 関数:
Private Function SendNotification(ByVal authstring As String) As String
ServicePointManager.ServerCertificateValidationCallback = Function(sender As Object, certificate As X509Certificate, chain As X509Chain, sslPolicyErrors As SslPolicyErrors) True
Dim request As WebRequest = WebRequest.Create("https://android.googleapis.com/gcm/send")
request.Method = "POST"
request.ContentType = "application/x-www-form-urlencoded"
request.Headers.Add(String.Format("Authorization: key={0}", authstring))
Dim collaspeKey As String = Guid.NewGuid().ToString("n")
Dim postData As String = String.Format("registration_id={0}&data.payload={1}&collapse_key={2}", deviceList.SelectedValue, txtPayload.Text, collaspeKey)
Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
request.ContentLength = byteArray.Length
Dim dataStream As Stream = request.GetRequestStream()
dataStream.Write(byteArray, 0, byteArray.Length)
dataStream.Close()
Dim response As WebResponse = request.GetResponse()
dataStream = response.GetResponseStream()
Dim reader As New StreamReader(dataStream)
Dim responseFromServer As String = reader.ReadToEnd()
reader.Close()
dataStream.Close()
response.Close()
Return responseFromServer
End Function
GCM では、認証キーを取得するために Google に対して認証する必要がないようです (C2DM の場合と同様)。代わりに、SendNotification 関数に渡される API キーが必要になります。このページは、API キーを設定するのに役立ちます: http://developer.android.com/guide/google/gcm/gs.html
念のため、私の Web フォームのコードを以下に示します。
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="deviceList" runat="server">
<asp:ListItem Value="device-id-goes-here">Eclipse AVD</asp:ListItem>
<asp:ListItem Value="device-id-goes-here">My Phone 1</asp:ListItem>
<asp:ListItem Value="device-id-goes-here">My Phone 2</asp:ListItem>
</asp:DropDownList>
<br /><br />
<asp:TextBox ID="txtPayload" runat="server" Width="480px"></asp:TextBox>
<br /><br />
<asp:Button ID="btnPush" runat="server" Text="Push" />
<asp:Label ID="lblResponse" runat="server" Text=""></asp:Label>
</div>
</form>
プッシュ通知を受信するための Android アプリの作成については、次のリンクを確認してください: http://developer.android.com/guide/google/gcm/gs.html#android-app
System.Net、System.IO、System.Security.Cryptography.X509Certificates、および System.Net.Security をインポートすることを忘れないでください。
JSON 方式
user1551788 の回答は問題なく動作しますが、JSON で行うのが好きです。これは、すべてを 1 行に挿入するよりも良い方法だと思います。
内部クラス「jsonObj」は、ドキュメントが要求するものと同じです。ここで行うことができるさまざまなリクエストを確認してください
簡単な説明:
to : 送信先の電話。電話から受け取った registrationId をここに挿入します。 delay_while_idle delay_while_idle フラグを使用すると、デバイスがアクティブになると通知が配信されます。(ユーザーが実際に電話を使用している場合、ロックされていません)。
data :data
カスタムのキーと値のペアで設定して、追加のペイロードをクライアント アプリに渡します。したがって、別のオブジェクトを含む json 文字列が必要な場合は、4 KB を超えない限り、任意の変数を入れることができます。
私が使用していないものもあります。
collapse_key : 設定されている場合、同じcollapse_key
名前の通知は古い通知を上書きする必要があります (通知が送信されたときに電話側で適切に実装され、GCM サーバーでは通知が保留されているときに上書きされます)。
time_to_live : 簡単に言えば、通知が存続する期間です。現在、IOS ではサポートされていません。
その他、ドキュメントを参照してください。
クラスの外でそのオブジェクトを必要としなかったため、内部クラスに変更しました。
private void SendPostsToGCM(jsonObj jsonObj)
{
string senderId = "your project number (google)";
string apiKey = "your apiKey, found on console";
WebRequest tRequest;
tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send");
tRequest.Method = "post";
tRequest.ContentType = "application/json";
tRequest.Headers.Add(string.Format("Authorization: key={0}", apiKey));
tRequest.Headers.Add(string.Format("Sender: id={0}", senderId));
string jsonPostData = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj); //download Newtonsoft NuGet package
Byte[] byteArray = Encoding.UTF8.GetBytes(jsonPostData);
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();
string response = sResponseFromServer;
tReader.Close();
dataStream.Close();
tResponse.Close();
}
internal class jsonObj
{
public bool delay_while_idle { get; set; }
public data data { get; set; }
public string to { get; set; }
}
internal class data
{
public int Id { get; set; }
public string text { get; set; }
}
使用するには、次のようにします。
//some filtering to select some posts or whatever.
jsonObj jsonPostData = new jsonObj()
{
delay_while_idle = true,
to = registrationGCMid,
data = new data()
{
Id = post.id,
text = post.text,
}
};
SendPostsToGCM(jsonPostData);
私が気付いたもう 1 つの大きな違いは、Google サービスが有用な情報を含む json 文字列を返し、成功した回数と失敗した回数などを示すことです。
Nikunj Ganatra、エラーの種類についてこのリンクを確認してください。アプリケーション ID が間違っているか、その他の詳細が間違っている可能性があります。http://developer.android.com/guide/google/gcm/gcm.html#上
応答/説明
200 メッセージは正常に処理されました。応答本文には、メッセージ ステータスに関する詳細が含まれますが、その形式は、要求が JSON であるかプレーン テキストであるかによって異なります。詳細については、成功応答の解釈を参照してください。
400 JSON 要求にのみ適用されます。リクエストを JSON として解析できなかったか、無効なフィールドが含まれていたことを示します (たとえば、数値が必要な場所に文字列を渡しているなど)。失敗の正確な理由は応答に記載されており、要求を再試行する前に問題に対処する必要があります。
401 送信者アカウントの認証中にエラーが発生しました。
500 リクエストの処理中に GCM サーバーで内部エラーが発生しました。
503 サーバーが一時的に使用できないことを示します (つまり、タイムアウトなどのため)。送信者は、応答に含まれる Retry-After ヘッダーを尊重して、後で再試行する必要があります。アプリケーション サーバーは、指数バックオフを実装する必要があります。GCM サーバーが要求を処理するのに時間がかかりすぎました。
私はちょうどそれを修正しました。