使用Android Studio、Google App Engine建置雲端訊息推撥(GCM) (一)

作者 | 2016-06-05
分享給朋友:

 

一個應用程式若需要後台提供雲端訊息、資料儲存、查詢、運算時,需要建置伺服器並設計服務程式,而後台可使用JSP、PHP、ASP、Node.js或AngularJS等語言開發服務,但建置後台的成本不算低。Google的App Engine平台是一個雲端應用程式平台,可以降低初始成本,以風險最低的方式實作出產品後台系統。本篇將以雲端訊息(Google Cloud Messaging)為例,介紹如何使用Android Studio建立具有App Engine後台模組的專案,並送上雲端讓它成為服務手機APP的雲端服務。

Google App Engine for Java

「Google App Engine for Java」服務是一個提供網頁系統執行的平台,簡稱為「GAE」,與傳統的主機代管或是網頁代管不同的是,它提供了雲端服務的特色與資料儲存技術的優點。舉例來說,過去若有一組開發人員設計出一個商用網頁系統,他們會去租用一個虛擬主機或網頁空間,並安裝必要的應用程式伺服器(如Tomcat或WebLogic等)與資料庫管理系統(DBMS,如SQL Server、MySQL或Oracle等),再將網頁系統佈署到環境上,經過嚴格測試後再上線服務。但是,未來若此網頁系統受到大眾喜愛,而原始的環境已無法負荷現在的需求時,就要再運用如叢集(Cluster)或負載平衡(Load balancing)等技術,將多台已設定完成的主機合併服務,以達成現在或未來所需的運算能力。這些都將付出極高的成本,更不用說在建置期間所付出的時間成本,很可能會因此失去客戶群或被競爭者所趕上與超越。

GAE是一個網頁系統的服務,供開發人員將網頁系統佈署至平台上,並馬上提供服務的雲端網頁服務平台。它具備了Java執行環境、資料儲存、應用程式管理服務,如下圖:

img-912

對於開發人員,Google提供了開發與除錯工具,可讓開發人員能夠更快速地調整網頁系統的功能,並進行除錯與測試。可使用了Eclipse加裝外掛或是目前最熱門的「Android Studio」整合開發工具,提供GAE程式開發與除錯測試平台。在開發測試完成後,亦能將網頁系統直接佈署至GAE上,成為產品並上線服務。由於Google目前全力往自己參與開發的Android Studio,本篇內容所使用的環境為Android Studio 2.1。

一般來說,使用GAE需先在Google主控台網頁介面中申請,再依其規定步驟建立雲端GAE專案,若要在專案中使用Google Cloud Messaging(簡稱GCM)的功能則需要再產生一組GCM的API金鑰,開發者再把金鑰放在Android專案的特定地方,還要為專案加入權限、函式庫等繁複的工作。這些耗費精神的功夫往往成為熱誠的殺手,因此在2016年,Google在Android Studio中提供更方便、快速的流程,能夠迅速建立支援GCM的後台模組。

建立後台模組(backend)

請在現有的Android專案中點擊功能表的「File/Project Structure」開啟專案設定對話框,在對話框中點擊左上方的加號,建立一個新的模組,如下圖:

A6194

出現模組建立畫面中選擇「Google Cloud Module」雲端模組,再進入下一步驟,如下圖:

A6196

在模組設定畫面中,下拉「Module type」選擇「App Engine Backend with Google Cloud Messaging」,代表將新增一個支援雲端訊息的後台模組,再將「Package name」設定為合適的名稱,如「com.litto.firechat.backend」,為了方便管理,可以在Android專案的套件名稱後補上「.backend」代表是後台專用的類別庫,如下圖:

A6202

專案建立後會自動切換專案視圖為「Project」,以便展示後台模組的資料夾路徑結構,如下圖箭頭處:

A6204

提示: 若要回Android開發視野,可下拉改選回「Android」。

後台模組的名稱預設為「backend」,也可以視需求在上一個步驟中命名不同的模組名稱,其目錄架構如下圖:

A6205

在backend中的「src/main/java/套件名稱/」下已自動產生幾個Java類別,它們是為了能夠達到GCM的app server角色的兩大工作,一為「設備註冊」,另一個則是「訊息傳送與接收」,文章的後續會介紹這兩個重要的工作,但目前,我們的後台伺服器模組已經可以在本機運作並測試。

App server在GCM中的角色

在GCM架構中需要一個由開發人員所建立的應用程式伺服器,稱為「app server」,負責傳送與接收回應資料,如下圖:

A6231

由於架設一台app server的成本較高,想要落實、實作一個創意前就要花費大量的預算,所以,我們才建立一個GAE雲端後台模組backend,它的角色就是app server,如下圖:

A6232

App server另一個重要的工作是讓手持設備能夠向它註冊,手持裝置先向Google回報它目前是能夠運作的,之後Google會發給每個手持裝置一個辨識用的「Registration Id,簡稱RID」,裝置再將RID傳送至app server,server將這個RID儲存在後台資料庫中,待未來需要傳送雲端訊息時,在訊息中需要附上對象裝置的RID。將RID傳送至app server的工作稱為註冊(Registration),如下圖:

A6233

這些流程是完成雲端訊息的要件,缺一不可,當然,還必須有一個最重要的-「金鑰(Key)」,需要先有一個Google帳號(Gmail或Google+都可以),使用Google帳號建立雲端專案後,再啟用GCM API,並在雲端專案下產生一個伺服器金鑰,並放在backend模組中,有了金鑰才能夠傳送雲端訊息,流程才會完備。

取得GCM金鑰

在之前產生backend模組後,Android Studio會自動開啟模組中的「src/main/webapp/WEB-INF/appengine-web.xml」,這是一個GAE專案的主設定檔,其中有兩個資訊需要填入,一是雲端專案的「application id」應用程式ID,另一個就是GCM金鑰「gcm.api.key」,如下圖:

A6234

Google今年(2016)開始以較貼心的方式協助開發人員取得並產生金鑰,在appengine-web.xml的中間有一段註解(灰色)的資訊,其中有一段網址,如下圖:

A6207

請複製該行完成的網址後,在瀏覽器中貼上,自動會進行專案建立、產生金鑰的步驟,若未登入Google帳號,請先登入,如下圖:

A6208

請按下上圖的「繼續」,會自動產生一個名為「My Project」的雲端專案,而且會自動在此專案中啟用GCM API,只需按下「前往憑證」,如下圖:

A6209

進入憑證產生功能頁面時,也會自動產生伺服器金鑰,如下圖:

A6210

同樣的,按下「建立」即可,金鑰建立完成後會出現如下的對話框:

A6211

請複製上圖中的API金鑰,再按下「確定」即完成金鑰申請的工作了。回到Android Studio中,將複製的API金鑰貼在原本的「YOUR_KEY_HERE」的位置,如下圖:

A6212

取得雲端專案的application id

接著請回剛才申請的網頁畫面中,按下左上方的功能總覽圖示,如下圖箭頭處:

A6216

再點擊「IAM與管理員」,如下圖:

A6214

請再點擊左方「設定」後,在右方顯示的「專案ID」下方就是雲端專案的ID,請複製它,如下圖:

A6218

再次回到Android Studio中,將複製的專案ID貼在appengine-web.xml內的「application」元素內,如下圖:

A6220

此時已完成backend模組的必要設定,儲存檔案後可以在本機中執行backend模組,請點擊上方功能圖示中的模組下拉選單(下圖箭頭處),選擇「backend」模組後,再按下旁邊的執行圖示,以執行backend,如下圖:

A6221

backend模組是一個傾聽8080埠的伺服器,若出現防火牆警示對話框時,請按下允許存取,如下圖:

A6222

成功執行後,在下方的訊息視窗顯示目前本機8080埠號網址「http://localhost:8080」,如下圖:

A6224

點擊該網址後,以瀏覽器開啟backend模組所設計的測試頁面,其中輸入方塊中可輸入訊息後,按下右方的Send Message傳送,如下圖:

A6226

到目前,我們的backend模組雖然能夠傳送雲端訊息,但手持裝置端的APP並未到backend後台註冊它的RID,還需要在Android APP中設計必要的程式碼。目前完成如下圖的實線箭頭,未完成的為虛線:

A6235

煩瑣的工作到此總算告一個段落了,接下來重要的是:

  1. 到底backend模組產生什麼了?
  2. Android APP要如何取得RID並呼叫backend模組?
  3. 要如何成為雲端服務,不需要後台伺服器?

下一篇文章將介紹這些知識與程式碼的設計。

 

相關文章:

使用Facebook直接回應

4 thoughts on “使用Android Studio、Google App Engine建置雲端訊息推撥(GCM) (一)

  1. 路人

    我同事反應“而後台可使用JSP、PHP、ASP、Node.js或AngularJS等語言開發服務”,這句話中的或字邏輯有問題。

    回覆
  2. 安迪

    您好
    看過作者您的文章後,感覺受益良多且非常期待您GCM的後續內容教學,希望您能撥空更新,謝謝您。
    如您文末提到的
    1.到底backend模組產生什麼了?
    2.Android APP要如何取得RID並呼叫backend模組?
    3.要如何成為雲端服務,不需要後台伺服器?

    回覆
    1. Hank Tom 文章作者

      我想我要先抱歉文章還未能延續,其實是有原因的,當然也是因為我身上的專案太多。
      第一點 “backend模組產生什麼了?”,已寫好了,只是當要繼續時,遇到了我想聊到的Google Cloud Endpoint,它主要是以POJO的JavaBean能快速設計後端的服務機制(https://cloud.google.com/appengine/docs/java/endpoints/)
      雖然在我的許多專案中都有使用了這個機制,但考量讀者可能並沒那麼熟悉Java的情形下,我想用比較好的方式描述,它不好寫,所以就暫先放著,想等比較有靈感時再來設計學習流程,再加上Firebase改版、專案等工作,就變成懸在那了。
      但我預估,下星期會有個小空檔,應該就能完成它的延續內容了。

      回覆

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *