View in English

  • 메뉴 열기 메뉴 닫기
  • Apple Developer
검색
검색 닫기
  • Apple Developer
  • 뉴스
  • 둘러보기
  • 디자인
  • 개발
  • 배포
  • 지원
  • 계정
페이지에서만 검색

빠른 링크

5 빠른 링크

비디오

메뉴 열기 메뉴 닫기
  • 컬렉션
  • 주제
  • 전체 비디오
  • 소개

WWDC25 컬렉션으로 돌아가기

  • 소개
  • 요약
  • 자막 전문
  • 코드
  • Wi-Fi Aware로 기기 연결성 강화하기

    Wi-Fi Aware로 P2P 네트워크 연결을 만드는 방법을 알아보세요. 또한 개선된 대역폭과 낮은 지연 시간으로 실시간으로 비디오를 공유하고, 대용량 파일을 전송하며, 액세서리를 제어하는 방법도 소개합니다. 그리고 DeviceDiscoveryUI, AccessorySetupKit 및 Network 프레임워크를 사용하여 앱에서 Wi-Fi Aware를 사용하는 방법도 학습할 수 있습니다.

    챕터

    • 0:00 - 서론
    • 1:01 - 개요
    • 7:46 - 페어링
    • 15:05 - 연결
    • 19:01 - 최적화
    • 22:26 - 가이드라인

    리소스

    • Accessory Design Guidelines
    • Wi-Fi Aware
      • HD 비디오
      • SD 비디오

    관련 비디오

    WWDC24

    • AccessorySetupKit 소개
  • 비디오 검색…

    안녕하세요 저는 Swetank입니다 Wi-Fi 팀의 엔지니어로 일하고 있습니다 오늘은 Wi-Fi Aware 프레임워크를 소개하고 이 프레임워크를 통해 앱에서 기기 간 상호 작용을 강화하는 방법을 알려 드릴게요 먼저, Wi-Fi Aware에 대한 개요로 시작하겠습니다 그다음, 앱에 Wi-Fi Aware를 통합하는 방법을 설명해 드리고

    기기가 안전하게 발견되고 페어링되도록 DeviceDiscoveryUI와 AccessorySetupKit 프레임워크를 사용하는 방법을 다룰게요 페어링 후에는 Network 프레임워크로 Wi-Fi Aware 연결을 설정하는 방법을 설명할게요 연결 후에는 Wi-Fi Aware 연결의 성능을 모니터링하고 최적화하는 방법을 살펴보고 중요한 다음 단계를 논의하며 세션을 마무리할게요 개요부터 시작해 보죠 Wi-Fi Aware는 기기 간 직접적인 통신을 지원합니다 라우터나 중앙 서버에 의존하는 기존 모델과 달리 진정한 P2P 통신입니다

    이 연결은 동적이며 요청에 따라 생성되죠 기기는 런타임에 서로를 찾고 안전한 연결을 형성할 수 있습니다 이는 파일 공유, 액세서리 설정과 같은 일시적인 로컬 경험에 유용합니다 Wi-Fi Aware는 일반 Wi-Fi 연결과 함께 작동합니다 즉, 기기는 Wi-Fi Aware를 사용하면서도 인터넷과 로컬 네트워크에 연결된 상태를 유지할 수 있죠 Wi-Fi Aware는 Wi-Fi Alliance에서 유지 관리하는 전 세계적 표준으로 크로스 플랫폼이며 상호 운용되고 모든 기기 제조업체에서 채택할 수 있습니다 Wi-Fi Aware를 통해 새 경험을 구현하고 앱에서 근처 기기를 자동으로 탐색하고 연결하도록 할 수 있습니다 구현 가능한 기능으로는 미디어 스트리밍, 고속 파일 전송 액세서리 제어, 화면 공유 등이 있으며 필요에 따라 모든 기능을 동시에 사용할 수도 있죠

    Wi-Fi Aware는 iPhone과 iPad에서 이러한 경험을 지원하는 새 프레임워크입니다 Wi-Fi Aware 프레임워크를 통해 앱은 다른 Apple 기기나 타사 기기, 심지어 액세서리와도 연결될 수 있습니다

    Wi-Fi Aware를 사용하면 연결이 Wi-Fi 레이어에서 완전히 인증 및 암호화되고 전송 속도가 높아지고 지연 시간이 감소하며 다른 근처 기기와의 연결과 동시에 활용할 수 있습니다

    앱에서 Wi-Fi Aware를 사용하려면 고수준 흐름 2개를 처리해야 하죠 첫 번째 흐름은 기기 페어링입니다

    페어링은 신뢰를 수립하고 안전한 통신이 원활하게 이루어지도록 하는 단일 설정 프로세스입니다 두 번째 흐름은 페어링된 기기 연결입니다 시스템은 기기 간 연결을 자동으로 보호하며 키 교환 및 링크 암호화를 포함하므로 보안 프로토콜을 관리할 필요가 없습니다 페어링이 완료되면 기기가 가까이 있고 앱을 실행하고 있을 때 앱이 안전하게 재연결됩니다 즉, 기기로의 재연결이 원활하고 빠르며 안전합니다 이제 Wi-Fi Aware를 사용하도록 앱을 설정하는 방법을 살펴볼게요 먼저 Wi-Fi Aware의 핵심 개념인 서비스를 설명할게요 서비스는 기기를 검색하고 여기에 연결하는 데 사용됩니다 서비스를 앱이 제공하거나 다른 기기를 통해 활용하는 특정 기능이라고 생각하시면 됩니다 앱에서 서비스를 선언하는 방법을 다루기 전에 서비스에 관한 몇 가지 주요 규칙을 설명할게요

    서비스는 이름으로 식별됩니다

    서비스 이름은 고유해야 하며 영문자, 숫자, 하이픈만 포함되어야 하며 15자 이내여야 합니다

    완전한 서비스 이름은 두 부분으로 구성됩니다

    고유한 이름 뒤에 프로토콜이 이어지죠 프로토콜은 TCP를 사용하는 서비스에는 tcp 다른 프로토콜을 사용하는 서비스에는 udp를 사용합니다

    내 앱의 다른 서비스 이름 및 다른 앱에서 사용하는 이름과의 충돌을 방지하려면 서비스 이름을 IANA에 등록하면 됩니다

    다음으로 서비스 역할에 대해 설명하겠습니다 Wi-Fi Aware는 특정 서비스에 대해 두 가지 역할을 지원합니다 첫째는 퍼블리셔로, 앱이 서비스를 호스트하고 서버로서 기능하며 다른 기기와의 연결을 수신하기 위해 대기합니다

    두 번째는 서브스크라이버로 앱이 서비스를 사용하고 클라이언트로서 기능하며 연결할 다른 기기를 검색합니다

    필요에 따라 애플리케이션은 퍼블리셔와 서브스크라이버 역할을 동시에 수행할 수 있습니다

    앱의 Info.plist 파일은 앱에서 사용하려는 서비스를 명시합니다 서비스를 명시하려면 WiFiAwareServices 키를 추가하세요 이 딕셔너리에서는 서비스 이름이 키가 되고 대응되는 값이 서비스의 구성이 됩니다 이 예시에서는 앱이 파일 서비스, 드론 서비스 등 두 개의 서비스를 선언합니다

    각 서비스는 구성 속성 딕셔너리를 갖추고 있습니다

    퍼블리싱 서비스를 만들려면 Publishable 키를 포함하세요 서브스크라이빙 서비스를 만들려면 Subscribable 키를 포함합니다 이 파일 서비스는 퍼블리싱과 서브스크라이빙이 모두 가능합니다 앱 간 사용 사례를 빌드할 때 흔히 이렇게 처리합니다

    반면 드론 서비스는 서브스크라이빙만 하도록 선언됐는데 액세서리와 통신하는 앱을 개발할 때 보통 이렇게 처리하죠 앱이 Info.plist에 선언된 서비스만 퍼블리싱하거나 서브스크라이빙할 수 있다는 점을 기억하세요 이제 코드를 보면서 Info.plist에 선언된 기기 기능과 서비스에 접근하는 방법을 설명하겠습니다

    애플리케이션이 Wi-Fi Aware를 사용하기 전에 먼저 해당 기기가 이를 지원하는지 확인해야 합니다 이는 WACapabilities의 supportedFeatures 속성을 통해 확인할 수 있습니다

    Info.plist에 정의된 Publishable 서비스는 WAPublishableService를 통해 제공됩니다 이 예시에서는 나중에 서비스에 편리하게 접근하기 위해 정적 속성 fileService를 정의했습니다 Subscribable 서비스는 WASubscribableService를 통해 접근합니다 나중에 편리하게 참조하기 위해 fileService, droneService라는 두 개의 정적 속성이 정의되었습니다

    앱에 Wi-Fi Aware 서비스를 추가하는 방법을 알아보았으니 Wi-Fi Aware 기기를 페어링하는 방법을 설명하겠습니다 우선 앱의 사용자에게 페어링 흐름이 어떻게 표시되는지 설명할게요 앞에서 설명했듯이 Wi-Fi Aware 기기를 사용하기 전에 앱이 페어링을 진행합니다 앱은 API를 호출하여 시스템 페어링 UI를 표시함으로써 페어링 흐름을 트리거할 수 있습니다 앱을 사용하는 사용자에게는 페어링이 간단한 과정으로 진행됩니다

    첫째, 사용자는 앱이 제공한 매개변수와 일치하는 근처 기기의 목록에서 기기를 선택하라는 요청을 받습니다

    그 후 사용자는 다른 기기에서 제공된 PIN 코드를 입력하여 페어링을 승인합니다

    마지막으로 시스템은 페어링을 마치고 사용자에게 이를 알립니다 이로써 앱에서 해당 기기를 사용할 수 있게 됩니다 사용 가능해지면 앱은 페어링 흐름을 다시 호출하지 않고도 해당 기기와의 연결을 요청할 수 있습니다

    기기 페어링을 위한 시스템 프레임워크는 두 가지가 있습니다 DeviceDiscoveryUI 및 AccessorySetupKit입니다

    DeviceDiscoveryUI는 앱 간 연결과 앱과 다른 기기와의 연결을 위해 설계되었습니다 이는 Apple 및 타사 기기와의 페어링을 지원합니다 AccessorySetupKit은 빠른 액세서리 온보딩을 위한 프레임워크로 하드웨어 액세서리 제조업체를 위한 권장 프레임워크입니다 DeviceDiscoveryUI를 자세히 살펴보겠습니다

    DeviceDiscoveryUI 사용자는 앱의 UI에서 버튼을 눌러 기기를 추가하거나 선택합니다 왼쪽의 퍼블리셔 측에서 앱은 애드버타이저 UI를 표시하기 위한 API를 호출합니다 오른쪽의 기기에서는 앱이 기기 선택기 UI를 표시하기 위한 API를 호출합니다

    브라우저 UI는 Wi-Fi Aware 서비스와 일치하는 근처 기기를 검색하고 사용자가 선택할 수 있도록 표시합니다 사용자가 페어링되지 않은 기기를 선택하면 시스템은 자동으로 페어링 흐름을 시작합니다

    페어링이 필요한 경우 수신된 요청과 PIN 코드가 퍼블리셔 측에 표시되고 서브스크라이버 측에서 입력됩니다

    사용자가 PIN을 확인하면 시스템이 기기를 페어링합니다 페어링이 완료되면 앱은 다른 기기와의 연결을 시도할 수 있죠

    DeviceDiscoveryUI 흐름을 살펴봤으니 이제 코드를 보겠습니다

    리스너 측에서 앱은 애드버타이징할 서비스를 전달하여 DevicePairingView를 생성합니다

    브라우저 측에서는 앱이 발견할 서비스를 전달하여 DevicePicker 뷰를 생성합니다 발견된 기기가 탭되면 DeviceDiscoveryUI가 연결 가능한 네트워크 엔드포인트를 앱에 렌더링합니다 필요한 경우 DeviceDiscoveryUI는 네트워크 엔드포인트를 제공하기 전에 페어링을 실행합니다

    액세서리 제조업체인 경우 앱과 페어링하기 위해 AccessorySetupKit을 사용하는 것이 좋습니다 액세서리가 Bluetooth와 Wi-Fi Aware와 같은 다중 전송을 사용하는 경우 AccessorySetupKit은 두 가지를 동시에 페어링하고 설정합니다 AccessorySetupKit을 Wi-Fi Aware와 함께 사용할 때의 페어링 흐름을 살펴보겠습니다 AccessorySetupKit 사용자가 앱의 UI에서 버튼을 눌러 기기를 추가하거나 선택합니다 앱은 기기 검색에 사용할 서비스와 필터를 지정하는 검색 설명자를 생성한 후 AccessorySetupKit UI를 표시합니다

    AccessorySetupKit은 서비스와 검색 필터와 일치하는 근처 기기를 찾고 해당 기기를 UI에 표시합니다 그러면 사용자가 설정하려는 기기를 선택합니다

    설정 중 사용자는 Wi-Fi Aware 페어링을 확인하는 PIN을 입력하죠 PIN은 퍼블리셔 측에 표시되고 서브스크라이버 측에서 입력됩니다

    시스템은 앱을 대신해 페어링을 수행합니다

    AccessorySetupKit 흐름을 살펴봤으니 코드를 살펴보겠습니다 Wi-Fi Aware 기기를 AccessorySetupKit으로 페어링하려면 먼저 서비스 이름, 모델, 공급업체 등의 기기 속성에 대한 필터를 제공하는 ASDiscoveryDescriptor를 만드세요 그런 다음 ASAccessorySession을 생성하고 showPicker를 호출하여 AccessorySetupKit UI를 표시하세요 시스템이 검색 및 페어링 프로세스를 처리하게 됩니다 페어링이 완료되면 새로 페어링된 기기를 나타내는 ASAccessory가 반환됩니다 여기에는 페어링된 기기의 ID인 ASAccessoryWiFiAwarePairedDeviceID가 포함됩니다 앱은 이 ID를 활용하여 Wi-Fi Aware 프레임워크를 통해 대응되는 WAPairedDevice를 찾을 수 있습니다 이 기기는 Network 프레임워크로 연결을 시작할 때 사용될 수 있죠

    WWDC24의 ‘AccessorySetupKit 소개’ 세션에서 AccessorySetupKit에 대해 자세히 알아보세요 기기를 페어링하는 방법을 알아보았으니 이제 앱에서 페어링된 기기 목록에 접근하는 방법을 알아보죠

    Wi-Fi Aware는 페어링된 기기를 WAPairedDevice 구조체로 표현합니다 WAPairedDevice에서 allDevices API를 사용하여 기기 목록을 얻을 수 있죠 페어링 과정에서 획득한 공급업체, 모델 이름과 같은 기기 속성에 접근할 수 있습니다

    API는 모든 기기나 특정 필터와 일치하는 기기를 반환할 수 있죠

    예를 들어, 공급업체 이름이 Example Inc인 기기를 찾으려면 화면에 표시된 대로 필터를 만들면 됩니다

    앱에 페어링된 기기 목록은 언제든지 변경될 수 있습니다 예를 들어, 기기가 설정에서 삭제되면 앱은 이러한 변경 사항을 감지하고 UI와 기타 상태를 업데이트할 수 있습니다 WaPairedDevice.allDevices를 통해 프레임워크에서 제공하는 비동기 시퀀스를 사용하면 쉽게 구현할 수 있습니다

    참고로, 제가 언급한 모든 API는 현재 연결 가능 여부와 상관없이 앱에서 사용할 수 있는 페어링된 기기를 모두 반환합니다 첫 번째 고수준 흐름인 페어링을 다뤘으니 이제 두 번째 흐름에 집중하겠습니다 바로 애플리케이션에서 페어링된 기기에 연결하는 절차입니다 코드를 살펴보기 전에 먼저 Wi-Fi Aware 연결에 필요한 고수준 흐름을 설명하겠습니다 연결에는 두 대의 기기가 필요합니다 한 기기는 서비스를 퍼블리싱하고 페어링된 기기에서 전송된 연결 요청을 수신하기 위해 대기합니다

    다른 기기는 서비스를 서브스크라이빙하고 연결할 페어링된 기기를 찾습니다 전력을 아끼기 위해 연결 대기 및 검색은 사용 사례에 필요한 시간으로 제한해야 합니다

    브라우저가 제공된 서비스와 기기 조합을 찾으면 연결 가능한 네트워크 엔드포인트를 앱에 제공합니다 다음으로 앱이 엔드포인트를 검토하고 하나 이상의 엔드포인트에 연결하게 됩니다 리스너는 연결 요청을 수신하고 앱으로 전달하여 연결을 완료합니다 이 시점에서 데이터를 교환할 수 있습니다

    이제 애플리케이션에서 Network 프레임워크를 사용하여 Wi-Fi Aware 연결을 설정하는 방법을 살펴보겠습니다 퍼블리싱하거나 서브스크라이빙하기 전에 앱은 관심 있는 페어링된 기기를 선택해야 합니다 이 예시에서 publisher는 이름이 ‘My Device’로 시작하는 기기에 대한 필터를 생성합니다

    이와 유사하게 subscribers 필터는 공급업체 이름이 ‘Example Inc’로 시작하는 기기를 선택합니다

    이제 Network 프레임워크로 리스너 및 브라우저 인스턴스를 시작하는 데 필요한 매개변수가 준비되었습니다

    NetworkListener를 생성하려면 이전에 생성한 서비스 객체와 기기 필터를 제공해야 합니다

    이렇게 생성된 NetworkListener는 지정된 서비스에 대한 연결만 수락하며 제공된 필터와 일치하는 페어링된 기기와 연결합니다

    Wi-Fi Aware 매개변수 외에도 애플리케이션은 네트워크 매개변수를 구성하고 상태 업데이트 핸들러를 설정할 수 있습니다

    유사한 방식으로 NetworkBrowser는 이전에 생성한 서비스와 기기 필터를 사용하여 생성됩니다

    이 브라우저는 서비스를 애드버타이징하고 필터와 일치하는 페어링된 기기만 검색합니다

    리스너와 브라우저를 만들었으므로 이제 앱에서 연결할 수 있습니다 리스너에서 수신된 연결을 수락하려면 리스너 객체에서 run 작업을 호출합니다

    리스너를 시작하면 앱이 다른 기기에서 검색 가능한 상태가 되죠

    브라우저에서 서비스 서브스크라이빙을 시작하려면 브라우저 객체에서 run 작업을 호출하세요

    브라우저를 시작하면 근처에서 서비스를 제공하는 기기를 찾죠 브라우저는 발견된 기기의 목록을 네트워크 엔드포인트로 앱에 반환합니다

    앱은 발견된 엔드포인트를 검토하고 관심 있는 엔드포인트가 있는지 결정합니다

    NetworkConnection API를 사용하여 원하는 엔드포인트와의 연결을 시작하세요

    연결이 설정되면 리스너는 새 연결에 대한 콜백을 받으며 이 콜백을 앱에 전달합니다 이제 앱은 Network 프레임워크의 API로 데이터를 교환할 수 있죠 무선 리소스와 전력을 절약하기 위해 필요한 모든 연결이 완료되면 리스너와 브라우저를 중지하세요

    Wi-Fi Aware 연결을 설정하는 데 필요한 모든 단계를 설명했습니다 다음으로 최상의 앱 경험을 제공하기 위해 연결 성능을 최적화하는 방법을 살펴보겠습니다 성능을 최적화하려면 전송 속도, 지연 시간, 전력 소비 간에 균형을 맞추어야 합니다 대부분의 경우 시스템에서 합리적인 기본 설정을 적용합니다 그러나 필요에 따라 앱에서 특정 연결 매개변수를 조정할 수 있죠

    첫 번째는 Wi-Fi Aware 성능 모드로 Wi-Fi Aware 작업 주기에 영향을 미칩니다

    두 번째는 트래픽 서비스 클래스로 패킷 전송의 우선순위를 설정합니다 이 설정의 기본값은 Best Effort이지만 지연을 줄이기 위해 Interactive Video나 Voice로 지정할 수 있죠

    데이터의 우선순위가 낮다면 다른 트래픽을 간섭하는 일이 없도록 Background 서비스 클래스를 사용하세요

    일반적으로 Bulk 성능 모드와 Best Effort 또는 Background 서비스 클래스를 함께 사용합니다 이 조합은 전력을 적게 소비하지만 더 긴 지연이 발생합니다

    반면 Real Time은 Interactive Video나 Voice 서비스 클래스와 사용되죠 이렇게 하면 지연이 줄어들지만 전력 소비가 늘어납니다 Real Time 모드는 배터리 소모량에 부정적인 영향을 미칠 수 있으므로 사용 사례에 필요한지 신중하게 고려하세요 Wi-Fi Aware 프레임워크는 연결 성능을 조정할 수 있는 설정 외에도 각 네트워크 연결에 대한 주문형 성능 보고서를 제공합니다 성능 보고서에는 신호 강도와 전송 속도, 지연 시간에 대한 지표가 포함됩니다 이 피드백을 활용하여 앱의 성능을 조정하세요 Wi-Fi 연결 강도, 환경 간섭 및 기기 기능은 실제 환경에서 크게 다를 수 있으므로 Wi-Fi 사용량이 높은 환경에서 앱의 성능을 테스트해야 합니다 또한 TCP와 같은 네트워크 프로토콜에서 제공하는 연결 피드백을 앱에 반영하세요

    조정 가능한 매개변수를 활용하는 방법을 코드를 보며 설명할게요 앞서 언급했듯이 Wi-Fi Aware 연결은 기본적으로 Bulk 성능 모드와 Best Effort 서비스 클래스를 사용합니다 프로파일링 결과 다른 구성이 사용 사례에 더 적합하다고 판단되면 퍼블리셔의 매개변수와 서브스크라이버의 연결 인스턴스를 설정하여 성능 모드와 서비스 클래스를 구성할 수 있습니다

    이 예시에서는 퍼블리셔가 Real-Time 성능 모드와 Interactive Video 트래픽 서비스 클래스를 사용하도록 설정되었습니다

    서브스크라이버 측에서는 앱에서 생성된 NetworkConnection 객체에 동일한 구성을 적용해야 합니다

    앱의 Wi-Fi Aware 연결을 모니터링하려면 현재 경로에 접근하고 성능 보고서를 읽으세요 앱은 이 보고서에 따라 조치를 취하고 전체 사용자 경험을 최적화할 수 있습니다

    Wi-Fi Aware로 앱을 빌드하는 데 필요한 모든 내용을 다루었습니다 멋진 앱을 빌드하시기 바랍니다 세션을 마치기 전에 몇 가지 중요한 조치를 안내해 드릴게요 Wi-Fi Aware 지원 기기를 개발 중인 하드웨어 제조업체라면 Apple 기기와의 상호 운용성을 보장하기 위해 액세서리 디자인 지침을 참고하세요 지침은 Apple Developer 웹사이트에서 확인할 수 있습니다 가이드를 따르면 기기가 안정적으로 Apple 기기를 찾고 Apple 기기에 페어링하며 강력한 보안을 유지하고 연결 성능을 극대화할 수 있습니다 이 가이드는 일관되고 고품질의 Wi-Fi Aware 경험을 구현하는 데 매우 유용한 자료입니다

    또한 자세한 내용을 Wi-Fi Aware 프레임워크 문서에서 확인해 보시기 바랍니다 Wi-Fi Aware로 앱을 빌드하는 방법과 다양한 성능 구성 설정이 동작에 미치는 영향을 보여 주는 샘플 앱도 살펴보세요

    마지막으로, Wi-Fi Aware 기기를 개발 중이라면 사용자에게 최상의 경험을 제공하는 데 도움이 되는 상호 운용성 가이드를 참고하세요

    시청해 주셔서 감사합니다

    • 6:57 - Access capabilities and services

      import WiFiAware
      
      // Check if Wi-Fi Aware is supported on your device
      guard WACapabilities.supportedFeatures.contains(.wifiAware) else { return }
      
      // Publishable service declared in Info.plist
      extension WAPublishableService {
          public static var fileService: WAPublishableService {
              allServices["_file-service._tcp"]!
          }
      }
      
      // Subscribable services declared in Info.plist
      extension WASubscribableService {
          public static var fileService: WASubscribableService {
              allServices["_file-service._tcp"]!
          }
          public static var droneService: WASubscribableService {
              allServices["_drone-service._udp"]!
          }
      }
    • 10:33 - Pair with DeviceDiscoveryUI

      import DeviceDiscoveryUI
      import WiFiAware
      import SwiftUI
      
      // Listener (Publisher) Device
      // Invoke Listener UI
      DevicePairingView(.wifiAware(.connecting(to: .fileService, from: .selected([])))) {
          // Provide a view to display to user before launching System UI
      } fallback: {
          // Provide a view in case of error
      }
      
      // Browser (Subscriber) Device
      // Invoke Browser UI
      DevicePicker(.wifiAware(.connecting(to: .selected([]), from: .fileService))) { endpoint in
          // Process the paired network endpoint
      } label: {
          // Provide a view to display to user before launching System UI
      } fallback: {
          // Provide a view in case of error
      }
    • 12:29 - Pair with AccessorySetupKit

      import AccessorySetupKit
      
      // Configure ASDiscoveryDescriptor (Subscriber)
      let descriptor = ASDiscoveryDescriptor()
      descriptor.wifiAwareServiceName = "_drone-service._udp"
      descriptor.wifiAwareModelNameMatch = .init(string: "Example Model")
      descriptor.wifiAwareVendorNameMatch = .init(string: "Example Inc", compareOptions: .literal)
      let item = ASPickerDisplayItem(name: "My Drone",
                                     productImage: UIImage(named: "DroneProductImage")!,
                                     descriptor: descriptor)
      
      // Create and activate session
      let session = ASAccessorySession()
      session.activate(on: sessionQueue) { event in
          // Closure will execute when device is added with event: .accessoryAdded
          // ASAccessoryWiFiAwarePairedDeviceID can be used to lookup a WAPairedDevice
      }
      // Present Picker UI
      session.showPicker(for: [item]) { error in
          // Handle error
      }
    • 13:51 - Access paired devices

      import Foundation
      import WiFiAware
      
      // WAPairedDevice
      var device: WAPairedDevice // Get using WAPairedDevice.allDevices
      
      // Access WAPairedDevice properties
      let pairingName = device.pairingInfo?.pairingName
      let vendorName = device.pairingInfo?.vendorName
      let modelName = device.pairingInfo?.modelName
      
      // Create a filter to select devices of interest
      let filter = #Predicate<WAPairedDevice> {
          $0.pairingInfo?.vendorName.starts(with: "Example Inc") ?? false
      }
      
      // Get all paired devices, matching the filter, at the current moment
      // A new snapshot of all paired devices each time a device is added, changed, or removed
      for try await devices in WAPairedDevice.allDevices(matching: filter) {
          // Process new snapshot of all paired devices
      }
    • 16:23 - Filter paired devices

      import Foundation
      import WiFiAware
      
      // Listener (Publisher) Device
      // Specify the paired devices of interest for the use case
      let deviceFilter = #Predicate<WAPairedDevice> {
          $0.name?.starts(with: "My Device") ?? false
      }
      
      // Browser (Subscriber) Device
      // Specify the paired devices of interest for the use case
      let deviceFilter = #Predicate<WAPairedDevice> {
          $0.pairingInfo?.vendorName.starts(with: "Example Inc") ?? false
      }
    • 16:54 - Create listener and browser

      import WiFiAware
      import Network
      
      // Listener (Publisher) Device: Construct a NetworkListener
      let listener = try NetworkListener(for:
              .wifiAware(.connecting(to: .fileService, from: .matching(deviceFilter))),
          using: .parameters {
              TLS()
          })
          .onStateUpdate { listener, state in
              // Process state update
          }
      
      // Browser (Subscriber) Device: Construct a NetworkBrowser
      let browser = NetworkBrowser(for:
              .wifiAware(.connecting(to: .matching(deviceFilter), from: .fileService))
          )
          .onStateUpdate { browser, state in
              // Process state update
          }
    • 17:44 - Establish a connection

      // Listener (Publisher) Device: Start NetworkListener
      try await listener.run { connection in  // Radio resources in use
          // Closure executes for each incoming connection
          connection.onStateUpdate { connection, state in
              // Process state update
          }
      }
      
      // Browser (Subscriber) Device: Start NetworkBrowser
      let endpoint = try await browser.run { waEndpoints in // Radio resources in use
              // Review endpoints, decide whether to return or skip
              if let endpoint = self.endpoint(in: waEndpoints) { return .finish(endpoint) }
              else { return .continue }
          }
      // Create the connection
      let connection = NetworkConnection(to: endpoint, using: .parameters {
              TLS()
          })
          .onStateUpdate { connection, state in
              // Process state update
          }
    • 21:11 - Tune performance

      // Listener (Publisher) Device
      // Configure .realtime + .interactiveVideo on NetworkListener
      let listener = try NetworkListener(for:
              .wifiAware(.connecting(to: .fileService, from: .matching(deviceFilter))),
          using: .parameters {
              TLS()
          }
          .wifiAware { $0.performanceMode = .realtime }
          .serviceClass(.interactiveVideo))
      
      // Browser (Subscriber) Device
      // Configure .realtime + .interactiveVideo on NetworkConnection
      let connection = NetworkConnection(to: endpoint, using: .parameters {
              TLS()
          }
          .wifiAware { $0.performanceMode = .realtime }
          .serviceClass(.interactiveVideo))
      
      // Listener (Publisher) Device & Browser (Subscriber) Device
      // Read performance report
      let performanceReport = try await connection.currentPath?.wifiAware?.performance
    • 0:00 - 서론
    • iOS 및 iPadOS에서 Wi-Fi Aware를 사용하여 지연 시간이 짧고 처리량이 높은 P2P 네트워크 연결을 만드는 방법을 알아보세요.

    • 1:01 - 개요
    • Wi-Fi Aware는 라우터나 중앙 서버가 필요 없이 기기 간 직접적인 커뮤니케이션을 지원하는 표준입니다. 이 기능은 일반 Wi-Fi 연결과 함께 작동하여 기기가 파일 공유, 미디어 스트리밍, 액세서리 제어, 화면 공유와 같은 일시적인 로컬 경험을 위해 안전하고 동적으로 검색하고 연결할 수 있도록 합니다. Wi-Fi Aware는 모든 플랫폼에서 사용 가능하고, 상호 운용이 가능하며, 연결은 완벽하게 인증되고 암호화됩니다. 앱은 서비스를 정의하고, 게시자나 구독자(또는 둘 다)의 역할을 지정하며, 가까이 있을 때마다 원활하고 빠른 재연결을 위해 기기를 페어링할 수 있습니다.

    • 7:46 - 페어링
    • DeviceDiscoveryUI 프레임워크 또는 AccessorySetupKit 프레임워크를 사용하여 기기를 페어링할 수 있습니다. DeviceDiscoveryUI는 앱 간 페어링에 적합하여 Apple과 타사 기기를 모두 지원합니다. AccessorySetupKit은 앱과 액세서리 간 페어링에 적합합니다. 기기가 페어링된 후, 두 프레임워크 모두 앱이 페어링된 기기 목록에 액세스하고 관리하고, 해당 속성을 검색하며, 페어링 상태의 변경 사항을 수신할 수 있도록 하여 앱이 UI와 상태를 그에 따라 업데이트할 수 있도록 합니다.

    • 15:05 - 연결
    • 페어링이 완료되면 두 기기가 서로 연결됩니다. 한 기기는 게시자 역할을 갖고 다른 기기는 구독자 역할을 갖습니다. 게시자는 특정 기기를 필터링하여 청취를 시작하는 반면, 구독자는 필터링하고 탐색을 시작합니다. 구독자가 게시자를 찾으면 게시자는 앱에 엔드포인트를 제공한 다음 앱은 이를 통해 연결을 설정합니다. 청취자는 이러한 연결 요청을 수신하고 전달하여 데이터 교환을 지원합니다.

    • 19:01 - 최적화
    • 앱의 연결 성능을 최적화하기 위해 Wi-Fi Aware 프레임워크를 통해 개발자는 특정 매개변수를 조정할 수 있습니다. 프레임워크는 대량 및 실시간 등 두 가지 주요 성능 모드를 제공합니다. 대량 모드는 에너지 효율적이지만 지연 시간이 길고 실시간 모드는 지연 시간이 짧지만 전력 소모량이 더 많습니다. 개발자는 패킷 전송의 우선순위를 정하기 위해 트래픽 서비스 클래스를 설정할 수 있고 최선의 노력, 대화형 비디오 또는 음성, 백그라운드 서비스 클래스에 대한 옵션을 제공합니다. 이 프레임워크는 신호 강도, 처리량, 지연 시간에 대한 지표를 포함하는 주문형 성능 보고서를 제공하여 개발자는 실제 테스트와 환경적 요인에 따라 앱의 성능을 조정할 수 있습니다.

    • 22:26 - 가이드라인
    • Wi-Fi Aware 기기를 개발하는 하드웨어 제조업체는 개발자 웹사이트에서 Apple의 액세서리 디자인 지침을 참고하여 상호 운용성, 보안, 성능 최적화를 확인할 수 있습니다. 이 지침은 프레임워크 문서 및 샘플 앱과 함께 수준 높은 사용자 경험을 만드는 데 필요한 필수 리소스를 제공합니다.

Developer Footer

  • 비디오
  • WWDC25
  • Wi-Fi Aware로 기기 연결성 강화하기
  • 메뉴 열기 메뉴 닫기
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    메뉴 열기 메뉴 닫기
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    메뉴 열기 메뉴 닫기
    • 손쉬운 사용
    • 액세서리
    • 앱 확장 프로그램
    • App Store
    • 오디오 및 비디오(영문)
    • 증강 현실
    • 디자인
    • 배포
    • 교육
    • 서체(영문)
    • 게임
    • 건강 및 피트니스
    • 앱 내 구입
    • 현지화
    • 지도 및 위치
    • 머신 러닝 및 AI
    • 오픈 소스(영문)
    • 보안
    • Safari 및 웹(영문)
    메뉴 열기 메뉴 닫기
    • 문서(영문)
    • 튜토리얼
    • 다운로드(영문)
    • 포럼(영문)
    • 비디오
    메뉴 열기 메뉴 닫기
    • 지원 문서
    • 문의하기
    • 버그 보고
    • 시스템 상태(영문)
    메뉴 열기 메뉴 닫기
    • Apple Developer
    • App Store Connect
    • 인증서, 식별자 및 프로파일(영문)
    • 피드백 지원
    메뉴 열기 메뉴 닫기
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(영문)
    • News Partner Program(영문)
    • Video Partner Program(영문)
    • Security Bounty Program(영문)
    • Security Research Device Program(영문)
    메뉴 열기 메뉴 닫기
    • Apple과의 만남
    • Apple Developer Center
    • App Store 어워드(영문)
    • Apple 디자인 어워드
    • Apple Developer Academy(영문)
    • WWDC
    Apple Developer 앱 받기
    Copyright © 2025 Apple Inc. 모든 권리 보유.
    약관 개인정보 처리방침 계약 및 지침