푸시 알림 기술은 Android에서 어떻게 작동합니까?


218

Google은 푸시 알림 기능을 어떻게 구현 했습니까? 백그라운드에서 또는 다른 방식으로 실행되는 서비스에 의해 수행 된 폴링을 통해 작동합니까?


24
나에게 진짜 질문처럼 들린다. 나는 그것에 대한 답이 궁금했고 Google이 나를 여기로 데려왔다. 다시 한 번 다른 품질 문제가 종결되었습니다.
Tino Mclaren

1
나는 또한 이것을 알고 싶어하고 질문을 쓸 계획 이었지만 이것도 이미 있으므로 좋은 질문입니다.
Igor Čordaš

답변:


170

이스라엘에서 안드로이드 개발자 컨퍼런스에서 들었던 내용에서 :

클라우드 Google 서버 에는 수락 모드 에서 대기중인 TCP 소켓이 있습니다 . Google Play 애플리케이션에서 TCP 연결을 시작했습니다. 그렇기 때문에 Google Cloud Messaging (GCM) (이전의 Android Cloud to Device Messaging Service- C2DM )을 작동 시키려면 Google Play가 기기에 설치되어 있어야합니다 .

이 TCP 클라이언트 소켓이 일부 메시지를 수신하면, 메시지에는 주소를 지정해야하는 응용 프로그램의 패키지 이름과 데이터 자체와 같은 정보가 포함됩니다. 이 데이터는 분석되어 브로드 캐스트되어 결국 응용 프로그램에서 수신되는 인 텐트 로 파싱 됩니다.

장치의 무선 상태가 "유휴"모드로 바뀌더라도 TCP 소켓은 열린 상태로 유지됩니다. 인 텐트를 받기 위해 응용 프로그램을 실행할 필요는 없습니다.

http://developer.android.com/google/gcm/gcm.html 에서 추가 정보


1
하지만 에뮬레이터에서도 작동한다고 생각합니다. 내 생각에 오는 것은 장치가 현재 경로 (IP)로 서버를 업데이트한다는 것입니다. Google 서버는 알림을 보내야 할 때 현재 경로를 사용하여 해당 경로로 메시지를 전달합니다. 나는 어느 정도 옳은가?
Khawar Raza

2
@Khawar Raza : 장치의 IP가 어떤 이유로 변경되면 장치와 서버의 연결이 끊어집니다. 발생하는 경우-장치의 새 IP를 기반으로 새 연결이 대신 조립됩니다.
탈 카넬 (Tal

1
@ Khawar Raza : 에뮬레이터는 구글 플레이 없이도 작동합니다. 구글 플레이 대신 내부적으로 내장 된이 소켓을 시작한 것 같습니다
Tal Kanel

2
내가 참조. 그것은 실제로 매우 흥미로울 것입니다. 그것이 사실인지 궁금합니다.
당신 786

2
여전히 설문 조사를 진행하고 있지만 Google Play에서 설문 조사를 중앙 집중화하는 것이 좋습니다.
Accollativo

143

Android는 Google 서버에 하나의 활성 연결을 유지하지만 휴대 전화의 앱에 Google 클라우드 메시징 (GCM) 메시지를 보낼 때까지 트래픽이 전송되지 않기 때문에 많은 전력이나 데이터를 사용하지 않습니다. 휴대 전화에는 모든 앱에서 사용하는 연결이 하나뿐입니다. GCM을 사용하는 새 앱을 설치해도 추가로드가 발생하지 않습니다.

GCM의 첫 단계는 이메일 서버와 같은 타사 서버가 Google GCM 서버에 요청을 보내는 것입니다. 그런 다음이 서버는 열린 연결을 통해 장치로 메시지를 보냅니다. Android 시스템은 메시지를보고 어떤 앱인지 확인하고 해당 앱을 시작합니다. GCM을 사용하려면 앱이 Android에 등록되어 있어야하며 관련 권한이 있어야합니다. 앱이 시작되면 메시지의 데이터로 바로 알림을 생성 할 수 있습니다. GCM 메시지의 크기는 매우 제한적이므로 앱에서 타사 서버에 대한 일반 연결을 열어서 추가 정보를 얻을 수 있습니다 (예 : 새 이메일 헤더 다운로드).

푸시 알림을 사용하면 새로운 데이터를 확인하기 위해 앱을 정기적으로 실행할 필요가 없으므로 전력과 데이터가 모두 절약됩니다. GCM과 같은 중앙 집중식 메커니즘의 이점은 기기에 하나의 개방형 네트워크 연결 만 필요하며 Android GCM 시스템은 자체 네트워크를 유지하기 위해 백그라운드에서 실행중인 각 앱이 아니라 계속 실행해야하는 유일한 것입니다 자체 서버에 연결합니다.

이것을 다음에서 얻었습니다. 출처 여기를 참조 하십시오 .


1
GCM 연결에 대한 의견입니다. 단일 연결은 폴링 연결입니다.
wmac

1
나에게 중요한 부분은 이메일 서버와 같은 타사 서버가 실제로 Google GCM 서버에 알림 메시지를 보내는 것입니다. Google은 무료로 제공하는 서비스이며 이러한 제 3자는 GCN 프로토콜을 사용하여 Google 서버와 통신 채널을 구현해야합니다. 그건 그렇고, 프로토콜은 거의 JSON 형식의 HTTP 응답입니다. 자세한 내용은 developers.google.com/cloud-messaging 을 참조하십시오.
Kyselejsyreček

10

긴 폴링 TCP 연결로 Android에서 푸시 알림을 직접 구현할 수 있습니다. 그러나 여분의 소켓 => 배터리 소모를 유지하는 것이 필요합니다. 또는 알람 관리자를 사용하여 정기적으로 연결을 열 수 있습니다.

구글은 아마도 모든 C2DM 푸시 알림을 위해 하나의 소켓을 열었으므로 배터리 효율이 더 높다.


클라이언트가 TCP 연결을 따라 폴링하고 있음을 확인 했습니까? 얼마나 자주 데이터를 폴링하는지 알고 있습니까? 예를 들어 5 초마다 아니면 심장 박동처럼 빠릅니까?
j2emanue

3

2018 년 4 월 10 일부터 Google은 GCM을 더 이상 사용하지 않습니다. GCM 서버 및 클라이언트 API는 더 이상 사용되지 않으며 2019 년 4 월 11 일부터 제거 될 예정입니다. GCM 앱을 FCM (Firebase Cloud Messaging)으로 마이그레이션하면 안정적이고 확장 가능한 GCM 인프라와 많은 새로운 기능이 상속됩니다.

https://firebase.google.com/docs/cloud-messaging/


1

네 말이 맞아. Google에 서비스 (GTalk 서비스)가 있었으며이 서비스는 일정 기간 동안 Google 서버에 요청했습니다.


나도 몰라. 방금 C2DM의 작동 방식을 읽었습니다. 이제 무언가가 바뀔 수 있습니다.
Yury

-3

Android 장치에서 푸시 알림을 받으면 발신자 응용 프로그램의 이미지와 메시지가 상태 표시 줄에 나타납니다. 정확히 클라이언트가 알림을 탭하면 응용 프로그램을 시작합니다.


그것은 백그라운드에서 오래 실행되는 TCP 연결입니다. 이것은 답변에 설명되어 있지 않습니다. 질문은 다음과 같이 질문하십시오 :)
Nishchal Gautam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.