# [TITANIUM] ALLOY與GCM的應用

- URL: https://justfly.idv.tw/titanium-alloy%e8%88%87gcm%e7%9a%84%e6%87%89%e7%94%a8/
- 日期: 2013-01-16
- 分類: WEB&amp;RIA
- 標籤: alloy, android, Google App, Titanium

![alloy_GCM]上次「[[Titanium]用appcelerator的app management實現Push Notification](https://justfly.idv.tw/2012/05/02/Just_1197.html)」中有網友問了如何在titanium中使用GCM(Google Cloud Messaging)。當時還想說卡牌遊戲的案子應該夠我忙一陣子了，想不到這麼快我也碰到這樣的案子。剛好titanium的SDK在升級到3.0跟內建ALLOY後我也沒有好好跟它親近一下，趁這個機會實作完就順便筆記一下吧。

這次的需求是透過[corepush](http://core-asp.com/)這個asp來push廣播。所以先參考了它的[說明](http://developer.core-asp.com/gcm.php)到[Google APIs Console](https://code.google.com/apis/console/)新建了一個project。但是到了「Create new Server key」這一步會發現我們的API Access中並沒有像他的圖一樣出現「Create new Server key」的選項。原來它少了到serveice中打開「Google Cloud Messaging for Android」這一個步驟。手動打開後就可以順利取得API Key囉。

但是麻煩的才剛剛開始，corepush第四步提供的是原生的java範例，並不適用於我們的titanium。所以接下來就得去參考[Google-Cloud-Messaging-Titanium](https://github.com/liccowee/Google-Cloud-Messaging--Titanium-)。

翻了很久才在它的issues中找到先賢做好的[titanium module](https://github.com/Guti/Google-Cloud-Messaging--Titanium-/blob/master/dist/com.activate.gcm-android-0.5.zip)。把它解壓縮放到正確的資料夾（例：/Library/Application Support/Titanium）後，就可以在tiapp.xml中把他掛載起來：

```
com.activate.gcm
    
    自己的project id
    2130837504
    gcm.gcm/gcm.gcm.GcmActivity
```

然後到alloy的index.js中實作：

```
var gcm = require('com.activate.gcm');
gcm.registerC2dm({
	success:function(e){
		//alert('Yeah JS registration success event: ' + e.registrationId);
		//alert('Sender ID:' + gcm.getSenderId());
		//alert('Registration ID:' + gcm.getRegistrationId());
		
		var emailDialog = Titanium.UI.createEmailDialog();
		emailDialog.subject = gcm.getRegistrationId();
		emailDialog.toRecipients = ['justfly@justfly.idv.tw'];
		emailDialog.open();
	}
})
```

如此可以得到推播時需要的RegistrationId。然後就可以繼續corepush第五步驟囉！(這邊用EmailDialog只是為了方便在電腦上取得測試機的RegistrationId，測試成功後可以換成自己的處理code。比如把RegistrationId跟使用者id存到資料庫中之類的～）

另外順帶一提在alloy中要固定android的螢幕不讓app隨著手勢旋轉跟隱藏navBar的tss:

```
"#win": {
    exitOnClose: "true",
    navBarHidden: "true",
    orientationModes: [Ti.UI.PORTRAIT] 
}
```
