gpt4 book ai didi

swift5 - 如何检测 iOS 14 中是否授予本地网络权限

转载 作者:行者123 更新时间:2023-12-03 17:23:34 30 4
gpt4 key购买 nike

如何检测用户是否已在 iOS 14 的应用程序中授予本地网络权限?如果用户拒绝权限并重定向到操作系统设置以授予权限,我必须显示错误屏幕。
Apple 是否提供了任何方式来查找位置许可?

最佳答案

我写了这个类,如果你不是在 iOS 14.2 上可以使用。

  • 此类将提示用户授予访问本地网络的权限(第一次)。
  • 如果已经拒绝/授予,验证现有权限状态。

  • 请记住,此实例必须保持事件状态,因此如果您在另一个类中的函数调用中使用它,则需要在调用函数的范围之外保持该实例的事件状态。
    import UIKit
    import Network

    class LocalNetworkPermissionChecker {
    private var host: String
    private var port: UInt16
    private var checkPermissionStatus: DispatchWorkItem?

    private lazy var detectDeclineTimer: Timer? = Timer.scheduledTimer(
    withTimeInterval: .zero,
    repeats: false,
    block: { [weak self] _ in
    guard let checkPermissionStatus = self?.checkPermissionStatus else { return }
    DispatchQueue.main.asyncAfter(deadline: .now(), execute: checkPermissionStatus)
    })

    init(host: String, port: UInt16, granted: @escaping () -> Void, failure: @escaping (Error?) -> Void) {
    self.host = host
    self.port = port

    NotificationCenter.default.addObserver(
    self,
    selector: #selector(applicationIsInBackground),
    name: UIApplication.willResignActiveNotification,
    object: nil)

    NotificationCenter.default.addObserver(
    self,
    selector: #selector(applicationIsInForeground),
    name: UIApplication.didBecomeActiveNotification,
    object: nil)

    actionRequestNetworkPermissions(granted: granted, failure: failure)
    }

    deinit {
    NotificationCenter.default.removeObserver(self)
    }

    /// Creating a network connection prompts the user for permission to access the local network. We do not have the need to actually send anything over the connection.
    /// - Note: The user will only be prompted once for permission to access the local network. The first time they do this the app will be placed in the background while
    /// the user is being prompted. We check for this to occur. If it does we invalidate our timer and allow the user to make a selection. When the app returns to the foreground
    /// verify what they selected. If this is not the first time they are on this screen, the timer will not be invalidated and we will check the dispatchWorkItem block to see what
    /// their selection was previously.
    /// - Parameters:
    /// - granted: Informs application that user has provided us with local network permission.
    /// - failure: Something went awry.
    private func actionRequestNetworkPermissions(granted: @escaping () -> Void, failure: @escaping (Error?) -> Void) {
    guard let port = NWEndpoint.Port(rawValue: port) else { return }

    let connection = NWConnection(host: NWEndpoint.Host(host), port: port, using: .udp)
    connection.start(queue: .main)

    checkPermissionStatus = DispatchWorkItem(block: { [weak self] in
    if connection.state == .ready {
    self?.detectDeclineTimer?.invalidate()
    granted()
    } else {
    failure(nil)
    }
    })

    detectDeclineTimer?.fireDate = Date() + 1
    }

    /// Permission prompt will throw the application in to the background and invalidate the timer.
    @objc private func applicationIsInBackground() {
    detectDeclineTimer?.invalidate()
    }

    /// - Important: DispatchWorkItem must be called after 1sec otherwise we are calling before the user state is updated.
    @objc private func applicationIsInForeground() {
    guard let checkPermissionStatus = checkPermissionStatus else { return }
    DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: checkPermissionStatus)
    }
    }

    //Can be used like this:
    LocalNetworkPermissionChecker(host: "255.255.255.255", port: 4567, granted: {
    //Perform some action here...
    },
    failure: { error in
    if let error = error {
    print("Failed with error: \(error.localizedDescription)")
    }
    })

    关于swift5 - 如何检测 iOS 14 中是否授予本地网络权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64069053/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com