안드로이드에서 푸시 서비스는 2.2 프로요 버전부터 애플리케이션에 적용할 수 있도록 지원하던 C2DM(Cloud To Device Messaging)을 젤리빈 4.1 버전부터 GCM(Google Cloud Messaging)으로 바꾸어 지원합니다
GCM에 대한 개략적인 프로세스와 초기 등록 ID를 획득하기까지의 방법은 아래 링크를 참고합시다
GCM 푸시서버연동 설정 - Client
참고 : http://blog.daum.net/_blog/BlogTypeView.do?blogid=0qCVX&articleno=11 작성시기 : 2015.04.10 [간략소개] 출처 : http://musasin8...
scotthan.tistory.com
본문으로 이동
GCM 푸시 메시지 처리과정을 간단하게 정리하면 다음과 같습니다
- 단말은 자신을 클라우드 서버에 등록하고 서버로부터 등록 ID를 받습니다
- 등록 ID 정보는 메시지를 전송할 권한이 있는 애플리케이션 서버로 보낸 후 메시지를 기다립니다
- 보내고자 하는 메시지는 애플리케이션 서버에서 클라우드에 접속한 후 전송합니다
- 전송된 메시지는 등록한 단말에 보내집니다
애플리케이션 서버는 직접 단말로 메시지를 보낼 수 없으므로 클라우드 서버를 통해 보내게 됩니다. 즉, 메시지의 흐름은 '애플리케이션 서버 -> 클라우드 서버 -> 단말'의 형태를 띠게 됩니다
이 과정에서 다음과 같은 두 가지 내용을 기억할 필요가 있습니다
- 애플리케이션 서버에 저장된 단말의 등록 ID
- 애플리케이션 서버에서 클라우드 서버로 접속하기 위한 인증 정보
등록 ID(Registration ID)는 등록한 단말별로 고유한 값으로 설정되어 애플리케이션 서버에 저장되며, 클라우드 서버가 메시지를 보내주어야 할 단말을 구분하는데 사용됩니다
인증정보는 애플리케이션을 등록해야 사용할 수 있고, 클라우드 서버로 접속하기 위한 인증 정보입니다. 아무나 접속하여 단말로 메세지를 보내면 안되므로 애플리케이션 서버가 API 키라고 불리는 고유한 값을 이용해 메시지를 보내도록 합니다
GCM을 위한 앱을 만드려면 먼저, 안드로이드 스튜디오에서 'play services' 라이브러리를 다운받아야 합니다
매니페스트에는 GCM을 사용하기 위해 정의한 서비스를 등록하고 권한 정보 등을 넣어야 합니다
다음은 액티비티 부분입니다 (단말 등록하기 / 전송하기)
메인 액티비티의 코드에서는 Sender 객체를 초기화하는 부분과 함께 [단말 등록하기]와 [전송하기] 버튼을 눌렀을 때 호출하는 메서드들을 볼 수 있습니다. Sender 객체는 단말에서 메시지를 보낼 때 사용하는 것으로 구글 API 콘솔 사이트에서 발급받은 API 키를 파라미터로 전달하면서 초기화합니다
[단말 등록하기] 버튼을 눌렀을 때 호출하는 registerDevice() 메서드에는 다음과 같은 코드가 들어 있습니다
GoogleCloudMessaging 객체는 구글 클라우드 서버에 단말을 등록하는 과정을 도와줍니다. 이 객체를 참조한 후 단말을 등록하기 위해 register() 메서드를 호출합니다. 단말 등록 과정은 내부적으로 인터넷을 사용하므로 스레드 클래스를 하나 정의하고 그 안에서 처리합니다
register() 메서드를 호출하여 정상적으로 단말이 등록되면 등록 ID를 돌려받게 됩니다. 이 등록 ID는 푸시 메시지를 보낼 때 사용하므로 잘 보관해두어야 합니다. 원래는 푸시 메시지를 전송하는 쪽으로 이 등록 ID를 보내주어야 하지만 예제 소스에서는 보내는 기능이 같이 들어가 있으므로 변수에 저장해 두었다가 메시지를 전송하기 위한 버튼을 눌렀을 때 이 변수의 정보를 사용하게 됩니다
[전송하기] 버튼을 눌렀을 때 호출되는 메서드는 다음과 같습니다
메시지를 전송할 때도 스레드 안에서 전송되도록 구현하고 Sender 객체의 send() 메서드를 호출하면 Message 객체를 만들어서 메시지를 전송하게 됩니다
Message 객체의 addData() 메서드를 이용해 데이터를 추가할 때 이름과 값을 지정하는데, 받는쪽에서도 이를 구분하여 수신하게 됩니다. send() 메시지를 호출할 때는 등록 ID가 파라미터로 전달되어야 합니다. 즉, 메시지를 전송하는 쪽에서 메시지를 받을 단말의 등록 ID를 가지고 있어야 한다는 의미가 됩니다
이렇게 메시지를 전송하면 클라우드 서버로 보내진 메시지는 다시 단말 쪽에서 받게 됩니다. 단말 쪽에서 메시지를 받게 되면 GCMBroadcastReceiver 안에 들어 있는 onReceive() 메서드가 호출됩니다
위 소스에서는 푸시 메시지를 전달받은 데이터를 이용해 메인 액티비티를 띄우는데 인텐트에 플래그를 주었기 때문에 메인 액티비티의 onNewIntent() 메서드로 데이터가 전달됩니다
애플리케이션 업데이트 정보를 단말에 알려주어야 하는 경우처럼 이미 많은 사람들이 사용하는 애플리케이션에 알림 메시지를 전송하려고 할 때는 GCM을 사용하는 것이 간편하고 좋을 수 있습니다