이클립스에서 FCM 기반 앱 개발하기 위한 준비 사항.
1. 안드로이드 앱 프로젝트를 시작한다.
2. FCM 라이브러리를 이클립스에 설치한다.
http://storycode.tistory.com/13 참조
3. google-play-serivces_lib 프로젝트를 import 한다.
- SDK Manager 에서 최신 버전을 설치하면 google-play-serivces_lib 프로젝트가 존재하지 않는 것 같다.
- 그래서, 아래의 포스트에서 google-play-services_lib 프로젝트를 다운로드 받아서 import 한다.
* http://blog.naver.com/websearch/220830144941
- google-play-services_lib 프로젝트를 import 하는 이유는 firebase 에서 google-play-service 를 필요로 하고 해당 R 클래스도 필요로 하기 때문이다.
- import 한 google-play-services_lib 를 FCM 앱의 라이브러리로 포함시킨다.
4. FCM 을 위한 google-services.json 파일 다운로드 및 적용
- 아래의 포스트와 같이 google-services.json 파일의 내용을 strings.xml 파일에 저장한다.
5. FCM 을 위한 AndroidManifest.xml 파일 수정
- 아래의 포스트와 같이 AndroidManifest.xml 파일을 수정하세요.
6. FCM token 생성 요청
- MainActivity.java 소스 코드를 아래와 같이 개발하여서 FCM token 을 생성 요청한다.
- FCM token 이 생성된 상태이면 FirebaseInstanceId.getInstance().getToken() 호출시 token 을 가져오고 그렇지 않으면 null 을 가져온다.
public class MainActivity extends Activity
{
private static String TAG = "MainActivity";
@Override
protected void onCreate( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
FirebaseMessaging clsMessaging = FirebaseMessaging.getInstance();
clsMessaging.subscribeToTopic("news");
String token = FirebaseInstanceId.getInstance().getToken();
Log.e( "token2", "token[" + token + "]" );
}
}
7. FCM token 생성 이벤트 수신
- FCM token 생성 이벤트 수신을 위한 서비스를 개발한다. 클래스 이름은 AndroidManifest.xml 에 기술한 이름과 동일해야 한다.
public class FCMIDService extends FirebaseInstanceIdService
{
private static final String LOG_TAG = "FCMIDService";
@Override
@WorkerThread
public void onTokenRefresh()
{
super.onTokenRefresh( );
String strToken = FirebaseInstanceId.getInstance().getToken();
Log.d( LOG_TAG, "token[" + strToken + "]" );
}
}
8. FCM 메시지 이벤트 수신
- FCM 메시지 이벤트 수신을 위한 서비스를 개발한다. 클래스 이름은 AndroidManifest.xml 에 기술한 이름과 동일해야 한다.
public class FCMService extends com.google.firebase.messaging.FirebaseMessagingService
{
private static final String LOG_TAG = "FCMService";
@Override
@WorkerThread
public void onMessageReceived( RemoteMessage arg0 )
{
super.onMessageReceived( arg0 );
Map<String,String> clsData = arg0.getData( );
for( Map.Entry<String, String> it : clsData.entrySet( ) )
{
Log.d( LOG_TAG, "key(" + it.getKey( ) + ") value(" + it.getValue( ) + ")" );
}
Notification clsNotification = arg0.getNotification( );
if( clsNotification != null )
{
Log.d( LOG_TAG, "notification body(" + clsNotification.getBody( ) + ")" );
}
}
}
[추가정보1]
3. google-play-serivces_lib 프로젝트를 import 한다. 수행시
google-play-services_lib 를 단순히 Java Build Path 의 Libraries 에 추가하면
6번의 AndroidManifest.xml 의
<provider
android:authorities="com.gcharger.client.firebaseinitprovider"
android:name="com.google.firebase.provider.FirebaseInitProvider"
android:exported="false"
android:initOrder="100" />
부분과 7번
FirebaseMessaging clsMessaging = FirebaseMessaging.getInstance();
clsMessaging.subscribeToTopic("news");
String token = FirebaseInstanceId.getInstance().getToken();
부분에서 Runtime Error 가 발생한다.
google-play-services_lib 를 Java Build Path 의 라이브러리가 아닌 android Library 로 추가해 주어야 한다.
[추가정보2]
정상적으로 모든 작업을 마치고 firebase console 에서 메시지를 발송하면 어플로 푸시가 들어오는것을 확인할 수 있지만 FCMService 의 onMessageReceived 에 Notification sound 를 설정해도 어플이 백그라운드 상태에서는 소리가 나지 않는다.
어플이 백그라운드 상태에서 firebase console 로부터 수신된 푸시는 onMessageReceived 를 타지 않기때문!
서버측 프로그램을 만들어 푸시를 발송하면 onMessageReceived 의 Notification 을 통해 메시지가 수신되면서 소리 및 Notification 설정대로 푸시 메시지가 수신된다.