아고라 전화 수신 기능 구현 1 - 상대방 네트워크 연결 확인 (자료조사)

2024. 12. 15. 17:53개발로그/플러터 전화 기능 구현

아고라를 이용해 전화 기능을 구현하는 데까지는 성공했다.

이제 상대방에게 전화를 요청한다는 알림을 보내는 것은 구현해보자.

 

더보기
더보기

기존 수파베이스+WebRTC 방식에서는 수파베이스 테이블을 구독하여 테이블에 변화가 생길 때마다 다이얼로그를 띄우도록 했으나, 이 방법을 사용 할 경우 모든 페이지마다 전화를 수신하게 해주는 함수를 init() 함수에 추가해야 했다. 또한 알림 형태가 아닌 다이얼로그였기 때문에 어플 화면을 나가면 알림을 받을 수 없다는 문제가 있었다.

(자료조사를 하면서 알게 된 사실인데, 상태 관리 방식을 잘 사용하면 매 스크린마다 선언 할 필요없이 main에 한 번만 선언해주면 해결되는 듯 하기도 하다...)

 

이번에 구현 할 전화 수신 알림 기능의 목표는 총 두 가지이다.

1. 전화 수신 알림을 다이얼로그 형태에서 스낵바로 바꾸고, 스낵바에 있는 버튼으로 전화 수신 수락 및 거절 기능을 구현해보자.

2. 백그라운드에서도 알림을 받을 수 있도록 해보자.

 

위에 작성한 1을 구현하기 위해 필요한 세부 기능들을 작성해보자.

1-1. 전화 수신 수락/거절 알림 구현
1-2. 전화 수신 수락/거절 알림에 버튼 구현

1-3. 전화 수신 수락/거절 내역 데이터베이스에 저장 및 UI로 보이기

 

일단 생각나는 것은 이 정도이다.

 

1-1. 전화 수신 수락/거절 알림을 구현해보도록 하자.

 


 

Chat GPT에게 Agora를 이용해 통화 채널을 생성할 때, 특정 사람들(통화를 할 상대방)에게만 백그라운드로 알림이 가게 하는 방법에 대해 물어봤다.

GPT는 3가지 방법을 제시해줬다. (이미 Supabase를 사용하고 있기에 Firebase를 사용한 백그라운드 알림은 제외했다.)

  1. Agora와 자체 서버를 활용한 알림 시스템
  2. Firebase가 아닌 다른 푸시 알림 서비스 활용
  3. Agora SDK를 활용한 클라이언트 내 메시징

 


 

그런데 지금 생각해보니 더 큰 문제가 있었다...

현재 아고라를 통해 구현한 통화 기능은, 우리가 하는 통화 송수신처럼 상대방에게 직접적으로 전화를 거는 것이 아니고, 구글 미트를 하는 방식처럼

  1. 통화방을 만들면
  2. 상대방이 그 통화방에 들어오는 것

이다.

 

또한 이때에는 네트워크를 통해 연결하기 때문에, 인터넷이 연결되어 있지 않으면 전화를 받을 수 없는 상황에 이르게 된다. (전화가 온다는 알림도 받을 수 없다.)

 

따라서, 상대방이 통화가 가능한지(네트워크에 연결이 되어있는지) 확인하는 것이 먼저였다.

검색 결과, 두 가지 방법이 나왔다.

 

1. Agora RTM(Real-Time Messaging) SDK 활용

  • 사용자가 앱에 로그인하면 RTM에 로그인하고, 로그아웃하거나 네트워크 연결이 끊어지면 RTM에서 로그아웃한다.
  • `queryPeersOnlineStatus` 메서드를 사용하여 상대방의 온라인 상태를 확인한다.
rtmClient.queryPeersOnlineStatus(['userID']).then((result) {
    if (result['userID'] == true) {
        // 상대방이 온라인 상태
        print('상대방이 통화 가능');
    } else {
        // 상대방이 오프라인 상태
        print('상대방이 통화 불가');
    }
});

 

2. 서버를 활용한 상태 확인

  • 사용자 상태 저장 :
    • 사용자가 앱에 로그인하면 서버에 "온라인" 상태를 저장한다.
    • 앱을 종료하거나 네트워크 연결이 끊어지면 "오프라인" 상태를 업데이트 한다.
  • 상태 확인 :
    • 통화를 시도하기 전 서버에 상대방의 상태를 요청한다.
final response = await http.get(Uri.parse('https://yourserver.com/userStatus?userID=123'));
if (response.statusCode == 200) {
    final status = json.decode(response.body)['status'];
    if (status == 'online') {
        print('상대방이 통화 가능');
    } else {
        print('상대방이 통화 불가');
    }
}

 

자료조사 결과, 통화 수신 알림 기능을 Agora SDK를 사용해 구현할 가능성이 높기 때문에 1번 방법을 사용해보려고 한다.