동작하지 않던 상태에 대해서 좀 더 자세히 올려드리겠습니다.
수신된 push notification을 터치하여 안드로이드 기기가 먹통되는 상태를 logcat으로 보면 다음 에러 메시지가 표시됩니다.
E/TiApplication(15137): (main) [191,8679] Sending event: exception on thread: main msg:java.lang.RuntimeException: Unable to resume activity {my.app.id/net.iamyellow.gcmjs.GcmjsActivity}: java.lang.IllegalStateException: APSAnalytics has not been enabled. Call APSAnalytics.getInstance().enable(ctx, key, deploytype) to enable.; Titanium 6.0.3,2017/03/22 12:00,undefined
E/TiApplication(15137): java.lang.RuntimeException: Unable to resume activity {my.app.id/net.iamyellow.gcmjs.GcmjsActivity}: java.lang.IllegalStateException: APSAnalytics has not been enabled. Call APSAnalytics.getInstance().enable(ctx, key, deploytype) to enable.
E/TiApplication(15137): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2976)
E/TiApplication(15137): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3007)
E/TiApplication(15137): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2373)
E/TiApplication(15137): at android.app.ActivityThread.access$800(ActivityThread.java:149)
E/TiApplication(15137): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
E/TiApplication(15137): at android.os.Handler.dispatchMessage(Handler.java:102)
E/TiApplication(15137): at android.os.Looper.loop(Looper.java:135)
E/TiApplication(15137): at android.app.ActivityThread.main(ActivityThread.java:5292)
E/TiApplication(15137): at java.lang.reflect.Method.invoke(Native Method)
E/TiApplication(15137): at java.lang.reflect.Method.invoke(Method.java:372)
E/TiApplication(15137): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
E/TiApplication(15137): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
E/TiApplication(15137): Caused by: java.lang.IllegalStateException: APSAnalytics has not been enabled. Call APSAnalytics.getInstance().enable(ctx, key, deploytype) to enable.
E/TiApplication(15137): at com.appcelerator.aps.APSAnalytics.throwUnlessEnabled(APSAnalytics.java:252)
E/TiApplication(15137): at com.appcelerator.aps.APSAnalytics.sendAppForegroundEvent(APSAnalytics.java:132)
E/TiApplication(15137): at org.appcelerator.titanium.TiBaseActivity.onResume(TiBaseActivity.java:1334)
E/TiApplication(15137): at org.appcelerator.titanium.TiLaunchActivity.onResume(TiLaunchActivity.java:433)
E/TiApplication(15137): at ti.modules.titanium.android.TiJSActivity.onResume(TiJSActivity.java:42)
E/TiApplication(15137): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1241)
E/TiApplication(15137): at android.app.Activity.performResume(Activity.java:6106)
E/TiApplication(15137): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2965)
E/TiApplication(15137): … 11 more
제 소스 코드에서 net.iamyellow.gcmjs 동작에 관계된 부분은 결과적으로 tiapp.xml과 gcm.js 인데요,
Ti SDK 5.x 버전에서 정상적으로 동작했지만 6.x 버전에서 동작하지 않는 설정은 다음과 같습니다.
tiapp.xml
<analytics>true</analytics>
gcm.js
launcherIntent = Ti.Android.createIntent({
className: ‘net.iamyellow.gcmjs.GcmjsActivity’,
action: ‘action’ + ntfId,
packageName: Ti.App.id,
flags: Ti.Android.FLAG_ACTIVITY_NEW_TASK | Ti.Android.FLAG_ACTIVITY_SINGLE_TOP
});
위 에러 메시지에 대해서 검색하다 보니
tiapp.xml에서 analytics 항목을 false로 해야 한다는 내용이 있어서 그렇게 설정을 바꾸었습니다.
제 계정이 인디 계정이라서 analytics 항목이 true로 되어 있어도 앱이 실행되면 자동으로 analytics가 false로 변경되고,
기존에는 동작에 별다른 이상이 없었으므로 신경쓰고 있지 않았던 부분입니다.
변경된 tiapp.xml
<analytics>false</analytics>
tiapp.xml의 analytics 항목을 true로 변경한 후, 앱을 실행하고 push를 보내서 터치하는 경우
- 앱이 백그라운드에 남아있는 경우에는 정상적으로 실행되고,
- 앱이 메모리에서 내려가있는 경우에는 재실행되면서 logcat에서 에러메시지는 출력되지 않는데
앱 내에 사용하던 전역변수를 액세스하지 못하는 현상이 발생합니다.
그래서 이 현상에 대해서 검색하다 보니
gcm.js의 Ti.Android.createIntent() 내에 있는 className을 ‘my.app.id.AppnameActivity’ 형태로 사용해야 한다는 내용이 있어서 그렇게 해당 코드를 그 형식에 맞게 변경했습니다.
변경된 gcm.js
launcherIntent = Ti.Android.createIntent({
className: ‘my.app.id.AppnameActivity’,
action: ‘action’ + ntfId,
packageName: Ti.App.id,
flags: Ti.Android.FLAG_ACTIVITY_NEW_TASK | Ti.Android.FLAG_ACTIVITY_SINGLE_TOP
});
이 상태로 앱을 실행하고 push를 보내서 터치하는 경우
- 앱이 백그라운드에 남아있는 경우에는 디버깅 메시지는 정상적으로 실행되는 것처럼 나오는데 실제 화면은 스플래시 스크린 상태로 멈춰있고,
- 앱이 메모리에서 내려가있는 경우에는 앱이 재실행되긴 하는데 gcm.registerForPushNotifications()에서 콜백으로 설정한 함수가 실행되지 않습니다. 즉 제가 코딩해놓은 동작을 실행하지 않고 앱만 재실행되는 결과가 나옵니다.
여기까지 해봤는데, 이후에 어떻게 진행해야 할지 모르겠네요 ^^