[Android] GCM에서 FCM(Firebase Notification)으로 이동할 때의 정보 요약


구글 I/O 발표 후 분위기가 고조된 Firebase
GCM에서 Firebase로 갈아타는 사람들의 이동 방법과 테스트 방법을 총결하였다.
https://firebase.google.com/

FCM은 매우 간단합니다.


gcm.jar 때
  • Registration ID가 비어 있으면 재발급 처리
  • 제가 play-services-gcm로 넘어갈 때.
  • gcm.jar 내부에서 한 일, 응용 프로그램 버전 검사, 자체 재발급 준비 등의 재등록 처리
  • FCM
  • SDK에서 모두 완료
  • 마이그레이션 이점

  • 마이그레이션 비용이 낮습니다.단순함
  • 서버 사이드를 변경할 필요가 없음
  • 설비 등록 처리와 영패 발행 처리는 자동으로 진행된다
  • 향후 푸시 관련 기능은 FCM에서 추가
  • 서버 없음
  • Firebase Analytics와 함께 발표
  • GCM은 언젠가 중지됩니다
  • 마이그레이션 방법


    gcm.jar를 사용할 때.


    어쨌든, gcm.jar 끄세요↓
    Github firebase/quickstart-android
    그 다음에 여기를 보면 돼요.
    Set Up a Firebase Cloud Messaging Client App on Android

    play-services-gcm 사용 시


    기본적으로 이렇게 하는 거예요.
    Migrate a GCM Client App for Android to Firebase Cloud Messaging
  • AndroidManifest.xml 두 서비스만 추가
  • Permission 필요 없음!(※ 라이브러리 측의 AndroidManifest.xml에 기술되어 있음)
  • 마이그레이션 후 코드 감소.
  • 확인 방법 등


    영패 발표 시간

  • 처음 시작할 때 FCM SDK는 자동으로 registration token을 발행합니다.
  • 토큰이 바뀔 때마다FirebaseInstanceIdServiceonTokenRefresh()는 최신 토큰을 얻을 수 있기 때문에 서버에 로그인
  • MyFirebaseInstanceIDService.java
    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);
    
        // TODO: Implement this method to send any registration to your app's servers.
        sendRegistrationToServer(refreshedToken);
    }
    

    InstanceID 변경 시 테스트


    InstanceID에서 변경된 조건은 몇 가지인 것 같습니다.
  • 애플리케이션에서 InstanceID를 제거할 때
  • 새 설비로 복원할 때
  • 마운트 해제/재설치
  • 애플리케이션 데이터 삭제
  • adb
    adb shell am startservice -a com.google.android.gms.iid.InstanceID --es "CMD" "RST" -n your.package.name/your.own.MyInstanceIDListenerService
    
    ↑ 방법도 onToken Refresh () 라고 불리지 않기 때문에 DeleteTokenService 를 넣어 불러보자.
    startservice
    $ adb shell am startservice your.packeage.name/your.own.service.DeleteTokenService
    
    그런 다음 onTokenRefresh() 호출을 확인할 수 있습니다.
    DeleteToken Service는 내부적으로 FirebaseInstanceId.getInstance().deleteInstanceId(); 라고 부르기 때문에 과거에 발표된 registrationId 도 비활성화됩니다.
    Documen deleteInstanceID()

    사용자에게 미치는 영향 확인


    GCM에서 FCM으로 이전했지만 업데이트를 검증하고 싶습니다.
  • 현재 상점의 GCM 버전 APK 준비
  • FCM 버전의 APK로 전환 준비
  • 단계
    // 事前にonTokenRefresh()の中でログを仕込んでおく(今回はtokenというタグ)
    $ adb logcat | grep token
    
    // GCM版をインストールしたら一度起動する
    $ adb install gcm.apk 
    
    // 新しいバージョンを入れて、onTokenRefresh()内に仕込んだtokenログが出力されていることを確認する
    $ adb install -r fcm.apk
    
    서버에 새 장치 영패를 보낼 때도 영패가 고쳐졌는지 확인해야 한다.

    주의사항


    Firebase 항목을 만들 때



    구글 프로젝트가 있다면 Firebase에 새 프로젝트를 만들지 마세요.
    api키가 다르기 때문에 여러 가지 문제가 발생합니다.
    가져오기에서 구글 항목을 추가하십시오.
    (아마존 SNS를 사용한 제품 중 구글 프로젝트와 합작한 상태에서 Firebase Analytics를 새로 도입한 결과 API 키가 일치하지 않아 전송되지 않는 문제가 발생했다.)

    FirebaseMessaging Service에서 Handler를 사용할 때


    gcm.jar 때 GCMBaseIntentService계승했으므로 사용할 수 있다IntentService.
    이번new Handler()계승했기에직접FirebaseMessagingService하려면Service일어난다.
    java.lang.RuntimeException
    Can't create handler inside thread that has not called Looper.prepare()
    
    우리 루프 하자.
    if (Looper.myLooper() == null) {
        Looper.prepare();
    }
    

    하면, 만약, 만약...


    java.lang.IllegalStateException: FirebaseApp with name [DEFAULT] doesn't exist.


    build.gradle
    // これが追加されてるか確認
    apply plugin: 'com.google.gms.google-services' 
    

    기대하는 일


    설치 방법이 많이 쉬워졌기 때문에 당분간은 큰 변화가 없겠죠.(희망)
    앞으로 푸시 운용에 편리한 기능이 추가될 것으로 기대하고 있다.
    정기적으로 편지 같은 거 할 수 있어요.
    (토큰을 여러 개 더 발행해도 자동으로 오래된 것을 닫을 수 있습니다...)

    참고 자료


    When will InstanceIDListenerService be called and how to test it?
    FCM Vs GCM? Why we need to migrate from GCM to FCM
    Firebase FCM force onTokenRefresh() to be called
    FirebaseInstanceIdService
    FirebaseApp with name [DEFAULT] doesn't exist
    Firebase FCM force onTokenRefresh() to be called

    DeleteTokenService


    http://gohowall.com/firebase-fcm-force-ontokenrefresh-to-be-called/
    DeleteTokenService.java
    public class DeleteTokenService extends IntentService
    {
        public static final String TAG = DeleteTokenService.class.getSimpleName();
    
        public DeleteTokenService()
        {
            super(TAG);
        }
    
        @Override
        protected void onHandleIntent(Intent intent)
        {
            try
            {
                // Check for current token
                String originalToken = getTokenFromPrefs();
                Log.d(TAG, "Token before deletion: " + originalToken);
    
                // Resets Instance ID and revokes all tokens.
                FirebaseInstanceId.getInstance().deleteInstanceId();
    
                // Clear current saved token
                saveTokenToPrefs("");
    
                // Check for success of empty token
                String tokenCheck = getTokenFromPrefs();
                Log.d(TAG, "Token deleted. Proof: " + tokenCheck);
    
                // Now manually call onTokenRefresh()
                Log.d(TAG, "Getting new token");
                FirebaseInstanceId.getInstance().getToken();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    
        private void saveTokenToPrefs(String _token)
        {
            // Access Shared Preferences
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
            SharedPreferences.Editor editor = preferences.edit();
    
            // Save to SharedPreferences
            editor.putString("registration_id", _token);
            editor.apply();
        }
    
        private String getTokenFromPrefs()
        {
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
            return preferences.getString("registration_id", null);
        }
    }
    

    메모


    이거 쓰는 데 두 시간 걸렸어요...
    단락의 용법을 이해하지 못하다
    더 좋은 출력을 하세요.

    좋은 웹페이지 즐겨찾기