使用前之準備
1. 前往 Google APIs Console page 建立 API project ()
2. 左側切換到 Service, 找到 Google Cloud Messaging for Android 把它打開
3. 左側切換到 API Access, 按下 Create new Server key 按鈕,
在彈出視窗中輸入要允許的 IP 位置後, 按下 Create (不設定 IP 就是全部允許啦)
4. 在 Eclipse 下打開 Android SDK Manager,
找到 Extras 下的 Google Cloud Messaging for Android Library 進行安裝,
這會在你的 Android SDK 目錄/extras/google/ 下建立 gcm-client, gcm-server 以及相關範例的目錄
GCM 專案相關設定
1. 拷貝 Android SDK 目錄/extras/google/gcm-client/dist 下的 gcm.jar 到專案 libs 目錄下
2. AndroidManifest.xml 裡的設定(my_app_package 請自行修改為正確名稱)
<!-- GCM 最低支援到 8 --> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="xx"/>
<!-- SDK 版本 16 以上不用設定此權限 --> <permission android:name="my_app_package.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="my_app_package.permission.C2D_MESSAGE" />
<!-- 接收 GCM 用 --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <!-- 用來連接到 Google Services --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 需要使用 Google 帳戶資訊(4.0.4以下版本需要使用者帳戶) --> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <!-- 收到訊息時保持 CPU 休眠 --> <uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- 允許 GCMBroadcastReceiver 接收處理來自 GCM 所 SEND 出來的 RECEIVE 跟 REGISTRATION 這兩個 Intent --> <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="my_app_package" /> </intent-filter> </receiver>
<!-- 繼承自 GCMBaseIntentService 的類別, 若由 GCMBroadcastReceiver 呼叫則不能改類別名 --> <service android:name=".GCMIntentService" />
3. 撰寫 GCMIntentService 類別
這裡就是重頭戲,記得要撰寫相關程式,免得手機收到訊息卻沒有做出正常反應
onRegistered(Context context, String regId) //接受到 REGISTRATION 時呼叫, 參數 regId 將會被用來從自己的 server 傳送推播訊息到此裝置 onUnregistered(Context context, String regId) //該裝置從 GCM 解除註冊時呼叫, 參數 regId 應該傳到自己的 server 去進行解除註冊動作 onMessage(Context context, Intent intent) //當我們從 server 傳送的訊息經由 GCM 傳送到裝置時呼叫, 訊息若要裝載一些資料(上限為4K)可以做為 extras 放在 intent 裡 onError(Context context, String errorId) //當註冊或解除註冊時 GCM 回傳錯誤時呼叫, 可以透過回傳的 errorId 進行處理 onRecoverableError(Context context, String errorId) //除非有特別需求否則不用 override 它 //當註冊或解除註冊但 GCM server 無回應時呼叫, 它會繼續嘗試除非此方法被 override 並回傳 false
4.在 app 裡進行註冊
GCMRegistrar.checkDevice(this); //驗證該裝置支援GCM(否則會丟出exception) GCMRegistrar.checkManifest(this); //驗證AndroidManifest.xml裡的設定正確(開發時使用,正式上線前可移除) final String regId = GCMRegistrar.getRegistrationId(this); //先確認regId不存在 if (regId.equals("")) { GCMRegistrar.register(this, SENDER_ID); //傳入 Google APIs Console page Overview 裡面寫的 project number 做為 SENDER_ID 進行註冊 } else { Log.v(TAG, "已經註冊過了"); }
5. 至於 Server 端由於公司使用的是 .NET
所以官方給的 Java code 就沒有用上
不過在 這裡 有 C# 可用的 code
這裡為了文章完整性就原文轉載一下
詳細資訊請自行到來源連結取經嚕
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Net; using System.Text; using System.IO; using System.Security.Cryptography.X509Certificates; using System.Net.Security; using System.Collections.Specialized; public class AndroidGCMPushNotification { public AndroidGCMPushNotification() { // // TODO: Add constructor logic here // } public string SendNotification(string deviceId, string message) { string GoogleAppID = "google application id"; var SENDER_ID = "9999999999"; var value = message; 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}", GoogleAppID)); tRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID)); 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=" + deviceId + ""; 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(); tReader.Close(); dataStream.Close(); tResponse.Close(); return sResponseFromServer; } }
AndroidGCMPushNotification apnGCM = new AndroidGCMPushNotification(); string strResponse = apnGCM.SendNotification("17BA0791499DB908433B80F37C5FBC89B870084B", "Test Push Notification message ");
雖然這篇寫了很長,但實際弄起來卻挺簡單的
沒有留言:
張貼留言