EAWiFiUnconfiguredAccessoryBrowser not being able to detect device the OS is able to detect

Hey there 👋,

My team and me have implemented support for WAC devices in our App using EAWiFiUnconfiguredAccessoryBrowser. When the device we want to support is factory reset we are able to find it as well as the OS is able to. The device has a "setup wifi" button, which starts the WAC process, and iOS (as well as MacOS) are able to find it. Unfortunately we are not able to find it in that case using EAWiFiUnconfiguredAccessoryBrowser.. I could not find any restrictions on it in the documentation, any glues why we are not able to detect it in that situation?

I isolated the problem in a sample and used the following implementation to test this:

import Foundation
import ExternalAccessory
import os
import Combine

class WACWatcher: NSObject {
    private let browser: EAWiFiUnconfiguredAccessoryBrowser
    
    private let logger = Logger(subsystem: "WACWatcher", category: "networking")
    
    @Published var accessories: [EAWiFiUnconfiguredAccessory] = []
    
    override init() {
        self.browser = EAWiFiUnconfiguredAccessoryBrowser()
        super.init()
        self.browser.delegate = self
    }
    
    func start() {
        browser.startSearchingForUnconfiguredAccessories(matching: nil)
    }
    
    func stop() {
        browser.stopSearchingForUnconfiguredAccessories()
    }
}

extension WACWatcher: EAWiFiUnconfiguredAccessoryBrowserDelegate {
    func accessoryBrowser(
        _ browser: EAWiFiUnconfiguredAccessoryBrowser,
        didUpdate state: EAWiFiUnconfiguredAccessoryBrowserState
    ) {
        switch state {
        case .wiFiUnavailable:
            logger.debug("WAC Browser state changed to wifiUnavailable")
            break
        case .stopped:
            logger.debug("WAC Browser state changed to stopped")
            break
        case .searching:
            logger.debug("WAC Browser state changed to searching")
            break
        case .configuring:
            logger.debug("WAC Browser state changed to configuring")
            break
        }
    }

    func accessoryBrowser(
        _ browser: EAWiFiUnconfiguredAccessoryBrowser,
        didFindUnconfiguredAccessories accessories: Set<EAWiFiUnconfiguredAccessory>
    ) {
        logger.info("WACWatcher found accessories: \(accessories)")
        self.accessories.append(contentsOf: accessories)
    }

    func accessoryBrowser(
        _ browser: EAWiFiUnconfiguredAccessoryBrowser,
        didRemoveUnconfiguredAccessories accessories: Set<EAWiFiUnconfiguredAccessory>
    ) {
        logger.info("WACWatcher removed accessories: \(accessories)")
        self.accessories = accessories.filter({ accessory in
            accessories.contains(where: { $0.name == accessory.name })
        })
    }

    func accessoryBrowser(
        _ browser: EAWiFiUnconfiguredAccessoryBrowser,
        didFinishConfiguringAccessory accessory: EAWiFiUnconfiguredAccessory,
        with status: EAWiFiUnconfiguredAccessoryConfigurationStatus
    ) {}
}

This WACWatcher gets used in a ViewModel and a view having a start stop button and a list showing the device name. If you'd need to see it, I can zip it and attach it to this post.

Replies

Solved - it was an issue with the device.