본문 바로가기
프로그래밍 놀이터/안드로이드, Java

더 안정적인 GCM 구현을 위해 주의할 점.

by 돼지왕 왕돼지 2014. 3. 31.
반응형


 더 안정적인 GCM 구현을 위해 주의할 점.

 

더 안정적인 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 하는 것이 좋다.







반응형

댓글