'GCM'에 해당되는 글 2건

  1. 2015.12.21 [ionic] Android 호환성
  2. 2015.08.26 하이브리드 아키텍처

[ionic] Android 호환성

모바일 2015. 12. 21. 17:59

이번에는 Android와 관련된 내용입니다.


1. cross-walk, User-Agent 관련

이건 이전 글로 대체합니다.

http://resisa.tistory.com/170


2. 푸시 관련

여러가지 푸시 플러그인이 있는데 저는 아래 플러그인으로 최종 선택하였습니다.

아래 플러그인이 사용도 가장 심플하고 다른 플러그인에서 안되는 기능도 됩니다.

https://github.com/Code1Tech/phonegap-plugin-push


푸시에서 GCM토큰을 받아오는 초기화 코드의 경우 앱 실행 타이밍과 연관이 있습니다. 입이 실행 되자마자 해당 초기화 코드가 실행되면 토큰을 정상적으로 가져오지 못합니다. 그래서 setTimeout()를 사용하여 2.5초 정도의 딜레이를 주고 실행시키고 있습니다. 2초정도로 했을 경우 특정 디바이스에서 토큰을 받아오지 못하는 현상이 있어 해당 시간을 늘렸습니다.


요구사항 중 앱이 실행 중인 경우에도 푸시가 왔으면 좋겠다는 의견이 있었습니다. iOS 푸시에서는 앱이 실행 중일 때는 푸시가 올 수 없습니다. 그래서 일반적으로 iOS에서는 앱이 실행 중일 경우 푸시가 오는 것처럼 앱내에서 구현을 해주고 있습니다.

여튼 안드로이드에서 앱이 실행 중일 경우 푸시가 오도록 하려면 위의 플러그인을 사용하여야 하며 아래 코드를 추가해주어야 합니다.


- GCMIntentService.java

@Override  

 public void onMessageReceived(String from, Bundle extras) {

            // if we are in the foreground and forceShow is `false` only send data

            if (!forceShow && PushPlugin.isInForeground()) {

                Log.d(LOG_TAG, "foreground");

                extras.putBoolean(FOREGROUND, true);

                PushPlugin.sendExtras(extras);

            }

            // if we are in the foreground and forceShow is `true`, force show the notification if the data has at least a message or title

            else if (forceShow && PushPlugin.isInForeground()) {

                Log.d(LOG_TAG, "foreground force");

                extras.putBoolean(FOREGROUND, true);

                PushPlugin.sendExtras(extras);

                showNotificationIfPossible(getApplicationContext(), extras);

            }

            // if we are not in the foreground always send notification if the data has at least a message or title

            else {

                Log.d(LOG_TAG, "background");

                extras.putBoolean(FOREGROUND, false);


                showNotificationIfPossible(getApplicationContext(), extras);

            }

    }


3. ThemeableBrowser Plugin

iframe내에 링크가 걸려 있을 경우 인앱브라우저 화면에서 아무런 버튼도 보이지 않는 현상이 있습니다. 직접 해당 플러그인을 사용하는 코드에서는 상관없지만 iframe내의 링크의 경우에 해당하는 내용입니다. 아래처럼 자바 코드에 close관련된 부분만 변경하여 넣어줬습니다.

 public boolean execute(String action, CordovaArgs args, final CallbackContext callbackContext) throws JSONException {

            final Options features = parseFeature("{ closeButton: { image: 'close', imagePressed: 'close_pressed', align: 'right', event: 'closePressed'}}");

}


4. MenuButton 관련

Android에서는 메뉴 버튼과 뒤로 가기 버튼이 있어 해당 부분에 대해서도 신경을 써줘야 합니다. 아래 링크로 대신합니다. 메뉴 버튼의 경우 기기에 따라서 다르게 동작합니다.


- CordovaWebViewImpl.java

https://forum.ionicframework.com/t/android-hardware-menu-button-not-working-with-cordova-5-1-1-and-ionic-1-1-0/33128/3



Posted by resisa
,

작심 3일로 끝나버릴까봐 더 늦기 전에 다음 진도를 나가봅니다.

구성도는 아래와 같습니다.

  • FrontEnd
    • 이전에 글에 썼던 것처럼 nodejs 기반으로 뷰에 대한 렌더링이 클라이언트에서 된다고 생각하시면 됩니다.
    • Ionic Framework는 AngularJS와 Sass기반으로 구현되어 있습니다. Ionic을 단순하게 말하면 UI Framework라고 생각하시면 됩니다. CSS기반으로 작성된 앱스럽게 보이는 컨트롤 및 자바스크립트를 제공해준다고 생각하시면 됩니다.
    • 모바일 웹에서는 모바일 디바이스 API(디바이스 정보, 카메라 기타 등등)에 접근하는 것이 어렵지만(불가능?) 하이드리드 앱에서는 이러한 부분을 Apache Cordova를 통해서 가능하게 해줍니다. Cordova 디바이스 API는 플러그인 형태로 제공되며 추가적인 플러그인(PushPlugin 등등)도 Github에 공개되어 있습니다.
    • ngCordova는 AngularJS 컨트롤러에서 Cordova 디바이스 API를 사용하기 쉽게 확장해둔 라이브러리라고 생각하시면 됩니다.
    • Ionic Material은 Google Material 디자인처럼 Ionic 컨트롤을 확장한 라이브러리라고 생각하시면 됩니다.
      참고 https://www.materialup.com/
    • FrontEnd는 atom으로 코딩을 하고 gulp로 빌드를 해서 개발을 진행하고 있습니다.
      참고 : http://programmingsummaries.tistory.com/356

  • BackEnd
    • 서버는 Web API로 json 데이터를 제공해줍니다. Nancy로 구현하였는데 Nginx에도 올릴 수도 있다고 해서 다른 프로젝트에서 적용을 해보았는데 특별한 문제는 없고 IoC부터 라이팅 규칙 작성도 쉽고 직렬화 등 라이브러리 교체와 같은 부분들이 쉽게 되어 있습니다.
    • 보통 .NET에서는 직렬화 라이브러리로 JSON.NET를 많이 사용하는데 ServiceStack.Text(4.0이상은 유료입니다;;)가 성능이 제일 괜찮다고 하여 사용해보았습니다. 이전에 말한 것처럼 Nancy에서는 라이브러리 교체가 쉽게 때문에 문제가 생기면 바로 교체를 하려고 했었는데 크게 문제는 없었습니다.(json 데이터 파일을 읽다가 공백과 관련된 버그는 있었습니다.) 아 또 한가지 CSV와 JSV 다양한 데이터 포맷을 제공합니다. 동일 주소를 호출을 하여 다양한 포맷으로 데이터를 받을 경우(Content Negotiation)에 활용하면 괜찮습니다.
    • PushSharp은 GCM, Apns 기타 등등과 관련된 푸쉬 서비스에 대한 프로바이더입니다. GCM에 쏘는건 실제로 Http Post방식으로 쏘면 되는거라 어렵지 않아 굳이 쓸 필요까지는 없었는데 저는 오픈 소스를 사랑하기 때문에 ^^; 소스도 볼겸 사용해보았습니다.
    • SignalR은 실시간(양방향) 통신이 필요할 경우에 사용하려고 고려만 해둔 상태입니다.
      참고 : 
      초록색으로 표시한 부분은 직접 구현한 부분들이 아닌 외부와의 연동을 의미합니다.

  • GCM(Apns)
    • 푸쉬 서비스를 사용하는 이유는 앱이 실행중이지 않더라도 알림을 받으려고 하는 것입니다. 디바이스에서 먼저 GCM Service에 등록을 해줘야 하며 등록하는 과정에서 Token를 받습니다. 이러한 Token은 사용자별로 푸쉬 프로바이더로 전송을 해줘서 저장을 해줘야 합니다. 푸쉬 프로바이더에서는 저장된 Token을 사용하여 메세지를 GCM Service로 보냅니다. GCM Service에서는 받은 메세지를 디바이스로 보냅니다.
    • PushSharp에서는 GCM, Apns에 대한 구현이 각각 되어 있었는데 보통 아이폰은 Apns를 안드로이드폰은 GCM를 사용합니다. GCM 3.0부터는 등록 프로세스를 간소화하여 아이폰, 안드로이드폰, 크롬까지 지원을 합니다.
    • GCM를 사용하더라도 Apns에 인증을 하는 절차를 거쳐야 합니다. 실제로 GCM Service에서 Apns에 인증만 받는 건지 아니면 중간 역할을 해주는 건지는 확실하지 않지만 등록 프로세스를 간소화를 통하여 GCM의 Topic과 Device Group를 사용하기 위함입니다. 관련 내용은 슬라이드를 보시면 아실 수 있을 겁니다~ ^^

아직까지도 보여줄 코딩한줄이 없네요 ㅎㅎ;; 블로그질을 오랫만에 하니 시간을 은근히 잡아먹네요 ㅜㅜ
다음에는 GCM 3.0의 등록 프로세스 간소화를 위한 iOS와 관련된 설정 및 코드로.........


Posted by resisa
,