3주차 발표 자료 - Team-HGD/SniffMEET GitHub Wiki

SniffMEET Design

이번 주 HGD의 목표

MVP 핵심 기능 대부분 구현

메이트 맺기 - Name drop

NameDrop

  • Multipeer Connectivity
  • Neerby Interaction

이번주 진행 상황

HGD의 PoC(Proof of Concept): Name drop 기능 = MPC + NI

  • MPC + NI 관계

Screenshot 2024-11-14 at 1 48 06 AM

→ 각각의 기능에 대해서 동작 확인

NetworkLayer

  • SNMRequestConvertible
public protocol SNMRequestConvertible {
    var endpoint: Endpoint { get }
    var requestType: SNMRequestType { get }
}
  • NetworkProvider
protocol NetworkProvider {
    func request(with: any SNMRequestConvertible) async throws -> SNMNetworkResponse
}
  • SNMNetworkResponse
public final class SNMNetworkResponse {
    public let statusCode: Int
    public let data: Data
    public let response: HTTPURLResponse?

    public init(statusCode: Int, data: Data, response: HTTPURLResponse? = nil) {
        self.statusCode = statusCode
        self.data = data
        self.response = response
    }
}
  • Supabase 세팅

트러블슈팅

지속적인 Advertising 과 Browsing

Nearby Interaction은 Multipeer connectivity 세션이 연결된 뒤에만 사용 가능

Namedrop처럼 기능을 구현하기 위해서는 지속적인 Advertising / Browsing이 필요한 상황

Energy Impact가 높아지는 문제 발생

Screenshot 2024-11-14 at 4 23 40 PM

→ 이번 주에는 버튼을 누르면 Session을 시작하는 방식으로 구현

발표용 메인 화면

MPC와 7명의 피어들

🤔

kMCSessionMaximumNumberOfPeers = 8

https://developer.apple.com/documentation/multipeerconnectivity/kmcsessionmaximumnumberofpeers

  • 7명 안에 내가 맺고 싶은 메이트가 있을까?
  • 7명 안에 나의 메이트가 없다면 어떻게 할까?

해결책

  • LFU (선착순)
  • TTL (시간 제한)

→ 지금 단계에서 고민하긴 이르다, 일단은 세션이 맺어진 순서대로(7명)

7명 중에 설정한 거리 조건에 해당하는 사람과 프로필 데이터 공유

Nearby Interaction discoveryToken 아카이빙 문제

// discoveryToken Data 형태로 직렬화해 전송 - 데이터 교환을 위한 MPC 이용
do {
		let tokenData = try NSKeyedArchiver.archivedData(withRootObject: discoveryToken, requiringSecureCoding: true)
		mpcManager.send(mateData: tokenData)
		log.info("Discovery token sent to peer.")
} catch {
    log.error("Failed to encode discovery token: \(error)")
}

// discoveryToken(Data 형태) 수신해서 discoveryToken 형태로 변경해 niSession 시작
do {
    guard let token = try NSKeyedUnarchiver.unarchivedObject(ofClass: NIDiscoveryToken.self, from: data) else {
        log.info("Invalid discovery token received.")
        return
    }
    
    let config = NINearbyPeerConfiguration(peerToken: token)
    niSession?.run(config)
    log.info("NearbyInteraction session started with received discovery token.")
} catch {
    log.error("Failed to decode discovery token: \(error)")
}
// MPCManager.swift 데이터 전달받아 교환

// func send(mateData: Encodable) {
func send(mateData: Data) {
    if !session.connectedPeers.isEmpty {
        do {
		        // if let data = try? JSONEncoder().encode(mateData) {}
            try session.send(data, toPeers: session.connectedPeers, with: .reliable)
        } catch {
            log.error("error sending \(error.localizedDescription)")
        }
    }
}

산출물

ScreenRecording_11-15-2024.10-17-30_1.MOV
IMG_0535.MOV

다음 주 계획

  • Namedrop처럼 자연스러운 인터랙션 만들기 및 프로필 정보 교환
    • 몇 cm까지 어느 방향으로 맞닿아야 프로필 교환으로 인식할지 결정
    • 애니메이션
  • 산책 요청 기능 구현
  • 부족한 부분 추가 & 개선 작업
⚠️ **GitHub.com Fallback** ⚠️