Skip to content

Nearby Interaction

Jinwon Choi edited this page Mar 19, 2025 · 1 revision
📝

Ultra Wide Band 지원하는 기기 간 거리와 방향을 감지하는 기술 방식

도입 배경

Multipeer Connectivity 사용 없이, Name Drop 방식의 기능을 도입하기 위한 방법을 조사하게 되었다.

Nearby Interaction이나 NFC 방식을 활용해 해당 기능을 구현할 수 있을 것이라고 생각했고,

그 중 Nearby Interaction 방식에 대해 정리하려고 한다.

개요

Nearby Interaction은 U1 칩을 탑재하고 있는 기기 간의 거리와 방향을 감지하는 기술이다.

iPhone 11+ Xcode 12+ iOS 14+

설명

핵심 기능

Nearby Interaction

U1 칩이 탑재된 기기의 위치를 고주파 기능을 사용해 획득한다.

상호 작용에 참여하기 위해 물리적으로 근접한 장치는 앱을 실행하고 위치와 장치 토큰을 고유하게 식별한다.

앱이 포그라운드에서 실행되면 피어의 방향과 거리를 미터 단위로 보고해 위치를 상호작용 세션에 알린다.

  • 디바이스 감지 : 주변 다른 iOS 기기를 탐색하고 감지, 이를 통해 주변에 있는 기기 식별하고 선택 가능
  • 데이터 교환 : 기기들 간의 데이터 교환 가능 (텍스트, 이미지, 파일 등)
  • 상호 작용 : 기기들끼리 서로 상호작용 가능
  • 위치 정보 : 상대 기기의 근접한 위치 정보 얻기 가능

Nearby Interaction 샘플 코드

https://developer.apple.com/documentation/nearbyinteraction/implementing-interactions-between-users-in-close-proximity

해당 샘플코드와 같은 방식으로 사용자는 Bluetooth 통해 근처 디바이스를 발견하고 상호작용 할 수 있다.

  • TranData NSCoding 프로토콜을 준수하는 간단한 데이터 모델. 데이터를 저장하고 검색하기 위해 인코딩 디코딩할 수있으며 발견된 근처 디바이스의 검색 토큰 / 충돌 여부 / 디바이스 관련 키워드 목록 / 디바이스 소유자 별명 및 이미지 정보를 포함한다.
  • NISessionManager Nearby Interaction 세션 관리하는 클래스. ObservableObject 프로코톨을 준수하며, 속성에 대한 변경 사항을 게시해 다른 객체가 해당 변경 사항을 관찰하고 대응할 수 있도록 한다.
  • 샘플 코드 분석
    • connectedPeers: 현재 연결된 근처 디바이스를 나타내는 MCPeerID 객체의 배열.
    • viewDidLoad() - startup() - 세션 생성
    • 현재 연결된 디바이스 존재하고, MPCSession이 존재한다면 세션 토큰 지정.
    • 공유된 토큰이 없다면, shareMyDiscoveryToken()으로 토큰 공유
    • 공유된 토큰이 없다면, 탐색중인 상태이므로 관련 애니메이션? 표시하고 MPC 시작

Nearby Interaction을 통한 Namedrop 흐름

  1. NISession 초기화 및 설정
    • 기기 간 근접 감지 세션을 생성하고, 연결 상태와 프로필 공유 이벤트를 관리합니다.
    • NISession은 주변 기기와 연결하고 정보를 주고받기 위한 기본 클래스입니다.
  2. Discovery Token 교환
    • 각 기기에는 고유한 discoveryToken이 있어 Nearby Interaction의 각 기기를 구분하는 역할을 합니다.
    • 두 기기가 서로의 discoveryToken을 교환하여, 두 기기 간의 세션이 형성되면 Nearby Interaction을 통해 거리 및 방향 정보를 받아 메이트 매칭을 진행할 수 있습니다.
    • discoveryToken을 교환하기 위해 Multipeer Connectivity 사용이 필요하다.
  3. 거리 및 방향 정보 업데이트
    • 두 기기 간의 거리 및 방향 정보를 실시간으로 업데이트하여, 특정 반경 내에 있는 경우에만 프로필을 공유하는 등의 조건을 설정할 수 있습니다.
  4. 프로필 공유 및 메이트 요청 전송
    • 두 기기가 특정 거리 및 방향으로 근접해 있으면 반려동물 프로필을 상대방 기기에 전송하여 화면에 표시합니다.
    • 상대방이 요청을 수락하면, 메이트가 되어 데이터베이스에 저장하거나 앱 내 메이트 목록에 추가합니다.

Nearby Interaction을 활용한 앱 적용 시 유의점

  • 호환 기기: Nearby Interaction은 U1 칩을 갖춘 iPhone 11 이상에서만 사용할 수 있다.
  • 거리 조건: 너무 가까이 대지 않아도 안정적인 연결 가능한 반경 조건을 설정하여 사용자 경험을 높일 수 있다.
  • 시각적 피드백: 사용자에게 기기를 맞대거나 근처에 놓도록 시각적 안내를 제공하는 것도 중요하다.

사용법

1. NISession 초기화 및 설정

먼저 NISession을 생성하고, 연결 상태를 관리하기 위해 NISessionDelegate를 사용합니다. 세션을 시작하면 사용자에게 Nearby Interaction 기능 사용에 대한 안내를 표시할 수 있습니다.

import NearbyInteraction

class NearbyInteractionManager: NSObject, NISessionDelegate {
    private var niSession: NISession?

    func startSession() {
        niSession = NISession()
        niSession?.delegate = self
        niSession?.run(NINearbyPeerConfiguration(peerToken: try! niSession!.discoveryToken!))
    }

    func session(_ session: NISession, didInvalidateWith error: Error) {
        print("Session was invalidated: \(error.localizedDescription)")
        // 재시도 로직 또는 오류 안내
    }

    func sessionWasSuspended(_ session: NISession) {
        print("Session was suspended")
        // 필요한 경우 세션 일시 정지 처리
    }

    func sessionSuspensionEnded(_ session: NISession) {
        print("Session suspension ended")
        // 필요 시 세션 재개
    }
}

2. Discovery Token 교환

Nearby Interaction은 각 기기가 서로의 discoveryToken을 알아야 연결할 수 있습니다. 이를 위해, Bluetooth나 인터넷을 통한 별도 방법으로 토큰을 교환한 후, 세션을 시작할 수 있습니다.

func startPeerSession(with peerToken: NIDiscoveryToken) {
    let config = NINearbyPeerConfiguration(peerToken: peerToken)
    niSession?.run(config)
}

3. 거리 및 방향 정보 업데이트

Nearby Interaction은 두 기기 간의 거리 및 방향 정보를 NISessionDelegatesession(_:didUpdate:) 메서드를 통해 제공합니다. 이를 이용하여 일정 거리 안에 있는 경우에만 메이트 요청을 표시할 수 있습니다.

func session(_ session: NISession, didUpdate nearbyObjects: [NINearbyObject]) {
    guard let nearbyObject = nearbyObjects.first else { return }
    // 거리와 방향 정보를 바탕으로 메이트 요청 표시 조건을 설정
}

func showMateRequest(for nearbyObject: NINearbyObject) {
    // 프로필 정보 공유 및 메이트 요청 UI 표시
}

4. 프로필 공유 및 메이트 요청 수락

기기가 근접해 특정 거리 이내에 들어오면 showMateRequest(for:) 메서드에서 메이트 요청 화면을 띄우고, 수락 시 프로필 교환과 메이트 정보를 추가로 저장합니다.

func showMateRequest(for nearbyObject: NINearbyObject) {
    // 요청 알림 또는 팝업 표시
    // 알림을 현재 화면에 표시
}

func confirmMateRequest() {
    // 수락 시 프로필 및 메이트 관계 정보 저장
    saveMateInformation()
}

Ref.


https://developer.apple.com/documentation/nearbyinteraction/

https://developer.apple.com/design/human-interface-guidelines/nearby-interactions

https://developer.apple.com/documentation/nearbyinteraction/initiating-and-maintaining-a-session

https://developer.apple.com/kr/videos/play/wwdc2022/10008/

https://m.blog.naver.com/jasonrewriter/222132246904

https://bokoo.tistory.com/entry/iOS-NearbyInteraction%EB%9E%80

Welcome to SniffMEET Wiki!

💬 허거덩 팀 규칙

개발 일지

구조
NI, MPC
프로파일링
리팩토링/리디자인
테스트
Supabase

기술 공유

회의록

회의록

트러블 슈팅

발표

💬 허거덩 팀 규칙

Clone this wiki locally