[Swift] WWDC21 Explore Nearby Interaction with third-party accessories

 

안녕하세요. 미닛메이드 Minnit 입니다😋

 

UWB에 대해서 공부를 해보다가 WWDC21 에서 발표한 U1 칩이 장착된 기기와

UWB 가 장착된 타사 악세서리와의 상호작용에 대해 정리해봤습니다!

 

간단하게 UWB의 설명과 함께 요약해보도록 하겠습니다 👐🏻

 


UWB란?

Ultra-Wideband 라는 뜻으로, 짧은 시간의 펄스 신호를 사용하여 넓은 주파수 대역으로 데이터를 송수신하는 근거리 무선통신 기술. 구체적으로는 500 MHz 이상의 넓은 주파수 폭, 낮은 출력의 전파를 사용하는 무선통신 기술이다.

UWB는 넓은 주파수 대역과 낮은 출력 전파를 특징으로 가져 안전하고 오차 범위가 적은 무선통신 기술입니다

애플은 이 UWB 기술을 위해 U1 칩을 제작해 아이폰, 애플워치 등에 적용하기 시작했습니다

U1 칩이 바로 UWB를 위한 큰 그림이었던 것.... 

현재 U1 칩이 장착된 기기는

  • 아이폰 11, 아이폰 11 프로, 아이폰 11 프로 맥스
  • 아이폰 12, 아이폰 12 미니, 아이폰 12 프로 ,아이폰 12 프로 맥스
  • 애플워치 시리즈 6,홈팟 미니

등이 있는데 이번 신제품 아이폰13 시리즈에도 U1 칩이 장착되어 있을 것 같습니다 👊🏻

간단히 U1칩은 무선통신 UWB 통신을 위한 칩이라는 것을 알아둔 상태에서

요약을 읽으면 더 쉽게 이해가 될 것 같습니다 ㅎㅎ 

( 또한 아래에서 말하는 모든 애플 기기는 U1칩이 장착된 기기입니다 )

 

Third - party Accessory API

 

이전 U1 칩을 가진 애플 기기간 UWB 통신을 하기 위해서는

NINearbyPeerConfiguration 를 사용한다

 

이제 U1 칩을 가진 애플 기기와 타 액세서리가 UWB 통신을 하기 위해서는

NINearbyAccessoryConfiguration 을 사용해 session을 생성할 수 있게 된다

( iOS 15부터 적용 )

 

NINearbyAccessoryConfiguration를 연결하려면 액세서리를 설명하는 데이터가 필요하기 때문에 

이 데이터는 액세서리 안에서 생성되어 받아올 수 있어야 한다

 

func setupAccessory(_ configData: Data, name: String) {
        updateInfoLabel(with: "Received configuration data from '\(name)'. Running session.")
        do {
            configuration = try NINearbyAccessoryConfiguration(data: configData) 
            // 주어진 데이터와 애플 기기와의 상호작용 시도
        } catch {
            // 수신 데이터 오류
            updateInfoLabel(with: "Failed to create NINearbyAccessoryConfiguration for '\(name)'. Error: \(error)")
            return
        }
        
        // Cache the token to correlate updates with this accessory.
        cacheToken(configuration!.accessoryDiscoveryToken, accessoryName: name) 
        // 연결된 장치 토큰과 장치 이름 저장하는 함수 실행
        niSession.run(configuration!) 
        // 이 장치와 session 실행
    }
  • cacheToken(configuration!.accessoryDiscoveryToken, accessoryName: name) → accessoryDiscoveryToken과 이름을 매치시키는 것이 유용하게 쓰임. 나중에 NearbyObject 업데이트를 받기 시작하면 이 토큰과 이름을 사용하여 업데이트를 다시 연관시킬 수 있기 때문
  • 상호 작용을 관리하기 위해 NISession 인스턴스와 NISession Delegate를 사용함
  • session을 시작하려면 run 기능을 실행
  • 우리가 액세서리를 알기 위해(구분하기 위해) Accessory Configuration Data가 필요한 것처럼, 액세서리도 그런 데이터가 필요함(반대로 우리는 구분/알 수 있는) → 그것이 바로 Shareable Configuration Data.
  • 이 데이터를 didGenerateShareableConfigurationData를 통해 얻을 수 있음 (iOS 15)

 

func session(_ session: NISession, didGenerateShareableConfigurationData shareableConfigurationData: Data, for object: NINearbyObject) {
   guard let conn = getConnection(object: object) else { return }

   conn.sendShareableConfigurationData(data)
 }
  • Shareable Configuration Data를 빨리 전송해야 함. 아니면 session 시간 초과될 수 있음
  • session의 시간 초과는 didRemove 를 통해 전달

 

func session(_ session: NISession, didRemove nearbyObjects: [NINearbyObject], reason: NINearbyObject.RemovalReason) {
        
        guard reason == .timeout else { return }
        updateInfoLabel(with: "Session with '\(self.connectedAccessoryName ?? "accessory")' timed out.")
        
        // The session runs with one accessory.
        guard let accessory = nearbyObjects.first else { return }
        

        // Consult helper function to decide whether or not to retry.
        if shouldRetry(accessory) {
            if let config = session.configuration {
                 session.run(config)
            }
        }
    }
  • reason을 먼저 확인
  • .timeout일 때는 액세서리가 아직 근처에 있다고 확신한다면 다시 연결을 시도
  • 다시 연결을 시도하기로 했다면 동일한 구성으로 다시 run을 실행하면 됨. 세션이 종료됐다면 위와 같은 과정을 다시 거쳐야 함

 

이 과정을 이미지로 표현한다면 👇🏻

 

이제 Accessory가 Shareable Configuration Data를 전달받았다면

앱의 NISession과 상호작용하기 위한 구성을 실행함

그리고 기기와 액세서리가 서로 가까이 있다면 거리 및 방향을 포함하는 NINearbyObject를 제공

 

기기와 액세서리의 session이 run 중일 때

액세서리에 대한 update는 didUpdate 콜백을 통해 전달받을 수 있음

 

또한 Session 권한 허용에 관한 것도 달라지는데

iOS14 NSNearbyInteractionUsageDescription

iOS 14에서는 앱에서 session을 처음 실행할 때 허용받아야 하고

이것은 일회성이기 때문에 다른 session에서도 다시 추가 허용 alert이 뜰 수 있음

선택지 : 허용 안 함, 한 번만 허용

 

iOS15 NSNearbyInteractionUsageDescription

하지만 iOS 15에서는 NISession을 처음 실행할 때 자동으로 권한 허용 alert이 뜨고

OK는 앱을 사용하는 동안 허용한다는 뜻

어느 것을 선택하든 이 alert은 다시 뜨지 않고,

변경하고 싶다면 설정(setting)에 사용자가 들어가서 변경해야 함

추가 정보 (WWDC20 - Meet Nearby Interaction)

 

WWDC20 Meet Nearby Interaction은 애플 기기간의 UWB 를 다룬 내용인데

이 영상을 먼저 보고 third-party accessories 영상을 보면 더 이해가 쉽다

 

Meet Nearby Interaction 에서 설명한 정보를 조금 적어보자면 

기기의 앱이 background 모드라면 session이 종료될 수 있다는 점을 기억해야 한다

foreground 일 때만 session을 주고받을 수 있다는 점을 유의해서 사용해야 한다

 

또한 NINearbyObject 에 대한 내용이 나오는데

이 코드를 보면 알 수 있지만

distance 와 direction은 nullable 한 값이라는 걸 기억해야 한다!

왜 얘들은 nullable 한 값이냐면...

애플 기기에는 시야각이 존재하기 때문이다 !

 

핸드폰 뒷면을 기준으로 원뿔 모양의 시야각이 존재하기 때문에 

그 시야각을 넘어간다면 null 값이 들어올 수 있다는 것을 기억하고 ( 특히 direction )

코드를 작성해야 한다고 한다

 

 


 

이렇게 WWDC21 - Explore Nearby Interaction with third-party accessories 에 대해 살펴봤습니다~

UWB를 공부하다가 여기까지 파버린... ㅎㅎ

 

영상을 보면서 느낀 점은 UWB가 앞으로 어떻게 활용될지 너무 궁금했고

한국 시간 기준 9월 15일에 진행되는 애플 이벤트에서 

iOS 15, 아이폰 13을 소개하면서 UWB의 활용에 대해 언급을 할 것 같다고 생각이 들었습니다!

 

다음에는 UWB를 더 정리해서 올려보도록 할게요 🐶

혹시 더 궁금하신 점이 있다면

댓글! 꼬옥 달아주세요 감사합니다 :)

 

 

 

애플 WWDC21 - Explore Nearby Interaction with third-party accessories의

원본 영상을 보시려면 여기 !

 

Explore Nearby Interaction with third-party accessories - WWDC21 - Videos - Apple Developer

Discover how your app can interact with Ultra Wideband (UWB) third-party accessories when running on a U1-equipped device. We'll show you...

developer.apple.com