1. FCM 환경구성
- 파이어베이스 프로젝트 생성 및 어플리케이션 등록
https://console.firebase.google.com/
> keytool을 이용해서 어플리케이션을 파이어베이스 프로젝트와 연동(인증)
> keytool의 위치는 JAVA SDK의 bin 디렉토리에 있음.
https://developers.google.com/android/guides/client-auth
> google-services.json 파일은 [프로젝트]/app 디렉토리에 포함시킨다.
> 프로젝트 연동을 확인 하면 기본 설정은 완료.
2. 기본구성
- FCM gradle 구성
https://firebase.google.com/docs/cloud-messaging/android/client?hl=ko
- FirebaseMessagingService 상속
public class MyFirebaseMessagingService extends FirebaseMessagingService{}
- FCM 서비스 등록 - AndroidManifest.xml
<service android:name=".MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
> MyFirebaseMessagingService는 FirebaseMessagingService를 상속 한다.
2. 기본코드
- MyFirebaseMessagingService
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = MyFirebaseMessagingService.class.getSimpleName();
/*
* Activity가 onResume 상태가 아닐 때는 Cloud Message에서 전송한 메시지는 수신되지 않는다.
*/
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
String from = remoteMessage.getFrom();
String messageId = remoteMessage.getMessageId();
String messageType = remoteMessage.getMessageType();
Map<String, String> map = remoteMessage.getData();
int size = map.size();
Log.d(TAG, "RemoteMessage from : " + from);
Log.d(TAG, "RemoteMessage id : " + messageId);
Log.d(TAG, "RemoteMessage type : " + messageType);
Log.d(TAG, "RemoteMessage size : " + size);
if (size > 0) {
JSONObject jsonObject = new JSONObject(map);
Log.d(TAG, "RemoteMessage data : " + jsonObject.toString());
}
RemoteMessage.Notification notification = remoteMessage.getNotification();
if (notification != null) {
String title = notification.getTitle();
String body = notification.getBody();
Log.d(TAG, "RemoteMessage notification title : " + title);
Log.d(TAG, "RemoteMessage notification body : " + body);
}
}
@Override
public void onNewToken(String s) {
super.onNewToken(s);
Log.d(TAG, "TOKEN : " + s);
}
}
> 파이어베이스의 Cloud Message는 액티비티 상태에 따라 메시지 수신 결과가 달라진다.
> FCM 메시지의 data 영역만 사용할 때는 항상 MyFirebaseMessagingService 가 수신한다.
- MainActivity
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Task<InstanceIdResult> id = FirebaseInstanceId.getInstance().getInstanceId();
id.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task) {
// 토큰 확인
if (task.isSuccessful()) {
InstanceIdResult result = task.getResult();
String id = result.getId();
String token = result.getToken();
Log.d(TAG, "Token id : " + id);
Log.d(TAG, "Token : " + token);
TextView tokenView = findViewById(R.id.token);
tokenView.setText(task.getResult().getToken());
} else {
Log.d(TAG, "Token Exception : " + task.getException().toString());
}
}
});
}
}
- AndroidManifest.xml 코드
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="app.example.fcmapp">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
</manifest>
- Cloud Message 전송 테스트
> 백그라운드 또는 알림센터에서 메시지가 수신된다.
3. 샘플코드
소스코드
APK
2019년 3월 13일 수요일
2019년 3월 12일 화요일
FCM 전송 예제
- GCM은 사용하지 말것.
https://developers.google.com/cloud-messaging/
- FCM 레퍼런스 :
https://firebase.google.com/docs/cloud-messaging/migrate-v1?hl=ko
- 예제소스는 HTTP v1 샘플소스
- 메시지 포멧은 JSON 이므로 JSON 라이브러리를 사용을 권장.
1. 메시지 전송
- 기본코드
String urlStr = "https://fcm.googleapis.com/fcm/send";
String authorization = "key=[클라우드 메시지 서버 키]";
String token = "[클라이언트 FCM 토큰]";
String data = "\"data\": {\r\n" + " \"en\": \"abc\",\r\n" + " \"ko\": \"가나다\"\r\n" + " }";
String notification = "\"notification\" : {\r\n"
+ " \"body\" : \"This is an FCM notification message!\",\r\n"
+ " \"title\" : \"FCM Message\"\r\n" + " }";
URL url = null;
HttpURLConnection connection = null;
BufferedOutputStream bos = null;
BufferedReader reader = null;
try {
url = new URL(urlStr);
connection = urlStr.startsWith("https://") ? (HttpsURLConnection) url.openConnection()
: (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
connection.setRequestProperty("cache-control", "no-cache");
connection.setRequestProperty("Authorization", authorization);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.connect();
bos = new BufferedOutputStream(connection.getOutputStream());
String message = "{\"to\" : \"" + token + "\"," + data + "," + notification + "}";
bos.write(message.getBytes("UTF-8"));
bos.flush();
bos.close();
int responseCode = connection.getResponseCode();
String responseMessage = connection.getResponseMessage();
StringBuffer buffer = null;
if (responseCode == HttpURLConnection.HTTP_OK) {
buffer = new StringBuffer();
reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
String temp = null;
while ((temp = reader.readLine()) != null) {
buffer.append(temp);
}
reader.close();
}
connection.disconnect();
System.out.println(String.format("Response : %d, %s", responseCode, responseMessage));
System.out.println("Response DATA : ");
System.out.println(buffer == null ? "NULL " : buffer.toString());
} catch (IOException e) {
e.printStackTrace();
}
> POST 전송 방식
> data만 사용하면 항상 백그라운드 서비스가 메시지를 수신
> notification을 적용할 경우 Activity가 Foreground 상태일 때와 Background 상태일 때 응답 방식이 변경됨.
> 한글깨짐 문제가 될 수 있으므로 UTF-8 인코딩을 적용.
https://developers.google.com/cloud-messaging/
- FCM 레퍼런스 :
https://firebase.google.com/docs/cloud-messaging/migrate-v1?hl=ko
- 예제소스는 HTTP v1 샘플소스
- 메시지 포멧은 JSON 이므로 JSON 라이브러리를 사용을 권장.
1. 메시지 전송
- 기본코드
String urlStr = "https://fcm.googleapis.com/fcm/send";
String authorization = "key=[클라우드 메시지 서버 키]";
String token = "[클라이언트 FCM 토큰]";
String data = "\"data\": {\r\n" + " \"en\": \"abc\",\r\n" + " \"ko\": \"가나다\"\r\n" + " }";
String notification = "\"notification\" : {\r\n"
+ " \"body\" : \"This is an FCM notification message!\",\r\n"
+ " \"title\" : \"FCM Message\"\r\n" + " }";
URL url = null;
HttpURLConnection connection = null;
BufferedOutputStream bos = null;
BufferedReader reader = null;
try {
url = new URL(urlStr);
connection = urlStr.startsWith("https://") ? (HttpsURLConnection) url.openConnection()
: (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
connection.setRequestProperty("cache-control", "no-cache");
connection.setRequestProperty("Authorization", authorization);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.connect();
bos = new BufferedOutputStream(connection.getOutputStream());
String message = "{\"to\" : \"" + token + "\"," + data + "," + notification + "}";
bos.write(message.getBytes("UTF-8"));
bos.flush();
bos.close();
int responseCode = connection.getResponseCode();
String responseMessage = connection.getResponseMessage();
StringBuffer buffer = null;
if (responseCode == HttpURLConnection.HTTP_OK) {
buffer = new StringBuffer();
reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
String temp = null;
while ((temp = reader.readLine()) != null) {
buffer.append(temp);
}
reader.close();
}
connection.disconnect();
System.out.println(String.format("Response : %d, %s", responseCode, responseMessage));
System.out.println("Response DATA : ");
System.out.println(buffer == null ? "NULL " : buffer.toString());
} catch (IOException e) {
e.printStackTrace();
}
> POST 전송 방식
> data만 사용하면 항상 백그라운드 서비스가 메시지를 수신
> notification을 적용할 경우 Activity가 Foreground 상태일 때와 Background 상태일 때 응답 방식이 변경됨.
> 한글깨짐 문제가 될 수 있으므로 UTF-8 인코딩을 적용.
라벨:
구글 클라우드 메시지,
자바,
FCM
위치:
대한민국
피드 구독하기:
글 (Atom)