TIL: FCM / adb wifi debug / RangeSlider / FragmentResultAPI

yxnsx·2021년 7월 22일
0

TIL: Things I Learned

목록 보기
2/4
post-thumbnail

Period

  • 2021-07-19(월) ~ 2021-07-25(일)


Things I Learned

1️⃣ FCM

클라이언트 앱 인스턴스의 등록 토큰

  • 특정 장치에 메시지를 보내려면 해당 장치의 등록 토큰을 알아야 함
  • 앱을 처음으로 시작할 때, FCM SDK는 클라이언트 앱 인스턴스에 대한 등록 토큰을 생성함
  • 토큰은 다음과 같은 이유로 초기 실행 이후 교체될 수 있음
    • 앱이 새 기기에서 복원되는 경우
    • 사용자가 앱을 제거/재설치하는 경우
    • 사용자가 앱 데이터를 지우는 경우

FCM의 Lifecycle flow

  1. FCM에서 메시지를 수신할 장치를 등록한다.
    • 앱 인스턴스를 고유하게 식별할 수 있도록 하는 등록 토큰을 얻고, 이를 서버에 등록함
  1. 다운스트림 메시지를 보내고 받는다.
    • 앱 서버가 클라이언트 앱에 메시지를 보냄
    1. 알림 작성기 등의 환경에서 메시지가 작성되고, 메시지 요청이 FCM 백엔드로 전송됨
    2. FCM 백엔드는 메시지 요청을 수신하고, 메시지 ID 및 기타 메타데이터를 생성하여 플랫폼별 전송 계층으로 보냄
    3. 단말기가 네트워크에 연결된 온라인 상태일 때, 플랫폼별 전송 계층을 통해 메시지가 전송됨
    4. 해당 단말기의 클라이언트 앱이 메시지를 수신함

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 설정

1) SDK platform tools 설치

2) .bash_profile 파일에 SDK platform tools 환경변수 설정

  1. 터미널을 열고 홈 디렉토리로 이동
	cd ~/Users/사용자이름

  1. vi 에디터로 .bash_profile 열기
	vi .bash_profile

  1. .bash_profile에 환경변수 설정
    • i를 눌러서 아래 내용을 입력하고, esc를 눌러서 입력을 종료한다.
    • 입력을 종료한 후, :wq 명령어로 입력을 저장하고 엔터키를 눌러 빠져나온다.
	export PATH=$PATH:/Users/사용자이름/Library/Android/sdk/platform-tools/

  1. source 명령어로 환경변수 적용
	source ~/.bash_profile adb version

  1. 터미널에 adb version을 입력해서 아래와 같이 버전정보가 출력되면 성공!
  • 터미널 히스토리는 아래와 같다.

3) adb 포트 설정

  1. USB로 컴퓨터와 단말기를 연결한 후, 터미널에서 adb devices 명령어로 연결 상태 확인
    • 정상적으로 연결된 상태라면 위와 같이 뜬다.


  2. TCP/IP 연결 수신 설정
    • 컴퓨터와 단말기는 동일 wifi에 연결되어 있어야 한다.
    • adb tcpip 5555 명령어를 통해 5555 포트에서 TCP/IP 연결을 수신하도록 설정한다.


  3. 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()를 설정해주어야 함
// Fragment A
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    // Use the Kotlin extension in the fragment-ktx artifact
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        
        // We use a String here, but any type that can be put in a Bundle is supported
        val result = bundle.getString("bundleKey")
        
        // Do something with the result
    }
}
  • 결과를 생성하는 프래그먼트 B에서는 동일한 requestKey를 이용하여 결과를 설정해주어야 함
// Fragment B
button.setOnClickListener {
    val result = "result"
    
    // Use the Kotlin extension in the fragment-ktx artifact
    setFragmentResult("requestKey", bundleOf("bundleKey" to result))
}
  • 프래그먼트 A가 STARTED 상태일 경우, 결과를 수신하고 리스너 콜백을 실행함

0개의 댓글