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를 사용한 백그라운드 알림은 제외했다.)
- Agora와 자체 서버를 활용한 알림 시스템
- Firebase가 아닌 다른 푸시 알림 서비스 활용
- Agora SDK를 활용한 클라이언트 내 메시징
그런데 지금 생각해보니 더 큰 문제가 있었다...
현재 아고라를 통해 구현한 통화 기능은, 우리가 하는 통화 송수신처럼 상대방에게 직접적으로 전화를 거는 것이 아니고, 구글 미트를 하는 방식처럼
- 통화방을 만들면
- 상대방이 그 통화방에 들어오는 것
이다.
또한 이때에는 네트워크를 통해 연결하기 때문에, 인터넷이 연결되어 있지 않으면 전화를 받을 수 없는 상황에 이르게 된다. (전화가 온다는 알림도 받을 수 없다.)
따라서, 상대방이 통화가 가능한지(네트워크에 연결이 되어있는지) 확인하는 것이 먼저였다.
검색 결과, 두 가지 방법이 나왔다.
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번 방법을 사용해보려고 한다.
'개발로그 > 플러터 전화 기능 구현' 카테고리의 다른 글
아고라 전화 수신 구현 중간 기록 (1) | 2024.12.19 |
---|---|
[node.js] 아고라 토큰 발급 서버 만들기 (1) | 2024.12.13 |
[node.js] 웹소켓 서버 만들기 (0) | 2024.12.09 |
nmap 사용해서 네트워크 포트 상태 확인하기 + 포트 열기 (0) | 2024.12.07 |
[MAC] Nginx 설치 (0) | 2024.12.04 |