本文轉自:http://my.oschina.net/u/1270482/blog/217661javascript
http://devgirl.org/2013/07/17/tutorial-implement-push-notifications-in-your-phonegap-application/html
歸納java
Android設備經過GCM服務來接收推送消息,而iOS設備這從蘋果的APN服務獲取。雖然按照負載來講這是兩種不一樣的服務,可是證書都在從第三方接收消息的時候是須要做爲一個存儲和轉發類型的服務。辨別接收者並傳遞下去。在接受端,你的應用已經註冊來接收他們,並檢查返回內容和相應的操做。消息的接收方式是應用代碼裏的註冊和用戶設備關於消息設定的融合。node
開始android
有一個叫PushPlugin的官方插件能夠用來進行消息的推送,並且是PhoneGap支持的。此教程裏就是使用這個插件,完整的項目源碼在下面連接處:git
https://github.com/hollyschinsky/PushNotificationSampleAppgithub
注意此代碼跟處理iOS的消息推送是同樣的。只須要經過PhoneGap Build建立本身的推送消息證書並測試就好了。api
此教程不會深刻探討建立GCM或者ADP應用的創建,能夠在下面文字處瞭解詳細內容。服務器
· Andr消息推送app
· iOS消息推送
此教程中我只會集中講解Android和GCM服務,而後下面的是關於iOS的消息推送。
· Push Notifications Plugin Support added to PhoneGap Build
Android學前知識
· Google雲消息項目ID
· 項目ID對應的Google雲消息API鍵
iOS學前知識
· ADP上用來配置消息推送的應用ID
· SSL證書以及私有密鑰
第一部分:配置應用來使用PushPlugin
此部分咱們會在應用中添加對PushPlugin的支持。咱們會使用PhoneGap Build,這樣咱們只須要在項目根裏的www/config.xml文件裏作插件的引用,並指出PushNotifications.js文件的腳本標籤即,PhoneGap Build會在構建的時候注入。
將下面腳本加入index.html中來引用PushNotification Plugin。
1
|
<script type=
"text/javascript"
src=
"PushNotification.js"
></script>
|
將下面的代碼加到www/config.xml文件裏,這樣PhoneGap Build就會知道注入PushPlugin代碼。
1
|
<gap:plugin name=
"com.adobe.plugins.pushplugin"
/>
|
不要跟指明每一個平臺的配置文件向混淆。只須要在PhoneGap Build工做是使用www文件夾便可。
第二部分:利用Google的雲服務信息服務來註冊應用
此部分,咱們將利用Google的雲信息服務來接受推送的消息,以便註冊咱們的應用。
首先建立一個帳戶和帶GCM服務的項目。項目創建好以後,會有一個項目ID。能夠在GCM的控制檯裏查看此ID,固然也會追加例如https://code.google.com/apis/console/#project:824841663931這樣的URL。注意下此處,後面註冊調用的時候須要使用。
1. 在編輯器裏打開基本應用,到www/js/index.js文件下。在receivedEvent函數裏,添加下面的代碼來獲取推送消息插件對象的引用和對register函數的調用。須要將成功和出錯的回調函數傳入進去,還須要包括以前創建項目時賦值的GCM的發送者ID等參數以及一個從GCM得到信息的回到函數來做爲ecb的參數。
1
2
|
var
pushNotification = window.plugins.pushNotification;
pushNotification.register(
this
.successHandler,
this
.errorHandler,{
"senderID"
:
"824841663931"
,
"ecb"
:
"app.onNotificationGCM"
});
|
下面代碼的每一個回調函數都引用了上述的註冊調用。
1. 以添加的成功處理句柄開始,此句柄將在註冊成功的時候調用。結果包含註冊對象,咱們會在提示框裏顯示。
1
2
3
|
[backcolor=white !important]successHandler: function(result) {
[backcolor=white !important] alert(
'Callback Success! Result = '
+result)
[backcolor=white !important]},
|
2. 以後添加錯誤處理函數,當註冊請求出錯的時候會調用此函數。此處理函數中咱們將簡單顯示收到的錯誤。
1
2
3
|
errorHandler:
function
(error) {
alert(error);
},
|
3. 最後添加回調函數,此函數在關閉文檔以前,收到index.js文件結尾的GCM的消息時候調用。在我這裏,我命名爲onNotificationGCM做爲回調並在iOS裏者相同應用添加推送消息的支持,一樣也須要一個不一樣的回調函數。此函數檢測收到的事件並簡單的將內容用提示框顯示出來。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
onNotificationGCM:
function
(e) {
switch
( e.event )
{
case
'registered'
:
if
( e.regid.length > 0 )
{
console.log(
"Regid "
+ e.regid);
alert(
'registration id = '
+e.regid);
}
break
;
case
'message'
:
// this is the actual push notification. its format depends on the data model from the push server
alert(
'message = '
+e.message+
' msgcnt = '
+e.msgcnt);
break
;
case
'error'
:
alert(
'GCM error = '
+e.msg);
break
;
default
:
alert(
'An unknown GCM event has occurred'
);
break
;
}
}
|
你能夠手動在PhoneGap Build外添加插件到本身的應用裏,在PushPlugin的readme裏查看更多內容。
運行應用
如今當你運行應用的時候你會看到一個調用去註冊你的android設備,收到一個以下的提示框。
如今咱們的應用已經準備好接受從GCM那裏推送的消息了。咱們使用簡單的JS代碼來測試咱們發送的信息。有一個叫node-gcm的庫,咱們能夠用來發送消息給GCM。咱們只是須要令牌或者咱們註冊時返回的註冊ID,另外須要有一個GCM與咱們項目相關的API密鑰。
1. 安裝node-gcm模塊。此庫用來處理了與GCM的通訊並提供方便的類來發送消息。你必須安裝node.js,這樣此庫才能工做。
2. 到GCM的控制檯,找到服務器API密鑰。若是沒有建立,這須要如今建立。
3. 得到從控制檯返回的應用註冊ID。我喜歡使用Android的adb工具,這樣我就能夠容許日子監控來在應用運行的時候查看控制檯。假設你有了android-sdk工具和環境變量裏設置的平臺工具,你就能夠輕易的輸入adb logcat來顯示設備的日子。
4. 打開編輯器,建立一個叫notify.js的文件,在下面粘貼,代替發送者密鑰以及你本身的註冊ID。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
var
gcm = require(
'node-gcm'
);
var
message =
new
gcm.Message();
//API Server Key
var
sender =
new
gcm.Sender(
'AIzaSyCDx8v9R0fMsAsjoAffF-P3FCFWXlvwLhg'
);
var
registrationIds = [];
// Value the payload data to send...
message.addData(
'message'
,
"\u270C Peace, Love \u2764 and PhoneGap \u2706!"
);
message.addData(
'title'
,
'Push Notification Sample'
);
message.addData(
'msgcnt'
,
'3'
);
// Shows up in the notification in the status bar
message.addData(
'soundname'
,
'beep.wav'
);
//Sound to play upon notification receipt - put in the www folder in app
message.timeToLive = 3;
// Duration in seconds to hold and retry to deliver the message in GCM before timing out. Default 4 weeks if not specified
// At least one reg id required
registrationIds.push(
'APA91bwu-47V0L7xB55zoVd47zOJahUgBFFuxDiUBjLAUdpuWwEcLd3FvbcNTPKTSnDZwjN384qTyfWW2KAJJW7ArZ-QVPExnxWK91Pc-uTzFdFaJ3URK470WmTl5R1zL0Vloru1B-AfHO6QFFg47O4Cnv6yBOWEFcvZlHDBY8YaDc4UeKUe7ao'
);
/**
* Parameters: message-literal, registrationIds-array, No. of retries, callback-function
*/
sender.send(message, registrationIds, 4,
function
(result) {
console.log(result);
});
|
5. 在腳本創建的地方輸入下面命令來運行代碼和發送消息推送。 node notify.js
你應該聽到消息,並在Android設備的狀態條上能夠看到。
點擊以後,應用會打開,你就會看到冒出來的信息了。
其餘須要注意的事情
· 能夠PushPluginAPI來設置標識數量
1
|
pushNotification.setApplicationIconBadgeNumber(
this
.successHandler, 0);
|
· 能夠指定一個自定義聲音來播放,包括www文件夾裏的聲音文件,能夠從服務端進行指定。
還有其餘的第三方的消息推送插件服務可使用,例如Urban Airship,PushWoosh等相似的API調用,均可以用,可是當前仍是不支持PhoneGap Build。
Android 和iOS之間的區別
1. Android的負載爲4K而iOS的則爲256字節。
2. iOS須要額外從ADP來得到消息推送的驗證應用ID,也須要一個惟一的SSL證書,這樣服務端才能確認。
3. 若是設備ID更改或者是無效的,GCM將返回一個信息進行提示,可是Apple這須要按期ping服務器來找出設備令牌是否有效。
4. 在消息0秒到4周之間,須要肯定一個Android的生命週期。蘋果則不須要設置。
5. 對Android設備來講須要指定一個碰撞密鑰,它用來保存信息,而且只有最後一個會發送。在iOS上這須要將多個消息發給同一個設備,若是設備不在線,者只有最後一個消息會發送。
總結
如今你知道若是接收推送的消息,下一步就是保存從設備獲得的註冊ID或者設備令牌,它們都運行你的應用,這樣你就能夠在須要爲應用發送消息的時候從服務端訪問它們。固然在接收到特定消息的時候你也須要添加任意的處理代碼來進行處理。
http://devgirl.org/2013/07/17/tutorial-implement-push-notifications-in-your-phonegap-application/
仿照上述示例 相應測試項目代碼: