在今天的 “30天學習30種新技術” , 我打算去擴充一下 昨天
開發的 PhoneGap 應用,加上推送通知的功能。推送通知允許應用去通知或者警告使用者,即使是在程式沒有打開的情況下。例如,如果我們有一個允許通知推送的 Twitter 應用,當 Twitter 上有人提到你或者關注你了,Twitter 應用也會推送一個通知給你,即使這個應用沒有在運作。
幾周以前,我讀到一篇
Jay Balunas 寫的一篇 很有啟發的文章 , 是關于如何在 OpenShift 上使用 AeroGear 設定通知推送伺服器的。在那時候,我還沒用過 AeroGear OpenShift 工具,但今天我們可以把它添加到我們昨天開發的閱讀器中,以實作通知推送的功能。
什麼是 AeroGear 統一推送伺服器(UnifiedPush Server)?
AeroGear 統一推送伺服器是一個 Java 寫的能夠給不同的移動平台推送通知的開源伺服器端程式。它可以被看作成一系列不同的通知推送技術的抽象。現在的版本支援
蘋果的 APNs,
Google Cloud Messaging和
Mozilla 的 SimplePush。
移動應用用例(Mobile Application Usecase)
今天我們要開發的移動應用是一個為
開發的閱讀器。使用者可以在任何 Android、Symbian、webOS、或者 Windows Phone 裝置上安裝這個應用。你可以在這裡
下載下傳應用可以做下面這些事情:
1.把所有的博文以清單形式展示出來,當使用者點選博文時,在浏覽器打開相應連結。
2.使用者可以通過這個應用回報他們對這個系列的想法。
3.我們在
就已經做好了前兩個功能。今天,我們要增加一個功能:每當一篇新的博文發出來時,使用者都會收到一個通知。
Github 倉庫
今天做的應用示範代碼可以在這裡看到:
Github:30天學習30種新技術之第11天添加通知推送
為了向應用添加通知推送功能,我們要完成下面五個任務。
1. 建立一個 OpenShift AeroGear 伺服器推送程式
2. 注冊一個 Google 帳号,以使用 Google Cloud Messaging 服務
3. 向 AeroGear 推送程式增加一個變體(variant)
4. 在移動應用中,增加通知推送的支援
5.更新移動應用的 Java REST 後端,以發送要推送的通知
讓我們一步步完成這些任務吧。
任務一:建立一個 OpenShift AeroGear 伺服器推送程式
在我們建立 AeroGear 推送服務端程式之前,我們必須先注冊一個 OpenShift 賬戶。這是完全免費的,而且紅帽(Red Hat)會給每個使用者三個免費的 Gears,在 Gears 上你可以運作你的程式。在這篇文章寫的時候,OpenShift 會為每個使用者配置設定 1.5GB 的記憶體和 3GB 的硬碟空間。
在驗證了賬戶之後,登入
OpenShift Web 端控制台點選"建立你的第一個應用程式" 然後選擇 AeroGear Push 0.X 應用類型
這個頁面要求我們輸入應用程式的詳細資訊。這是一個 OpenShift 的快速開始,所有的配置都已經自動為我們設定好了。選擇預設的值,然後按下 "建立程式" 按鈕
在應用程式建立之後,我們可以在
http://aerogear-{domain-name}.rhcloud.com 看到 AeroGear 伺服器的運作,這裡的 domain-name 就是你注冊 OpenShift 時的 domain-name。
打開,
{domain-name}.rhcloud.com ,我們會被要求登入 AeroGear 伺服器。預設的帳号/密碼是 "admin/123"。在成功登入之後,你會被提示修改你的登入密碼
使用新的證書成功登入後,我們可以看到 AeroGear 儀表闆。
現在,我們可以建立第一個使用者給我們的移動應用推送資訊的程式了。點選建立按鈕,然後輸入應用的細節。
在應用建立之後,我們可以看到應用的詳細細節。需要我們特别留意的是應用程式的 ID 和 主密碼(Master Secret)
注冊一個 Google 帳号,以使用 Google Cloud Messaging 服務
這裡是深入介紹了
AeroGear Push 的伺服器端文檔,是以請留心閱讀。 在成功注冊了 Google Cloud Messaging 服務後,你可以拿到 Google API 密匙和項目号碼。這些在下一步是需要的。
增加一個變體(variant)
去 AeroGear 推送伺服器端為應用程式添加一個變體(variant)。一個推送程式(Push Application)可以有多個變體(例如,Android,iPad,iPhone free,Mobile Web)。一個變體包含針對某個平台的信心,例如 Google API 密匙(Andorid),或者 PushNetwork URL(SimplePush)
按照提示輸入細節,然後點選建立按鈕。記得輸入你在任務 2 中獲得的 Google API 密匙和項目号碼。
在移動應用中,增加通知推送的支援
使用 AeroGear 推送伺服器,為 phonegap 應用增加通知推送功能是非常簡單的。AeroGear 團隊提供了一個我們可以安裝 phonegap 插件。運作下面的指令去安裝這個插件:
$ cordova plugin add https://github.com/edewit/aerogear-pushplugin-cordova.git
增加幾行 JavaScript 代碼就可以增加通知推送功能了。在 app.js 檔案中,用下面的代碼代替 jQuery 文檔:
document.addEventListener('deviceready', onDeviceReady, true);
function onDeviceReady(){
var aeroConfig = {
senderID: "{senderId}",
pushServerURL: "{pushServerUrl}",
variantID: "{variantId}",
variantSecret: "{variantSecret}"
};
try {
push.register(successHandler, errorHandler, {"badge": "true", "sound": "true",
"alert": "true", "ecb": "onNotification", aeroConfig: aeroConfig});
} catch (err) {
txt = "There was an error on this page.\n\n";
txt += "Error description: " + err.message + "\n\n";
alert(txt);
}
homeView();
$('.home').on('tap', renderHomeView);
$('.feedback').on('tap', renderFeedbackFormView);
}
function successHandler(result) {
console.log("successfully registered with AeroGear push server : " + result);
}
function errorHandler(error) {
console.log("Error in registering with AeroGear push server : " + error);
function onNotification(e) {
showNotification(e.alert);
上面的 app.js 檔案做了下面這些事情:
1. 它綁定了 deviceready 事件。在 deviceready 事件中,我們注冊了 OpenShift 的推送伺服器。它需要下面的配置對象:
1. 對應谷歌項目号碼的 SenderId(發送者 ID)
2. pushSeverURL 指向 AeroGear 推送伺服器位置:
{domain-name}.rhcloud.com/
3. VariantId 是我們在任務 3 所添加的變種辨別。
4. variantSecret 是我們在任務 3 中添加的變種的秘密辨別
2. 成功注冊後,一個處理柄(handler)被調用
3. 如果出現錯誤,錯誤處理柄(error handler)被調用。
4. 通知收到後,onNotification 函數會被調用。它會使用通知插件顯示收到的通過隻。
更新移動應用的 Java REST 後端,以發送要推送的通知
昨天,我們沒有說到應用後段的内容,因為我想把文章聚焦在 PhoneGap 上。我們昨天開發的那個應用有一個運作在 OpenShift 的Java REST 後端。它有一些 REST API。第一個 API 是列出所有的博文,然後創造一個新的博文;第二個 API 是使用者使用者回報的。它是一個非常簡單的 Java EE 6 應用程式。
在我們部署它的後端到我們的雲環境之前,我們還要完成這些任務:
1.在你的機器上安裝
rhc 用戶端工具。rhc 是一個 ruby gem,是以你需要機子上安裝好 ruby 1.8.7 及以上的 ruby。要安裝 rhc,輸入:
sudo gem install rhc
更新 rhc 到最新版本,執行:
sudo gem updatge rhc
如果需要閱讀額外的安裝 rhc 指令行工具時的幫助檔案,可以浏覽:
https://openshift.redhat.com/community/developers/rhc-client-tools-install2.使用 rhc setup 指令設定好 OpenShift 賬戶,這個指令會為你建立一個命名空間,然後上傳你的 ssh keys 到 OpenShift 伺服器上。
為了把移動應用程式後段部署到 OpenShift,輸入下面指令:
$ rhc create-app 30technologies30days jbosseap mongodb-2.2 --from-code https://github.com/shekhargulati/30technologies30days-backend.git
它會執行類似建立一個程式、設定公共 DNS、建立私密 git 倉庫、然後使用 github 倉庫裡的代碼部署應用這樣的任務。應用會部署在:deployed on
http://30technologies30days-{domain-name}.rhcloud.com 。把 domain-name 換成自己的使用者名。
令我們感興趣的代碼是關于,當一篇博文釋出時,應用程式應該釋出一個通知。這個添加在 BlogResource 上。它使用包裝了 AeroGear 推送伺服器的 REST API的AeroGear 用戶端(我今天寫的)。
@POST
@Consumes(value = MediaType.APPLICATION_JSON)
public Response create(Blog blog, @Context HttpServletRequest request, @Context HttpServletResponse response) {
BasicDBObjectBuilder basicDBObjectBuilder = BasicDBObjectBuilder.start("title", blog.getTitle())
.add("url", blog.getUrl()).add("publishedOn", blog.getPublishedOn());
String authorization = request.getHeader("authorization");
if (authorization != null && authorization.startsWith("Basic")) {
// do authorization header check
DBCollection collection = db.getCollection("blogs");
collection.save(basicDBObjectBuilder.get());
aerogearClient.sendMessage("New blog published in 30technologies30days challenge");
return Response.created(null).build();
}
return Response.status(Status.UNAUTHORIZED).build();
}
在上面的代碼中,我們首先從 Blog 對象中擷取所有的資料,然後建立一個 BasicDBObject 對象。這個 BasicDBObject 是會在 MongoDB 中儲存的文檔。如果使用者成功授權了,我們就可以把博文添加到 MongoDB 中。把文檔插入到 MongoDB 中後,我們就發送一個通知給移動應用的使用者。
運作程式
現在,我們可以通過下面指令在裝置上安裝然後運作應用:
$ phonegap run android
這就是今天的内容了,記得保持回報。
接下來
- 線上登入 OpenShift 帳号
- 通過評估 OpenShift 企業版 獲得自己的私有 PaaS(Platform As a Service)
- 需要幫助? 去 OpenShift Community 論壇問問題。
- 在 OpenShift Developer Spotlight 中展示你的酷應用。今天就開始浏覽下 OpenShift 應用展覽