더 안정적인 GCM 구현을 위해 주의할 점. |
SERVICE_NOT_AVAILABLE 을 주의하라.
register 함수를 부르면 평상시에는 문제가 없지만,
신호가 미약한 wild 환경에서는 IOException 과 함께 SERVICE_NOT_AVAILABLE 이라는 메세지가 자주 뜬다. 이럴 때는 exponential backoff 정책을 이용해서 주기적으로 시도하는 것이 좋다.
그렇지 않으면 Push 에 제대로 등록되지 않는다.
registration ID 가 제대로 준비가 되어도 register 가 계속 실패하는 경우가 있다.
register 를 불렀을 때 몇몇 단말에서는 무조건 실패한다.
하지만 이 경우 보통 registration ID 는 생성이 되지만 return 이 되지 않을 뿐이다.
이럴 경우 다음과 같은 action 을 GCM Broadcast Receiver 의 Intent Filter 에 주어 확인할 수 있다.
<Manifest>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<BroadcastReceiver onReceive>
final String registrationId = intent.getStringExtra("registration_id");
App 을 update 할 때마다 device 를 다시 등록해줘야 한다.
http://developer.android.com/google/gcm/client.html#sample-register
안드로이드 Reference 문서에 명시되어있다.
앱의 version 을 preference 등에 저장해서 체크하여 다시 register 하는 것을 피하려면 ( 번잡스러우니깐 ), 다음과 같은 receiver 를 등록해서 사용하면 된다.
<receiver android:name=".UpdateReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:path="<YOUR_PACKAGE_NAME_HERE>"
android:scheme="package" />
</intent-filter>
</receiver>
Manifest 의 version 에 관련된
android:versionCode
android:versionName
둘 중 하나만 바뀌어도 receiver 호출을 받을 수 있다.
Android Device 가 업데이트 되었을 때도 다시 등록해야 한다.
OS 가 업데이트 되었을 때나, Factory Reset 이 되었을 때도 다시 등록해야 한다.
이런 상황에서 유저가 앱을 켰을 때 GCM register 를 위해 시간을 쏟는 것을 방지하려면
RECEIVE_BOOT_COMPLETE 를 이용해서 Android ID 가 바뀌었을 때만 다시 register 하는 것이 좋다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] bitmap recycle 사용시 주의사항. (0) | 2014.04.02 |
---|---|
[android] make screen awake, no sleep (2) | 2014.04.01 |
[Java] Double-checked locking 을 사용하지 말자! (1) | 2014.03.31 |
[Android] Blurring Technique faster than RenderScript (0) | 2014.03.27 |
Eclipse 에서 Android Studio 로 넘어가기. (0) | 2014.03.27 |
댓글