[TITANIUM] ALLOY與GCM的應用

LINEで送る
[`evernote` not found]

alloy_GCM上次「[Titanium]用appcelerator的app management實現Push Notification」中有網友問了如何在titanium中使用GCM(Google Cloud Messaging)。當時還想說卡牌遊戲的案子應該夠我忙一陣子了,想不到這麼快我也碰到這樣的案子。剛好titanium的SDK在升級到3.0跟內建ALLOY後我也沒有好好跟它親近一下,趁這個機會實作完就順便筆記一下吧。
這次的需求是透過corepush這個asp來push廣播。所以先參考了它的說明Google 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

翻了很久才在它的issues中找到先賢做好的titanium module。把它解壓縮放到正確的資料夾(例:/Library/Application Support/Titanium)後,就可以在tiapp.xml中把他掛載起來:

    <modules>
        <module platform="android" version="0.5">com.activate.gcm</module>
    </modules>
    <property name="com.activate.gcm.sender_id" type="string">自己的project id</property>
    <property name="com.activate.gcm.icon" type="int">2130837504</property>
    <property name="com.activate.gcm.component" type="string">gcm.gcm/gcm.gcm.GcmActivity</property>

然後到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] 
}

19 則迴響於《[TITANIUM] ALLOY與GCM的應用

  1. hi~ 謝謝你哦~!!
    我知道原因了!! 是package name的地方沒有改到,也要和application id一樣~~!!!!
    感謝你的提點!!

    • 我今天重新試了一次,到應用程式按強迫停止變不行收到了= =,不知為什麼,
      不過如果關掉程式,把多工內的程式關閉,重新開機手機,再發push notification 都可以收到訊息的(只要沒有到應用程式->點選強迫停止)。

    • 就是卡在這裡@@
      原本還沒改project id前是可以在強制停止後收到push?

      你是用android 4以上的版本嗎?因為我重開機後就收不到了….

      • 未改application ID前:
        先開程式註冊reg id,發送一次push notification 收到成功,關閉多工 收到成功,到「應用程式」裡看app,「執行中」裡是沒有app的,在我的下載裡找到app進入,強制停止鍵可以按的狀態。按下強制停止->失敗未收到。
        再重新開機-> 發送push notification:失敗 未收到。 到 「應用程式」裡看app,會發現「強制停止」是無法按的,也就是還是在「強制停止」狀態就不能收到訊息。

        改application ID後:
        先開程式註冊reg id,發送一次push notification 收到成功,重新開機,開完機未再開程式,發送push -> 成功收到 失敗未收到。

        改application ID前後其實都一樣的情況,只要按下強制停止,就會無法正常運作。

        我是用android 4.0.3 HTC sensation 測試。

        以上是我測試的情形。

  2. 請問用Google-Cloud-Messaging–Titanium- 先賢做好的titanium module ,可以用自己的application id去使用嗎?
    我記得0.3版的要用他指定的application id,除非自己重新產生一次module,不知道0.5版新版還是否需要,謝謝你

    • 我是沒有特別改成自己的application id。
      不過我現在碰到問題是,app在啟動或在背景執行時可以收到push。可是在未啟動狀態下就收不到….
      這樣的push變得很不實用。

      你所說的更改application id是在哪邊?可以解決這樣的問題嗎?是需要用java的src重新包一次module嗎?

      • 我今天試了,程式安裝到手機 好像一定要開啟第一次,之後關掉程式,到應用程式去強制停止再去發notification後,還是有收到通知的@@
        不過以他的module我試改app的application id(就是tiapp.xml裡面),就沒法發佈成功程式,一定要用他的com.activate.mohh為名,除非自己用java的src重包一次module,雖然 他網頁 Steps to create module for Titanium use (https://github.com/liccowee/Google-Cloud-Messaging–Titanium-)有教學怎重包一次,
        但我在裝ANT的步驟就卡關了….
        不知道你會不會包,可以教學指導一下,謝謝你

        • 你是說用它的module如果application id用com.activate.mohh就可以再強制關閉後收到push的通知嗎?
          然後你更改com.activate.mohh就會發佈失敗?我倒是可以發佈成功耶~只是在關閉狀態收不到通知而已

          • 請問你說你改application id可以發佈成功阿(沒有重建module 的狀態)?你改了application id還有改其它的東西嗎?我改了com.activate.mohh 後 發佈就直接錯
            [TRACE] Writing out AndroidManifest.xml
            [DEBUG] /Users/mac/Documents/androidSDK/sdk/platform-tools/aapt package -m -J /Users/mac/Desktop/james/project/titanium/GCMDemo/build/android/gen -M /Users/mac/Desktop/james/project/titanium/GCMDemo/build/android/AndroidManifest.xml -S /Users/mac/Desktop/james/project/titanium/GCMDemo/build/android/res -I /Users/mac/Documents/androidSDK/sdk/platforms/android-8/android.jar
            [ERROR] Error generating R.java from manifest

            我是試過他0.3和0.5版的都一樣@~@a

          • 疑?
            我是改

            <modules>
                    <module platform="android" version="0.5">com.activate.gcm</module>
                </modules>
                <property name="com.activate.gcm.sender_id" type="string">自己的project id</property>
                <property name="com.activate.gcm.icon" type="int">2130837504</property>
                <property name="com.activate.gcm.component" type="string">gcm.gcm/gcm.gcm.GcmActivity</property>

            這邊。我們說的是一樣的事情嗎?
            這裡的「project id」其實是google中的「Project Number」而不是英文的那個id喔

          • 我們說的不一樣,你說的是senderID 是可以依照自己的sender ID 改沒有問題
            我說的是

            2.1.3
            com.activate.mohh
            xxxxx

            這個屬性的id,也就是在tiapp.xml用overview來看裡面的Application Id,
            若不是com.activate.mohh就無法發佈成功

          • tag 被拿掉了
            <sdk-version>2.1.3</sdk-version>
            <id>com.activate.mohh</id>
            <name>xxxxx</name>

          • 你會出錯是不是只有更改
            <id>com.activate.mohh</id>
            這個地方?

            下面還有其他的project id的地方如果都統一的話應該可以吧?

回應已關閉。