swiftbonjour

Swift Local Network netServiceDidPublish not called


First question: I am using this this method to trigger LocalNetwork Permission dialog, but after dialog shows up, and users gives access, no delegate fires, however it enters to ready state. Have you any idea why?

Second question: is there any possibility to detect if LocalNetwork permission was granted without trigger the dialog?

import Foundation
import Network

public class LocalNetworkAuthorization: NSObject {
    private var browser: NWBrowser?
    private var netService: NetService?
    private var completion: ((Bool) -> Void)?
    
    func requestAuthorization(completion: @escaping (Bool) -> Void) {
        self.completion = completion
        
            // Create parameters, and allow browsing over peer-to-peer link.
        let parameters = NWParameters()
        parameters.includePeerToPeer = true
        
            // Browse for a custom service type.
        let browser = NWBrowser(for: .bonjour(type: "_wobie._tcp", domain: nil), using: parameters)
        self.browser = browser
        browser.stateUpdateHandler = { newState in
            switch newState {
            case .failed(let error):
                print("::: ->> error: \(error.localizedDescription)")
            case .ready:
                print("::: ->> ready")
            case .cancelled:
                print("::: ->> canceled")
                break
            case let .waiting(error):
                print("::: ->> Local network permission has been denied: \(error)")
                self.reset()
                self.completion?(false)
            default:
                break
            }
        }
        
        self.netService = NetService(domain: "local.", type:"_lnp._tcp.", name: "LocalNetworkPrivacy", port: 1100)
        self.netService?.delegate = self
        
        self.browser?.start(queue: .main)
        self.netService?.publish()
    }
    
    
    private func reset() {
        self.browser?.cancel()
        self.browser = nil
        self.netService?.stop()
        self.netService = nil
    }
}

extension LocalNetworkAuthorization : NetServiceDelegate {
    public func netServiceDidPublish(_ sender: NetService) {
        self.reset()
        print("::: Local network permission has been granted")
        completion?(true)
    }
    
    public func netService(_ sender: NetService, didNotResolve errorDict: [String : NSNumber]) {
        print("::: error: \(errorDict)")
    }
    
    public func netService(_ sender: NetService, didAcceptConnectionWith inputStream: InputStream, outputStream: OutputStream) {
        print("")
    }
    
    public func netServiceWillResolve(_ sender: NetService) {
        print("")
    }
}

Solution

  • The problem was that I didn't added "_lnp._tcp." to Bonjour services.