Period
2021-07-19(월)
~ 2021-07-25(일)
Things I Learned
1️⃣ FCM
클라이언트 앱 인스턴스의 등록 토큰
- 특정 장치에 메시지를 보내려면 해당 장치의 등록 토큰을 알아야 함
- 앱을 처음으로 시작할 때, FCM SDK는 클라이언트 앱 인스턴스에 대한 등록 토큰을 생성함
- 토큰은 다음과 같은 이유로 초기 실행 이후 교체될 수 있음
- 앱이 새 기기에서 복원되는 경우
- 사용자가 앱을 제거/재설치하는 경우
- 사용자가 앱 데이터를 지우는 경우
FCM의 Lifecycle flow
- FCM에서 메시지를 수신할 장치를 등록한다.
- 앱 인스턴스를 고유하게 식별할 수 있도록 하는 등록 토큰을 얻고, 이를 서버에 등록함
- 다운스트림 메시지를 보내고 받는다.
- 알림 작성기 등의 환경에서 메시지가 작성되고, 메시지 요청이 FCM 백엔드로 전송됨
- FCM 백엔드는 메시지 요청을 수신하고, 메시지 ID 및 기타 메타데이터를 생성하여 플랫폼별 전송 계층으로 보냄
- 단말기가 네트워크에 연결된 온라인 상태일 때, 플랫폼별 전송 계층을 통해 메시지가 전송됨
- 해당 단말기의 클라이언트 앱이 메시지를 수신함
FCM 메시지 유형
- 알림 메시지 (
Notification message
)
- 클라이언트 앱이 아닌 FCM이 사용자 단말기에 메시지를 자동으로 표시함
- 알림 메시지는 사용자가 볼 수 있는 사전 정의된 키 집합과 선택적인 커스텀 키-값 쌍의 데이터 페이로드를 지님
- Admin SDK 또는 FCM 프로토콜을 사용하여 프로그래밍 방식으로 알림 메시지를 보내려면
notification
부분에 사전 정의된 키-값 쌍으로 데이터를 설정함
- 아래의 경우, 사용자는 "Portugal vs. Denmark"라는 타이틀과 "great match!"라는 본문을 지닌 메시지를 받음
- 알림 메시지는 선택적으로 데이터 페이로드를 포함할 수 있으며, 이 경우 앱의 동작은 앱이 백그라운드에 있는지 포그라운드에 있는지 여부에 따라 달라짐
- 백그라운드 - 사용자가 알림을 탭할 때만 데이터 페이로드를 처리
- 포그라운드 - 두 페이로드를 모두 사용할 수 있는 매시지 객체를 수신
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
},
"data" : {
"Nick" : "Mario",
"Room" : "PortugalVSDenmark"
}
}
}
- 데이터 메시지 (
Data message
)
- 클라이언트 앱이 메시지 처리를 담당함
- 앱이 포그라운드에 있을 때 즉시 전달되는 일반 우선순위를 지님
- 데이터 메시지는 예약된 키 이름 (
"from"
, "notification"
등)이 아닌 커스텀 키-값 쌍만 지녀야 함
- 아래의 예에서, 정보는 공통 data 키로 캡슐화되고, 클라이언트 앱에서 이를 해석해야 함
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data":{
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
}
}
- 플랫폼에 관계없이 모든 앱 인스턴스가 해석할 수 있는 공통 필드
message.notification.title
message.notification.body
message.data
- 특정 플랫폼에만 값을 보내려는 경우엔 공통 필드를 사용해서는 안됨
- 데이터 페이로드란?
- 큰 데이터 덩어리 중 '흥미있는' 데이터를 구별하기 위한 용어
- 운송업에서 유래한 용어로, 사용자가 값을 치르는(Pay) 적화물(Load)을 의미함
- 주로 메시지 프로토콜 중, 프로토콜 오버헤드와 원하는 데이터를 구별할 때 사용됨
- 아래의 예에서 클라이언트가 관심을 가지는 부분, 즉 데이터 페이로드는 "Hello, world!"이며, 나머지 부분은 프로토콜 오버헤드임
{
"status":"OK",
"data": {
"message":"Hello, world!"
}
}
2️⃣ Mac 환경 adb wifi debug 설정
- 터미널을 열고 홈 디렉토리로 이동
cd ~/Users/사용자이름
- vi 에디터로
.bash_profile
열기
vi .bash_profile
.bash_profile
에 환경변수 설정
i
를 눌러서 아래 내용을 입력하고, esc
를 눌러서 입력을 종료한다.
- 입력을 종료한 후,
:wq
명령어로 입력을 저장하고 엔터키를 눌러 빠져나온다.
export PATH=$PATH:/Users/사용자이름/Library/Android/sdk/platform-tools/
source
명령어로 환경변수 적용
source ~/.bash_profile adb version
- 터미널에
adb version
을 입력해서 아래와 같이 버전정보가 출력되면 성공!
- 터미널 히스토리는 아래와 같다.
3) adb
포트 설정
- USB로 컴퓨터와 단말기를 연결한 후, 터미널에서
adb devices
명령어로 연결 상태 확인
TCP/IP
연결 수신 설정
- 컴퓨터와 단말기는 동일
wifi
에 연결되어 있어야 한다.
adb tcpip 5555
명령어를 통해 5555 포트에서 TCP/IP
연결을 수신하도록 설정한다.
adb connect IP주소
명령어로 컴퓨터와 단말기 연결
- 터미널에
adb connect IP주소
를 입력하여 컴퓨터와 단말기를 연결한다.
- 터미널에
connected to IP주소:5555
가 출력되었다면 성공적으로 연결된 것이며, USB 케이블을 제거해도 연결된 상태가 유지된다.
adb devices
명령어를 통해 연결 상태를 확인할 수 있다!
3️⃣ RangeSlider
RangeSlider
RangeSlider
를 이용하면 valueFrom
에서 valueTo
까지 값의 연속 범위를 지정할 수 있음
valueFrom
, valueTo
, stepSize
, values
등은 .xml
파일과 .kt
또는 .java
파일에서 모두 지정 가능함
- 값이 변경될 때마다 호출되는
RangeSlider.OnChangeListener
콜백이 있음
- 터치 이벤트가 시작되거나 중지될 때 호출되는
RangeSlider.OnSliderTouchListener
콜백이 있음
4️⃣ Fragment Result API
Fragment Result API
- 두 개의 프래그먼트 사이 또는 프래그먼트와 호스트 액티비티 간에 일회성 값을 전달해야할 경우, 구성 요소가 직접 참조할 필요 없이 결과를 설정하고 수신하여 서로 통신할 수 있음
Pass results between fragments
- 프래그먼트 B에서 프래그먼트 A로 데이터를 전달하려면, 결과를 수신하는 프래그먼트 A에 결과 수신을 담당하는 리스너인
setFragmentResultListener()
를 설정해주어야 함
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setFragmentResultListener("requestKey") { requestKey, bundle ->
val result = bundle.getString("bundleKey")
}
}
- 결과를 생성하는 프래그먼트 B에서는 동일한
requestKey
를 이용하여 결과를 설정해주어야 함
button.setOnClickListener {
val result = "result"
setFragmentResult("requestKey", bundleOf("bundleKey" to result))
}
- 프래그먼트 A가
STARTED
상태일 경우, 결과를 수신하고 리스너 콜백을 실행함