Multipeer Connectivity 정리 - Team-HGD/SniffMEET GitHub Wiki
작성자: 윤지성
작성일: 2024.11.12
📝Support peer-to-peer connectivity and the discovery of nearby devices.
MultipeerConnectivity (MPC)는 일반적으로 최대 7개의 피어와 연결을 안정적으로 유지할 수 있습니다.
즉, 한 피어가 최대 7개의 다른 피어와 동시에 연결을 유지할 수 있으며, 이를 포함하여 총 8개의 피어로 이루어진 네트워크를 형성할 수 있습니다.
https://blog.nowhere.co.jp/archives/20180921-26051.html
-
로컬 네트워크 사용: 로컬 네트워크를 사용하는 앱은 Info.plist 파일에
NSLocalNetworkUsageDescription
키를 추가하여 해당 사용 목적을 설명하는 문자열을 제공해야 합니다. - Bonjour 사용: Bonjour 서비스를 사용하는 앱은 자신이 탐색하는 서비스들을 NSBonjourServices 키로 명시해야 합니다.
Servicetype이 동일한 기기에 대해서 browsing을 진행합니다.
- MCSession 객체는 연결된 피어 장치 간의 통신을 지원합니다.
- 앱은 세션을 생성하고, 피어가 연결을 수락하면 그 피어를 세션에 추가합니다. 또한 다른 피어로부터 연결 요청을 받으면 세션을 생성합니다.
- 세션 객체는 연결된 피어들을 나타내는 peer ID 객체들을 관리합니다.
🗣️ 나랑 연결하고 싶어요! 주변 피어를 찾는 역할
- 앱이 특정 유형의 세션에 참여할 준비가 되어 있음을 주변의 피어에게 알립니다.
- 이 객체는 하나의 로컬 피어 객체를 사용하여 자신의 장치와 사용자 정보를 인근 장치에 제공합니다.
- MCAdvertiserAssistant는 MCNearbyServiceAdvertiser와 동일한 기능을 제공하지만, 추가적으로 사용자가 초대를 수락할 수 있는 표준 사용자 인터페이스를 제공합니다.
- 사용자가 초대를 수락하는 과정에 기본적인 UI를 제공하고 싶다면 이 객체를 사용할 수 있습니다.
- 하지만 만약 앱에서 자체적인 사용자 인터페이스를 제공하거나 초대 수락을 좀 더 세밀하게 제어하고 싶다면, advertiser를 직접 사용해야 합니다.
🙋 나랑 연결할 사람 없어요? 하며 찾는 역할
- MCNearbyServiceBrowser 객체는 프로그램적으로 주변 장치들을 검색하여, 특정 유형의 세션을 지원하는 장치들을 찾습니다.
- MCBrowserViewController 객체는 사용자가 주변 피어 중에서 선택하여 세션에 추가할 수 있는 표준 사용자 인터페이스를 제공합니다.
- MCPeerID 객체는 각 장치에서 실행 중인 앱을 고유하게 식별하는 객체로, 주변 피어들 간에 장치를 식별할 때 사용됩니다.
-
Before Advertising & Before Browsing
Advertising과 Browsing을 시작하지 않는 상태입니다.
주변기기 있는지와 어떤 기기가 있는지에 대한 정보 모두 가지고 있지 않습니다.
-
Advertising & Browsing
연결할 기기를 찾기위해서 Advertiser는 연결을 원한다고 주변에 Advertising합니다.
Browser는 연결가능한 기기를 Browsing합니다. 이때 Browser는 연결가능한 기기인 Advertiser의 peerID 정보를 얻게됩니다.
여기에서 연결을 능동적으로 요청할 수 있는 것은 Advertiser가 아닌 Browser입니다.
- Advertiser는 자신의 peerID만 주변에 advertising하기 때문에 주변에 어떤 peer가 있는지 알 수 없습니다. 따라서 수동적으로 연결을 기다리기만 해야합니다.
- 이와 달리 Browser는 주변 연결 가능한 peer를 찾고 연결을 진행할 수 있는 peerID 정보가 있기 때문에 원하는 기기를 선택해서 연결할 수도 있습니다.
-
Invite
browser는 연결 가능한 기기 중 하나를 선택하여 invite를 보냅니다.
func invitePeer(_ peerID: MCPeerID, to session: MCSession, withContext context: Data?, timeout: TimeInterval)
자신의 peerID, session, context(Data 타입), timeout(제한시간)과 함께 초대를 보냅니다.
-
초대 수락
초대를 받은 advertiser는 수락 여부를 결정합니다.
func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) { // 초대를 수락하여 연결하려면 true로 설정하고 세션을 전달합니다. invitationHandler(true, advertiserSession) }
-
초대를 수락한다면 마침내 session이 connected 상태가 됩니다.
이제 session이 연결된다면 서로 데이터를 주고받을 수 있습니다.
MPC는 크게 2단계로 나눌 수 있습니다. Discovery 단계와 Session 단계입니다.
- 발견 단계에서는 앱이
MCNearbyServiceBrowser
객체를 사용하여 주변의 피어(장치)를 탐색합니다. 선택적으로 MCBrowserViewController 객체를 사용하여 사용자에게 UI를 표시할 수도 있습니다. - 또한, 앱은
MCNearbyServiceAdvertiser
객체나MCAdvertiserAssistant
객체를 사용하여 주변의 피어들에게 자신이 사용 가능한 상태임을 알립니다. 이를 통해 다른 주변 장치에서 해당 앱을 세션에 초대할 수 있게 됩니다.
발견 단계에서는 앱이 다른 피어들과의 제한된 통신만 가능합니다. 이 단계에서 앱은 다른 피어들이 제공하는 discoveryInfo
데이터를 확인하거나, 세션에 초대하는 피어가 제공하는 컨텍스트 데이터를 얻을 수 있습니다.
- 사용자가 세션에 추가할 피어를 선택하면, 앱은 해당 피어들에게 세션에 참여할 초대를 보냅니다.
- 주변 장치에서 실행되는 앱은 초대를 수락할지 거부할지를 선택할 수 있으며, 사용자에게 승인 요청을 할 수 있습니다.
- 만약 피어가 초대를 수락하면,
MCNearbyServiceBrowser
는MCNearbyServiceAdvertiser
와 연결을 설정하고, 세션 단계가 시작됩니다. 이 단계에서는 앱이 세션 내에서 한 명 이상의 피어와 직접 통신할 수 있게 됩니다. - 이때 프레임워크는 델리게이트 콜백을 통해 피어가 세션에 참여하거나 떠날 때 앱에 알립니다.
- 만약 앱이 백그라운드로 이동하면, 프레임워크는 광고와 탐색을 중단하고, 열린 세션 연결을 종료합니다.
- 포그라운드로 돌아올 때, 프레임워크는 광고와 탐색을 자동으로 재개하지만, 개발자는 종료된 세션을 다시 설정해야 합니다.
- 연결작업을 진행할 때 한쪽은 advertiser, 다른쪽은 browser 역할을 수행해야 한다. 그렇지 않으면 2개의 독립적인 session이 존재할 것이다.
- 이것을 어떻게 정할 것이냐? NBI에서 역할을 지정해줄 것인가? 음…
- 아니면 코드 단에서 2 역할 모두 수행하게 하고 2개의 session이 유지되지 않도록 할까?
- wifi, bluetooth 모두 활성화가 안되어 있다면? 블루투스에 대한 alert를 띄워줘야 되겠지?
http://hidavidbae.blogspot.com/2014/01/ios7-multipeer-connectivity-framework.html