[Android] GCM에서 FCM(Firebase Notification)으로 이동할 때의 정보 요약
구글 I/O 발표 후 분위기가 고조된 Firebase
GCM에서 Firebase로 갈아타는 사람들의 이동 방법과 테스트 방법을 총결하였다.
https://firebase.google.com/
FCM은 매우 간단합니다.
gcm.jar 때
마이그레이션 이점
마이그레이션 방법
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
확인 방법 등
영패 발표 시간
FirebaseInstanceIdService
의onTokenRefresh()
는 최신 토큰을 얻을 수 있기 때문에 서버에 로그인@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에서 변경된 조건은 몇 가지인 것 같습니다.
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으로 이전했지만 업데이트를 검증하고 싶습니다.
// 事前に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.javapublic 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);
}
}
메모
이거 쓰는 데 두 시간 걸렸어요...
단락의 용법을 이해하지 못하다
더 좋은 출력을 하세요.
Reference
이 문제에 관하여([Android] GCM에서 FCM(Firebase Notification)으로 이동할 때의 정보 요약), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/srea/items/f0836a0857cab743a94a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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.javapublic 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);
}
}
메모
이거 쓰는 데 두 시간 걸렸어요...
단락의 용법을 이해하지 못하다
더 좋은 출력을 하세요.
Reference
이 문제에 관하여([Android] GCM에서 FCM(Firebase Notification)으로 이동할 때의 정보 요약), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/srea/items/f0836a0857cab743a94a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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.javapublic 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);
}
}
메모
이거 쓰는 데 두 시간 걸렸어요...
단락의 용법을 이해하지 못하다
더 좋은 출력을 하세요.
Reference
이 문제에 관하여([Android] GCM에서 FCM(Firebase Notification)으로 이동할 때의 정보 요약), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/srea/items/f0836a0857cab743a94a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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);
}
}
이거 쓰는 데 두 시간 걸렸어요...
단락의 용법을 이해하지 못하다
더 좋은 출력을 하세요.
Reference
이 문제에 관하여([Android] GCM에서 FCM(Firebase Notification)으로 이동할 때의 정보 요약), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/srea/items/f0836a0857cab743a94a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)