Nearby Interaction - Team-HGD/SniffMEET GitHub Wiki
Ultra Wide Band ์ง์ํ๋ ๊ธฐ๊ธฐ ๊ฐ ๊ฑฐ๋ฆฌ์ ๋ฐฉํฅ์ ๊ฐ์งํ๋ ๊ธฐ์ ๋ฐฉ์
Multipeer Connectivity ์ฌ์ฉ ์์ด, Name Drop ๋ฐฉ์์ ๊ธฐ๋ฅ์ ๋์ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์กฐ์ฌํ๊ฒ ๋์๋ค.
Nearby Interaction์ด๋ NFC ๋ฐฉ์์ ํ์ฉํด ํด๋น ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ณ ,
๊ทธ ์ค Nearby Interaction ๋ฐฉ์์ ๋ํด ์ ๋ฆฌํ๋ ค๊ณ ํ๋ค.
Nearby Interaction์ U1 ์นฉ์ ํ์ฌํ๊ณ ์๋ ๊ธฐ๊ธฐ ๊ฐ์ ๊ฑฐ๋ฆฌ์ ๋ฐฉํฅ์ ๊ฐ์งํ๋ ๊ธฐ์ ์ด๋ค.
iPhone 11+ Xcode 12+ iOS 14+
U1 ์นฉ์ด ํ์ฌ๋ ๊ธฐ๊ธฐ์ ์์น๋ฅผ ๊ณ ์ฃผํ ๊ธฐ๋ฅ์ ์ฌ์ฉํด ํ๋ํ๋ค.
์ํธ ์์ฉ์ ์ฐธ์ฌํ๊ธฐ ์ํด ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ทผ์ ํ ์ฅ์น๋ ์ฑ์ ์คํํ๊ณ ์์น์ ์ฅ์น ํ ํฐ์ ๊ณ ์ ํ๊ฒ ์๋ณํ๋ค.
์ฑ์ด ํฌ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ฉด ํผ์ด์ ๋ฐฉํฅ๊ณผ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฏธํฐ ๋จ์๋ก ๋ณด๊ณ ํด ์์น๋ฅผ ์ํธ์์ฉ ์ธ์ ์ ์๋ฆฐ๋ค.
- ๋๋ฐ์ด์ค ๊ฐ์ง : ์ฃผ๋ณ ๋ค๋ฅธ iOS ๊ธฐ๊ธฐ๋ฅผ ํ์ํ๊ณ ๊ฐ์ง, ์ด๋ฅผ ํตํด ์ฃผ๋ณ์ ์๋ ๊ธฐ๊ธฐ ์๋ณํ๊ณ ์ ํ ๊ฐ๋ฅ
- ๋ฐ์ดํฐ ๊ตํ : ๊ธฐ๊ธฐ๋ค ๊ฐ์ ๋ฐ์ดํฐ ๊ตํ ๊ฐ๋ฅ (ํ ์คํธ, ์ด๋ฏธ์ง, ํ์ผ ๋ฑ)
- ์ํธ ์์ฉ : ๊ธฐ๊ธฐ๋ค๋ผ๋ฆฌ ์๋ก ์ํธ์์ฉ ๊ฐ๋ฅ
- ์์น ์ ๋ณด : ์๋ ๊ธฐ๊ธฐ์ ๊ทผ์ ํ ์์น ์ ๋ณด ์ป๊ธฐ ๊ฐ๋ฅ
ํด๋น ์ํ์ฝ๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ์๋ Bluetooth ํตํด ๊ทผ์ฒ ๋๋ฐ์ด์ค๋ฅผ ๋ฐ๊ฒฌํ๊ณ ์ํธ์์ฉ ํ ์ ์๋ค.
- TranData NSCoding ํ๋กํ ์ฝ์ ์ค์ํ๋ ๊ฐ๋จํ ๋ฐ์ดํฐ ๋ชจ๋ธ. ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๊ธฐ ์ํด ์ธ์ฝ๋ฉ ๋์ฝ๋ฉํ ์์์ผ๋ฉฐ ๋ฐ๊ฒฌ๋ ๊ทผ์ฒ ๋๋ฐ์ด์ค์ ๊ฒ์ ํ ํฐ / ์ถฉ๋ ์ฌ๋ถ / ๋๋ฐ์ด์ค ๊ด๋ จ ํค์๋ ๋ชฉ๋ก / ๋๋ฐ์ด์ค ์์ ์ ๋ณ๋ช ๋ฐ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ํฌํจํ๋ค.
- NISessionManager Nearby Interaction ์ธ์ ๊ด๋ฆฌํ๋ ํด๋์ค. ObservableObject ํ๋ก์ฝํจ์ ์ค์ํ๋ฉฐ, ์์ฑ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒ์ํด ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ ๊ด์ฐฐํ๊ณ ๋์ํ ์ ์๋๋ก ํ๋ค.
- ์ํ ์ฝ๋ ๋ถ์
- connectedPeers: ํ์ฌ ์ฐ๊ฒฐ๋ ๊ทผ์ฒ ๋๋ฐ์ด์ค๋ฅผ ๋ํ๋ด๋ MCPeerID ๊ฐ์ฒด์ ๋ฐฐ์ด.
- viewDidLoad() - startup() - ์ธ์ ์์ฑ
- ํ์ฌ ์ฐ๊ฒฐ๋ ๋๋ฐ์ด์ค ์กด์ฌํ๊ณ , MPCSession์ด ์กด์ฌํ๋ค๋ฉด ์ธ์ ํ ํฐ ์ง์ .
- ๊ณต์ ๋ ํ ํฐ์ด ์๋ค๋ฉด, shareMyDiscoveryToken()์ผ๋ก ํ ํฐ ๊ณต์
- ๊ณต์ ๋ ํ ํฐ์ด ์๋ค๋ฉด, ํ์์ค์ธ ์ํ์ด๋ฏ๋ก ๊ด๋ จ ์ ๋๋ฉ์ด์ ? ํ์ํ๊ณ MPC ์์
- NISession ์ด๊ธฐํ ๋ฐ ์ค์
- ๊ธฐ๊ธฐ ๊ฐ ๊ทผ์ ๊ฐ์ง ์ธ์ ์ ์์ฑํ๊ณ , ์ฐ๊ฒฐ ์ํ์ ํ๋กํ ๊ณต์ ์ด๋ฒคํธ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- NISession์ ์ฃผ๋ณ ๊ธฐ๊ธฐ์ ์ฐ๊ฒฐํ๊ณ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค.
- Discovery Token ๊ตํ
- ๊ฐ ๊ธฐ๊ธฐ์๋ ๊ณ ์ ํ discoveryToken์ด ์์ด Nearby Interaction์ ๊ฐ ๊ธฐ๊ธฐ๋ฅผ ๊ตฌ๋ถํ๋ ์ญํ ์ ํฉ๋๋ค.
- ๋ ๊ธฐ๊ธฐ๊ฐ ์๋ก์ discoveryToken์ ๊ตํํ์ฌ, ๋ ๊ธฐ๊ธฐ ๊ฐ์ ์ธ์ ์ด ํ์ฑ๋๋ฉด Nearby Interaction์ ํตํด ๊ฑฐ๋ฆฌ ๋ฐ ๋ฐฉํฅ ์ ๋ณด๋ฅผ ๋ฐ์ ๋ฉ์ดํธ ๋งค์นญ์ ์งํํ ์ ์์ต๋๋ค.
- discoveryToken์ ๊ตํํ๊ธฐ ์ํด Multipeer Connectivity ์ฌ์ฉ์ด ํ์ํ๋ค.
- ๊ฑฐ๋ฆฌ ๋ฐ ๋ฐฉํฅ ์ ๋ณด ์
๋ฐ์ดํธ
- ๋ ๊ธฐ๊ธฐ ๊ฐ์ ๊ฑฐ๋ฆฌ ๋ฐ ๋ฐฉํฅ ์ ๋ณด๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํ์ฌ, ํน์ ๋ฐ๊ฒฝ ๋ด์ ์๋ ๊ฒฝ์ฐ์๋ง ํ๋กํ์ ๊ณต์ ํ๋ ๋ฑ์ ์กฐ๊ฑด์ ์ค์ ํ ์ ์์ต๋๋ค.
- ํ๋กํ ๊ณต์ ๋ฐ ๋ฉ์ดํธ ์์ฒญ ์ ์ก
- ๋ ๊ธฐ๊ธฐ๊ฐ ํน์ ๊ฑฐ๋ฆฌ ๋ฐ ๋ฐฉํฅ์ผ๋ก ๊ทผ์ ํด ์์ผ๋ฉด ๋ฐ๋ ค๋๋ฌผ ํ๋กํ์ ์๋๋ฐฉ ๊ธฐ๊ธฐ์ ์ ์กํ์ฌ ํ๋ฉด์ ํ์ํฉ๋๋ค.
- ์๋๋ฐฉ์ด ์์ฒญ์ ์๋ฝํ๋ฉด, ๋ฉ์ดํธ๊ฐ ๋์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ฑฐ๋ ์ฑ ๋ด ๋ฉ์ดํธ ๋ชฉ๋ก์ ์ถ๊ฐํฉ๋๋ค.
- ํธํ ๊ธฐ๊ธฐ: Nearby Interaction์ U1 ์นฉ์ ๊ฐ์ถ iPhone 11 ์ด์์์๋ง ์ฌ์ฉํ ์ ์๋ค.
- ๊ฑฐ๋ฆฌ ์กฐ๊ฑด: ๋๋ฌด ๊ฐ๊น์ด ๋์ง ์์๋ ์์ ์ ์ธ ์ฐ๊ฒฐ ๊ฐ๋ฅํ ๋ฐ๊ฒฝ ์กฐ๊ฑด์ ์ค์ ํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๋์ผ ์ ์๋ค.
- ์๊ฐ์ ํผ๋๋ฐฑ: ์ฌ์ฉ์์๊ฒ ๊ธฐ๊ธฐ๋ฅผ ๋ง๋๊ฑฐ๋ ๊ทผ์ฒ์ ๋๋๋ก ์๊ฐ์ ์๋ด๋ฅผ ์ ๊ณตํ๋ ๊ฒ๋ ์ค์ํ๋ค.
๋จผ์ 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")
// ํ์ ์ ์ธ์
์ฌ๊ฐ
}
}Nearby Interaction์ ๊ฐ ๊ธฐ๊ธฐ๊ฐ ์๋ก์ discoveryToken์ ์์์ผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด, Bluetooth๋ ์ธํฐ๋ท์ ํตํ ๋ณ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ ํฐ์ ๊ตํํ ํ, ์ธ์
์ ์์ํ ์ ์์ต๋๋ค.
func startPeerSession(with peerToken: NIDiscoveryToken) {
let config = NINearbyPeerConfiguration(peerToken: peerToken)
niSession?.run(config)
}Nearby Interaction์ ๋ ๊ธฐ๊ธฐ ๊ฐ์ ๊ฑฐ๋ฆฌ ๋ฐ ๋ฐฉํฅ ์ ๋ณด๋ฅผ NISessionDelegate์ session(_:didUpdate:) ๋ฉ์๋๋ฅผ ํตํด ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ ์ผ์ ๊ฑฐ๋ฆฌ ์์ ์๋ ๊ฒฝ์ฐ์๋ง ๋ฉ์ดํธ ์์ฒญ์ ํ์ํ ์ ์์ต๋๋ค.
func session(_ session: NISession, didUpdate nearbyObjects: [NINearbyObject]) {
guard let nearbyObject = nearbyObjects.first else { return }
// ๊ฑฐ๋ฆฌ์ ๋ฐฉํฅ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๋ฉ์ดํธ ์์ฒญ ํ์ ์กฐ๊ฑด์ ์ค์
}
func showMateRequest(for nearbyObject: NINearbyObject) {
// ํ๋กํ ์ ๋ณด ๊ณต์ ๋ฐ ๋ฉ์ดํธ ์์ฒญ UI ํ์
}๊ธฐ๊ธฐ๊ฐ ๊ทผ์ ํด ํน์ ๊ฑฐ๋ฆฌ ์ด๋ด์ ๋ค์ด์ค๋ฉด showMateRequest(for:) ๋ฉ์๋์์ ๋ฉ์ดํธ ์์ฒญ ํ๋ฉด์ ๋์ฐ๊ณ , ์๋ฝ ์ ํ๋กํ ๊ตํ๊ณผ ๋ฉ์ดํธ ์ ๋ณด๋ฅผ ์ถ๊ฐ๋ก ์ ์ฅํฉ๋๋ค.
func showMateRequest(for nearbyObject: NINearbyObject) {
// ์์ฒญ ์๋ฆผ ๋๋ ํ์
ํ์
// ์๋ฆผ์ ํ์ฌ ํ๋ฉด์ ํ์
}
func confirmMateRequest() {
// ์๋ฝ ์ ํ๋กํ ๋ฐ ๋ฉ์ดํธ ๊ด๊ณ ์ ๋ณด ์ ์ฅ
saveMateInformation()
}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