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("")
}
}
The problem was that I didn't added "_lnp._tcp." to Bonjour services.