FirebaseMessaging.getInstance().getToken() 메서드가 호출안됨
fcm을 사용하려고 여러 세팅을 하던 도중에, 새로운 토큰은 발급 받았으나
새 토큰이 불러와지지 않는 문제가 발생했다.
public class MyFirebaseMessagingService extends FirebaseMessagingService {
String CHANNEL_ID;
String CHANNEL_NAME;
int userId;
ChatApiService service;
private static final String TAG = "FCM Service";
// 서비스가 생성될 때 호출되며, 여기서 FCM 토큰을 요청하는 것이 좋습니다.
@Override
public void onCreate() {
super.onCreate();
userId = SharedPreferencesHelper.getUserId(getApplicationContext());
Retrofit retrofit = RetrofitClient.getClient();
service = retrofit.create(ChatApiService.class);
// 현재 토큰을 가져오기
FirebaseMessaging.getInstance().getToken().
addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
if (!task.isSuccessful()) {
Log.w(TAG, "토큰 생성 실패", task.getException());
return;
}
// 새로운 토큰 생성 성공 시
String token = task.getResult();
Log.d(TAG,token);
}
});
}
FirebaseMessaging.getInstance().getToken() 메서드를 호출했을때, 어떤 Log 도 찍히지 않는 문제가 발생했다.
구글링을 해봐도 뾰족한 수가 없었다.
새 토큰은 디바이스에 관계없이 잘 발급되는 상황이었기에
firebase 설정문제는 아니라는 생각이 들었다.
그래서 선언부를 MyFirebaseMessagingService 클래스에서 ChatActivity로 바꿔주었다.
public class ChatActivity extends AppCompatActivity implements DateMarkerListener {
ChatApiService service;
ProfileApiService profileService;
private int currentUserId;
private ChatClient chatClient;
private RecyclerView recyclerView;
private MessageAdapter messageAdapter;
private List<Message> messages = new ArrayList<>();
private int chatRoomId;
String myProfileImg;
String partnerProfileImg;
//네트워크 작업(채팅)을 수행할 때 주의해야 할 중요한 점 중 하나는 네트워크 작업을 메인 스레드에서 실행하지 않아야 한다는 것!!!
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
String TAG = "FCM Service";
// 현재 토큰을 가져오기
FirebaseMessaging.getInstance().getToken().
addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
if (!task.isSuccessful()) {
Log.w(TAG, "토큰 생성 실패", task.getException());
return;
}
// 새로운 토큰 생성 성공 시
String token = task.getResult();
Log.d(TAG,token);
}
});
이제는 기존 토큰이 잘 호출된다.
원인이 무엇일까 찾아보니...
MyFirebaseMessagingService의 onCreate 메서드 내에서 실행되지 않는 문제의 원인 중 하나로 Firebase의 초기화 상태를 고려해볼 수 있습니다. FirebaseMessagingService가 시작될 때 Firebase 초기화가 완전히 완료되지 않았을 가능성이 있습니다. 특히, 앱의 시작 과정에서 다양한 컴포넌트와 서비스가 초기화되는 동안, Firebase 관련 서비스나 기능들의 초기화 순서와 타이밍이 영향을 받을 수 있습니다.
Firebase와 같은 서비스는 애플리케이션의 다른 초기화 작업이 완료된 후에 완전히 활성화되기 때문에, FirebaseMessagingService가 시작되는 시점에는 Firebase 인스턴스의 초기화가 아직 진행 중일 수 있습니다. 이러한 이유로, onCreate 메서드 내에서 바로 FirebaseMessaging.getInstance().getToken()를 호출하면 예상대로 동작하지 않을 수 있습니다.