天天看點

Day 11: AeroGear 推送伺服器:使應用的通知推送變得簡單

在今天的 “30天學習30種新技術” , 我打算去擴充一下 昨天

開發的 PhoneGap 應用,加上推送通知的功能。推送通知允許應用去通知或者警告使用者,即使是在程式沒有打開的情況下。例如,如果我們有一個允許通知推送的 Twitter 應用,當 Twitter 上有人提到你或者關注你了,Twitter 應用也會推送一個通知給你,即使這個應用沒有在運作。

幾周以前,我讀到一篇

Jay Balunas 寫的一篇 很有啟發的文章 , 是關于如何在 OpenShift 上使用 AeroGear 設定通知推送伺服器的。在那時候,我還沒用過 AeroGear OpenShift 工具,但今天我們可以把它添加到我們昨天開發的閱讀器中,以實作通知推送的功能。
Day 11: AeroGear 推送伺服器:使應用的通知推送變得簡單

什麼是 AeroGear 統一推送伺服器(UnifiedPush Server)?

AeroGear 統一推送伺服器

是一個 Java 寫的能夠給不同的移動平台推送通知的開源伺服器端程式。它可以被看作成一系列不同的通知推送技術的抽象。現在的版本支援

蘋果的 APNs

Google Cloud Messaging

Mozilla 的 SimplePush

移動應用用例(Mobile Application Usecase)

今天我們要開發的移動應用是一個為

開發的閱讀器。使用者可以在任何 Android、Symbian、webOS、或者 Windows Phone 裝置上安裝這個應用。你可以在這裡

下載下傳

應用可以做下面這些事情:

1.把所有的博文以清單形式展示出來,當使用者點選博文時,在浏覽器打開相應連結。

Day 11: AeroGear 推送伺服器:使應用的通知推送變得簡單

2.使用者可以通過這個應用回報他們對這個系列的想法。

Day 11: AeroGear 推送伺服器:使應用的通知推送變得簡單

3.我們在

就已經做好了前兩個功能。今天,我們要增加一個功能:每當一篇新的博文發出來時,使用者都會收到一個通知。

Day 11: AeroGear 推送伺服器:使應用的通知推送變得簡單

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 端控制台
Day 11: AeroGear 推送伺服器:使應用的通知推送變得簡單

點選"建立你的第一個應用程式" 然後選擇 AeroGear Push 0.X 應用類型

Day 11: AeroGear 推送伺服器:使應用的通知推送變得簡單

這個頁面要求我們輸入應用程式的詳細資訊。這是一個 OpenShift 的快速開始,所有的配置都已經自動為我們設定好了。選擇預設的值,然後按下 "建立程式" 按鈕

Day 11: AeroGear 推送伺服器:使應用的通知推送變得簡單

在應用程式建立之後,我們可以在

http://aerogear-

{domain-name}.rhcloud.com 看到 AeroGear 伺服器的運作,這裡的 domain-name 就是你注冊 OpenShift 時的 domain-name。

打開,

{domain-name}.rhcloud.com ,我們會被要求登入 AeroGear 伺服器。預設的帳号/密碼是 "admin/123"。在成功登入之後,你會被提示修改你的登入密碼

使用新的證書成功登入後,我們可以看到 AeroGear 儀表闆。

Day 11: AeroGear 推送伺服器:使應用的通知推送變得簡單

現在,我們可以建立第一個使用者給我們的移動應用推送資訊的程式了。點選建立按鈕,然後輸入應用的細節。

Day 11: AeroGear 推送伺服器:使應用的通知推送變得簡單

在應用建立之後,我們可以看到應用的詳細細節。需要我們特别留意的是應用程式的 ID 和 主密碼(Master Secret)

Day 11: AeroGear 推送伺服器:使應用的通知推送變得簡單

注冊一個 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)

Day 11: AeroGear 推送伺服器:使應用的通知推送變得簡單

按照提示輸入細節,然後點選建立按鈕。記得輸入你在任務 2 中獲得的 Google API 密匙和項目号碼。

Day 11: AeroGear 推送伺服器:使應用的通知推送變得簡單

在移動應用中,增加通知推送的支援

使用 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-install

2.使用 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​

這就是今天的内容了,記得保持回報。

接下來