承繼之前在「[TITANIUM] ALLOY與GCM的應用」中使用Google-Cloud-Messaging-Titanium來實現android與接收GCM的訊息後。隨之而生的問題是當我們在「啟動一次app,保持在背景動作的情況下重新開機後」就收不到push了。
雖然也有網友使用0.6版可以解決問題,只是我從0.2版用到0.6版,收不到就是收不到@@
看了Google-Cloud-Messaging-Titanium的issues後,有很多人都主張重組模組。但是一開始當看到官方說明,一張落落長要安裝的工具就頭皮發麻….
不過經過測試,發現問題在於當app啟動時,C2dmModule.java,CommonUtilities.java,GCMIntentService.java會被註冊到service中。當service停止時GCM模組的Instance就被丟棄,所以GCMIntentService.java中
137 138 139 | if (C2dmModule.getInstance() != null){ C2dmModule.getInstance().sendMessage(data); } |
就無法被執行。
解決的辦法是把他改寫成:
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | if (C2dmModule.getInstance() != null){ C2dmModule.getInstance().sendMessage(data); }else { NotificationManager mManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); Notification n = new Notification(); Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("Justfly://tw.idv.justfly")); PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0); n.icon = 2130837504; n.tickerText = messageArr[0]; n.number = 1; n.flags = 1073741824; n.defaults |= Notification.DEFAULT_VIBRATE; n.setLatestEventInfo(getApplicationContext(), "Justfly", messageArr[0], pi); mManager.notify(1, n); Vibrator vib = (Vibrator)getSystemService(VIBRATOR_SERVICE); vib.vibrate(500); } |
然後….還是要重祖一次模組@@
重組方式可以參考Google-Cloud-Messaging–Titanium- モジュールを作る跟官方說明。我只列一下我在重組時碰到的問題跟解決方式:
- ERR:Compile failed; see the compiler error output for details.You may need to install the Command Line Tools package through XCode, in case you haven’t done so yet的錯誤訊息。
ANS:可以參考這篇的回答去安裝Command Line Tools for Xcode跟重新命名模組專案。但是我後來是用命令列下ANT指令才解決。 - ERR:Compile failed; see the compiler error output for details.You may need to install the Neither the ANDROID_NDK environment variable, or the android.ndk property is not set to an existing Android NDK installation (check your module’s build.properties)的錯誤訊息。
ANS:除了把Android NDK下載回來外,記得到build.properties加入:
android.ndk=/Users/justfly/Documents/android-ndk-r8d
指定ndk的位置
原本我一直覺得很怪的是,我明明是要做android的模組,為何他一直要我安裝xcode的Command Line Tools!?但是後來在titanium studio中的命令列中用ant指令來執行成功一次之後,那個錯誤訊息就不見了。目前依然..原因不明…..
(Photo via 1uplego, CC License)
第一個Err應該是給gperf用的
原來titanium也有用到gperf阿!謝謝囉~