Ti SDK 6.0 이상에서 net.iamyellow.gcmjs 모듈의 동작이 이상합니다.


#1

안녕하세요?

Ti SDK 6.0 이상에서 net.iamyellow.gcmjs 모듈의 동작이 이상합니다.

GCM 푸시 메시지를 받고, 그 메시지를 사용자가 터치했을 때,
앱이 안드로이드 기기에 백그라운드에 남아있는 경우에는 정상적으로 실행이 되는데,
앱이 메모리에서 완전히 내려가 있는 경우에는 스플래시 스크린 상태에서 먹통이 되네요.
뒤로가기 버튼을 누르면 앱이 응답이 없다고 나오면서 강제로 종료를 해야 되는 상황이 발생합니다.

net.iamyellow.gcmjs 홈페이지에 보면 SDK 6.0 이상에서 동작이 안된다는 댓글이 있는데
net.iamyellow.gcmjs를 개발한 개발자는 서포트를 중단한지 오래되어서 더이상의 지원이 없는 상태입니다.

net.iamyellow.gcmjs 모듈을 사용하시는 분들은 어떻게 해결하셨는지 궁금합니다.


(InGrowth) #2

제가 요즘 바빠서 답변을 못드리고 있습니다.
다음주는 휴가라 다음다음주에나 시도해볼 수 있을거 같습니다.
제가 Parse-server의 Android용 push모듈( https://github.com/gimdongwoo/Parse )도 메인테이닝하고 있으니,
net.iamyellow.gcmjs 모듈도 손대보겠습니다.


#3

신경써주셔서 감사합니다.
다음 주 휴가 잘 보내세요~ ^^


#4

동작하지 않던 상태에 대해서 좀 더 자세히 올려드리겠습니다.

수신된 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를 보내서 터치하는 경우

  1. 앱이 백그라운드에 남아있는 경우에는 정상적으로 실행되고,
  2. 앱이 메모리에서 내려가있는 경우에는 재실행되면서 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를 보내서 터치하는 경우

  1. 앱이 백그라운드에 남아있는 경우에는 디버깅 메시지는 정상적으로 실행되는 것처럼 나오는데 실제 화면은 스플래시 스크린 상태로 멈춰있고,
  2. 앱이 메모리에서 내려가있는 경우에는 앱이 재실행되긴 하는데 gcm.registerForPushNotifications()에서 콜백으로 설정한 함수가 실행되지 않습니다. 즉 제가 코딩해놓은 동작을 실행하지 않고 앱만 재실행되는 결과가 나옵니다.

여기까지 해봤는데, 이후에 어떻게 진행해야 할지 모르겠네요 ^^


(이종은(Jong Lee)) #5

저는 동우님이 참여하고 있는 Parse 모듈을 쓰고 있어서 iamyellow.gcmjs를 안쓴지 엄청 오래되었어요.ㅠ 도움이 되지 못하네요.


#6

그래도 늘 감사드립니다.
오늘도 좋은 하루 보내세요 ^^


#9

어제 밤에 Ti 6.0.x 마이너 버전을 바꿔가면서 테스트하던 중에 6.0.3.GA에서만 안되는 줄 알았는데,
6.0.1.GA, 6.0.2.GA 모두 정상적으로 동작하지 않는 것이 맞습니다.


(InGrowth) #10

gcm.js를 tdtsh가 메인테이닝하고 있었는데요,

13일전에 m1ga가 Ti 6 업데이트를 PR을 보냈어요.

머지되어 있으니 이걸로 한번 테스트 해보세요~

https://github.com/tdtsh/gcm.js/blob/master/dist/net.iamyellow.gcmjs-android-1.0.zip?raw=true


#11

감사합니다.
net.iamyellow.gcmjs 모듈이 계속 관리되고 있어서 기쁩니다.
테스트 해보겠습니다~ ^^


#12

테스트 해보니 제가 겪었던 문제가 해결되지는 않았네요 ^^


(InGrowth) #13

역시 오래된 코드상에 문제가 있나보네요.
제가 디버깅 해볼게요.


#14

신경써주셔서 감사합니다.

좋은 밤 되세요~ ^^


(InGrowth) #15

마무리하고 PR을 날렸습니다.

발견하신데로, analytics는 false로 해야 동작합니다.

패키징된 모듈은 여기에서 받으실 수 있습니다.
https://github.com/gimdongwoo/gcm.js/tree/Titanium6/android/dist


#16

늦은 시간까지 고생 많이 하셨습니다.
정말 감사드립니다. ^^