이번 글에서는 앞서 GCM을 이용하기 위한 초반 작업을 완료하고 안드로이드에서 작업 하는 과정을 정리 하겠습니다. 사용 툴은 안드로이드 스튜디오를 이용하였습니다.
우선 다운 받은 google-services.json 파일을 복사해서 저희 프로젝트에 가져옵니다.
저는 app 아래에 복사를 하였습니다.
그리고 bulid.gradle 파일을 수정합니다. 2개가 있는데 하나는 프로젝트 용 하나는 모듈 용입니다.
일단 프로젝트 gradle을 수정합니다.
제가 작업할때는 사진의 빨간 네모 안의 안의 버전으로 작업을 했는데 이 글을 보고 작업하실 때 시점에 맞는 적절한 버전으로 선택하여 바꿔주시면 됩니다.
이번엔 모듈 gradle을 수정합니다.
제가 작업할때는 유니티에 붙일 라이브러리로 만들기 위해서 주석이 된 부분이 있고 한대 안드로이드 기준만으로 말씀 드리면..
첫번째 빨간 네모 박스에 apply plugin: ‘com.android.application’을 추가하시면 됩니다.
아래의 com.android.library는 삭제하시면 됩니다. 저건 라이브러리를 만들려 할때 하는 옵션입니다..
두번째 빨간 네모 박스안에도 주석 되있는 것들 다 주석 해제 해주시면 됩니다. (적고 보니 아마 그냥 하시던분들은 주석이고 할 것 없이 알아서 되 있겠네요;;)
dependencies 안에 나머지는 신경쓰지 마시고 빨간 네모 박스 2개
compile “com.google.android.gms:play-services:8.3.0” 와, com.android.support:appcompat-v7:23.4.0”을 추가해줍니다.
이 두개 또한 현재 시점에 맞는 적절한 버전을 선택 해 주시면 됩니다.
이번엔 AndroidManifest.xml 파일을 수정하겠습니다.
빨간 네모 박스들의 내용을 AndroidManifest.xml 파일 안에 추가해줍니다.
설명을 해드리자면
com.google.android.c2dm.permission.RECEIVE 은 메세지 수신과 ID 등록을 가능하게 해주는 퍼미션입니다.
android.permission.WAKE_LOCK 은 메세지를 받았을때 기기를 깨울 수(폰이 꺼져있을때 화면이 켜지는..) 있도록 합니다.
그리고 GCM이 발송한 메시지를 처리하기 위해서 GcmReveiver 라는 리시버를 선언합니다.
그 안에는 또 필요한 퍼미션을 설정해주는데 com.google.android.c2dm.permission.SEND 퍼미션을 추가해 주어야 합니다. 그리고.. 인텐트 필터 안에 액션, 카테고리 설정해 주시구요..
(인텐트 필터는 짧게 말하면 인텐트 객체를 이용해 인텐트를 처리할때 객체에 들어 있는 정보를 이용하여 가장 적절한 컴포넌트를 찾는데 각 컴포넌트 안에 자신이 받을 수 있는 인텐트의 종류를 뜻하는 액션이나 카테고리와 같은 조건을 manifest파일에 저장하는데 이것이 인텐트 필터입니다. )
그리고 서비스를 설정해줍니다.
MyGcmListenerService은 서버에서 푸시를 보내면 수신하여 처리하는 부분입니다.
MyInstanceIDListenerService 각 디바이스마다 토큰이라고 하는 고유 값이 생성되는데 이러한 토큰의 신규 발급, 순환, 업데이트가 발생될때 처리하는 부분입니다.
RegistrationIntentService 토큰을 생성하는 부분입니다.
그 외의 푸시 진동이라던지 다른 퍼미션은 안드로이드 퍼미션 검색하셔서 추가하실거 더 추가 하시고 하면 됩니다.
이제 설정 부분은 끝이 났습니다.
이제 코드를 작성해 보겠습니다.
총 4개의 클래스 파일이 있습니다. MainActivity, MyGcmListenerService, MyInstanceIDListenerService, RegistrationIntentService
MyGcmListenerService 부터 보겠습니다.
onMessageReceived 함수에서 json형태로 푸시 메시지 수신을 받게 됩니다.
매개변수 from은 해당 푸시 메시지의 종류 구별이라고 하면 될것 같습니다. 이 메시지가 특정인에게 보내는거냐, 모두에게 보내는거냐 등등의 구별이라고 보시면 될 듯 합니다. 저같은 경우는 /topics/notice 라고하는 공지사항의 토픽을 하나 등록 했습니다. 나중에 다른 클래스에서 등록 하는 법도 보여드리겠습니다.
그리고 data에는 title이라고하는 메시지의 제목과, message라고 하는 메시지 내용을 받아오게 됩니다.
그리고 sendNotification 함수에서 pendingIntent와, NotificationCompat을 이용하여 디바이스에 메시지 알림을 처리해줍니다.
NotificationCompat을 설정할때 좀 더 다양한 효과를 하시고 싶으시면 옵션을 추가해주시면 됩니다.
이번엔 MyInstanceIDListenerService를 보겠습니다.
MyInstanceIDListenerService은 토큰이 갱신될 때 마다 onTokenRefresh가 호출되어 토큰의 교체를 담당하는 부분입니다.
보시면 인텐트를 통해 RegistrationIntentService 을 실행하고 여기서 토큰의 생성을 진행하게 됩니다.
이번엔 RegistrationIntentService를 보겠습니다.
여기선 토큰이라고 불리는 디바이스 마다 제공되는 고유의 주민등록번호?라고 보면 될것 같은데.. 아무튼 토큰을 생성합니다.
우리는 이 토큰을 이용해서 해당 디바이스에 푸시 메시지를 보낼수 있습니다.
우선 위에 sendid 값은 제가 임시로 적어논겁니다 . ㅋㅋ 원래는 저런 값이 아닙니다.
토큰을 생성하기 위해선 SENDID가 필요한대 우리는 전 과정에서 구글에 프로젝트를 생성할때 Sender ID라고 하는 값을 제공 받았습니다. 바로 이 값입니다.
만약 google-services.json을 잘 복사하여 프로젝트에 가져 오셧다면 R.java 파일에 defaultSenderId라고 하는 스트링 값으로 저장되어 있을겁니다. 그렇게 해서 가져오셔도 됩니다.
이 값을 통해 서버로 전송하여 토큰을 제공 받습니다.
만약 이러한 토큰을 따로 관리하는 서버가 있다면 토큰값을 받아 온 후 서버로 토큰값을 보내어 저장하면 되겠죠.
그리고 GcmPubSub 를 이용하여 앞서 말한 from 즉 해당 메시지의 종류 구별을 지정 할 수 있습니다.
마지막으로 MainActivity를 보겠습니다.
MainActivity 입니다. 맨 처음 UnityPlayerActivity는 제가 유니티와 연동하여 사용해볼려고 했던 터라 저런거고 본래 안드로이드라면.. 뭐 기본적인 액티비티 상속 받고 있을테니 신경 안쓰셔도 됩니다.
빨간 네모 부분을 보시면 될 것 같습니다.
MyInstanceIDListenerService는 이미 GCM의 토큰을 한번 발급받은 상태에서 다시 갱신이 이루어지거나 하면 RegistrationIntentService을 호출해서 토큰을 생성하는 부분이므로 최초에 한번은 GCM의 토큰을 우리가 수작업으로 한번 발급 받아야 합니다.
그래서 onCreate함수 안에서 앱이 처음 실행될 시에 RegistrationIntentService를 호출하여 토큰을 생성합니다.
그전에 checkPlayServices 함수를 호출하여 해당 디바이스가 Google Play Services 가 동작하는 환경인지를 확인하는 역할을 합니다. Google Play가 설치되어있지 않다면 여기서 오류가 날 것입니다.
이곳에서 최초 한번 RegistrationIntentService를 호출해 주면 MyInstanceIDListenerService 를 통해서 토큰이 관리되게 됩니다.
자 작업이 완료 되었고 이제는 메시지를 발송 해볼 차례 입니다.
저는 서버는 만들지 않았기 때문에 알아보니 또 크롬에서 제공되는 포스트맨이라고 하는 확장 프로그램을 통해서 테스트를 해볼수 있더라구요
방법은 Headers 창에서 Content-Type에는 json 형태로 보내므로 application/json 을 입력.
Authorization은 저희가 앞서 구글에서 발급 받은 Server API Key 잇죠? 그걸 입력해주면 됩니다. key= 까지 같이 입력해 주셔야 됩니다.
그리고 Body 창에서 위 그림과 같이 설정해서 보내주시면 됩니다.
볼거는 "to" 부분에는 받을 수신자를 입력하는 부분입니다. 앞서 제가 등록한 /topics/notice로 보내면 모두에게 보내는 공지사항과 같은 거고
토큰같은 경우에는 (ex. fgCoc1EJRIc:APA91bEkhMcMxN5nQU7EQ0SoigFxIqLzePgfR_t-qampODk_rs6GOuEKZYK_4qI2gkknqH6L7gLlbNqKpy0ushXu13nVs11wV0y3xN_6TKeIQsbPEhUYemOHTmOx0)
이런식으로 엄청 길게 생성 됩니다..
"to"에 이 토큰값을 입력하여 보내면 토큰에 해당하는 디바이스에만 보내는거구요 ..
뭐 또 서버에서 그룹을 만들어서 개별 토큰을 저장하여 그 그룹에만 보내게 할수도 있을테고.. 여러 방법이 있을 겁니다.
마지막으로.. 계속 말하지만 저는 이걸 유니티에 연동 시킬 목적으로 해본거라 안드로이드의 목적으로만 하시는 분들이라면 코드가 햇갈릴수도 있을 것 같습니다.. 양해 부탁 드리고..
저처럼 연동을 하실 분들을 위해 제가 알고있는 걸 좀 더 추가로 알려드리면..
유니티에서 제공되는 classes.jar 파일 참조하도록 해야하구요.
jar 라이브러리 파일로 export 하시려면 gradle에서 apply plugin: 'com.android.application' 삭제 하시고 apply plugin: 'com.android.library'를 추가 해주셔야 합니다.
그리고 defaultConfig 안에 applicationId, versionCode, versionName도 삭제 해주셔야 합니다.
그리고 AndroidManifest 파일에서 android:theme 삭제 해주셔야 합니다.
아 그리고 이건 기억이 좀 가물가물 하긴 한데.. android:label="@string/app_name" 라벨 값도 아마.. 이렇게 바꿔주셔야 됫 던걸로..
음.. 불안하시면 그냥 웹 검색에 유니티 안드로이드 AndroidManifest 이런식으로 비슷하게 검색하면 정보가 뜰껍니다...
그리고 마지막으로 유니티의 Assets/plugins/Android 경로에 추출한 라이브러리 jar 파일과, AndroidManifest 파일, 그리고 추출한 라이브러리 jar이 또 참조해야하는 라이브러리 종류가 있는데 그것들도 같이 넣어주셔야 합니다.. ( 하.. 정리하면서도 이건 맞긴한데.. 더 좋은 방법이 잇을거 같기도 하고 .. )
제가 한 바로는 android-support-v4.jar과 play-services-basement-8.3.0.aar, play-services-gcm-8.3.0.aar 라이브러리를 같이 넣어 줬습니다. 물론 뒤에 숫자는 제가 이용한 서비스의 버전에 해당하는 거구요.. (안드로이드 스튜디오 로그켓 보면서 하나하나 에러 부분 찾으면서 찾았습니다.)
위에 라이브러리가 없으시다면 혹 sdk manager를 통해 다운로드 받은적이 있다면 Sdk\extras\google\m2repository\com\google\android\gms 요 경로 근처에 가시면 아마 있을겁니다.
아니면 .. 검색하셔서 올라와져있는 라이브러리 다운 받으시길..
ps.. 뒤늦게 생각해보니 좀 더 다듬을려면. oncreate 에서 RegistrationIntentService를 실행하는 인텐트를 바로 할게 아니라. 그전에 이미 발급되어 있는 토큰이 있는지. 혹은. 현재 앱의 버전이 최신 버전이 아닌지.. 버전같은 경우엔 다음 버전에서 해당 토큰이 계속 사용 된다는 보장이 없으니까..
이런 조건 들을 검사해서 토큰이 있으면 RegistrationIntentService를 실행 안하게 하고 없으면 하게 하고 이런식으로 해야 할듯?
지금 짠 기본 코드는 무조건 앱 실행시 RegistrationIntentService를 인텐트로 호출하니까 말이다..
'Android' 카테고리의 다른 글
안드로이드 GCM을 이용한 푸시(Push)메시지 구현하기 (1) (1) | 2019.01.15 |
---|---|
jar ? .. aar? 라이브러리. (1) | 2016.10.10 |
startActivityForResult / onActivityResult (0) | 2013.10.01 |
안드로이드 다이얼로그[dialog,alert dialog] (0) | 2013.09.27 |
eclipse 이클립스 안드로이드 설치 (0) | 2013.08.15 |