//
// KdLocalNetworkManager.swift
//
//
// Created by bob bob on 2023/4/13.
//
import Foundation
import Network
/// Uses bonjour networking to relialby check if user has granted local network access
/// How to use:
/// Add LocalNetworkAuthorization class to your project
/// Open .plist file and add "_bonjour._tcp", "_lnp._tcp.", as a values under "Bonjour services"
/// Call requestAuthorization() to trigger the prompt or get the authorization status if it already been approved/denied
/// about the author: https://stackoverflow.com/a/67758105/705761
public class KdLocalNetworkManager: NSObject {
private var browser: NWBrowser?
private var netService: NetService?
private var completion: ((Bool) -> Void)?
public func requestAuthorization() async -> Bool {
return await withCheckedContinuation { continuation in
requestAuthorization() { result in
continuation.resume(returning: result)
}
}
}
private 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: "_bonjour._tcp", domain: nil), using: parameters)
self.browser = browser
browser.stateUpdateHandler = { newState in
switch newState {
case .failed(let error):
print(error.localizedDescription)
case .ready:
break
case .cancelled:
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 KdLocalNetworkManager : NetServiceDelegate {
public func netServiceDidPublish(_ sender: NetService) {
self.reset()
print("Local network permission has been granted")
completion?(true)
}
}
1 在 .plist 添加"_bonjour._tcp", “_lnp._tcp.”, 到 “Bonjour services”
2 使用,只有被拒绝时候才会回调回来文章来源地址https://www.toymoban.com/news/detail-723943.html
Task.init {
do{
let isOK = try await KdLocalNetworkManager().requestAuthorization()
print("ok")
if(!isOK){
let settingStrUrl = UIApplication.openSettingsURLString//"App-Prefs:root=Bluetooth"
let alertStr = NSLocalizedString("请打开本地网络权限", comment: "")
let url = URL(string: settingStrUrl)
guard let url = url else{
return
}
if(UIApplication.shared.canOpenURL(url)){
UIApplication.shared.open(url)
}
}
}catch{
print("exception")
}
}
文章来源:https://www.toymoban.com/news/detail-723943.html
到了这里,关于iOS 请求本地网络权限状态的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!