上次「[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] } |
我們在fb開了一個有關titanium的台灣社團,歡迎你一起加入研究討論~
https://www.facebook.com/groups/136963136473265/?notif_t=group_added_to_group
好阿~還請多多指教^^
hi~ 謝謝你哦~!!
我知道原因了!! 是package name的地方沒有改到,也要和application id一樣~~!!!!
感謝你的提點!!
不會啦~
所以你現在有解決停止後無法收到push的問題嗎?
我今天重新試了一次,到應用程式按強迫停止變不行收到了= =,不知為什麼,
不過如果關掉程式,把多工內的程式關閉,重新開機手機,再發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 測試。
以上是我測試的情形。
請問用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
疑?
我是改
這邊。我們說的是一樣的事情嗎?
這裡的「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>
這個地方一定會換的阿!
我是在建project的時候就已經設好了。
對 一定會換,所以換了就要重新打包一次他的module才可以使用:(
可是我看他的
https://github.com/liccowee/Google-Cloud-Messaging–Titanium-/tree/master/src/com/activate/gcm
中的三個檔案也沒有出現com.activate.mohh的字串阿
那要在哪邊加入自己的project id?
你會出錯是不是只有更改
<id>com.activate.mohh</id>
這個地方?
下面還有其他的project id的地方如果都統一的話應該可以吧?