【问题标题】:Detect Network Changes in Background (iOS)在后台检测网络变化 (iOS)
【发布时间】:2021-08-03 00:45:05
【问题描述】:

我正在尝试创建一个 VPN 应用程序,当 VPN 在设置应用程序中手动关闭时通知用户。更一般地说,我希望能够在网络设置更改时做出反应。我在 StackOverflow 上看到了很多关于可达性、网络等的 cmets,但我不知道我是否可以在后台检查这些东西。有没有办法通过使用“获取”或“远程通知”来做到这一点。我的手机上有一个应用程序,如果我关闭 VPN,它会给我一个通知,所以我知道有办法做到这一点,但我不知道怎么做。

【问题讨论】:

  • 检查这个答案。 stackoverflow.com/a/65211525stackoverflow.com/a/62777999stackoverflow.com/a/64316672这可能不是您提到的所有问题的解决方案,但它可能对您有所帮助。
  • @HackMac 谢谢。其中任何一个都允许在后台进行网络监控吗?当应用程序打开时,我已经能够检测到网络变化。
  • 我不确定,从未将它们用于此类任务,但我只会将它们分配到调度队列后台,并使用一个非常分钟或类似的调用函数的计时器(我知道不是最好的)方式,但它应该工作)。
  • @HackMac 在应用程序关闭并在后台继续工作?
  • 对于应用程序终止后运行的任务,请参阅:hackingwithswift.com/example-code/system/… - 或者许多创建执行此任务的代理应用程序。

标签: swift vpn reachability uibackgroundmode


【解决方案1】:

根据This Apple Developer Discussion

答案可能是。 Apple 员工可能会回答此 Apple 开发者讨论。

没有在网络更改时在后台运行代码的机制。大多数需要做这类事情的人都使用 VPN On Demand 架构。 VPN On Demand 有一个 API,但该 API 直接映射到配置文件属性,并且配置文件不被视为 API(这意味着它们由 Apple 支持部门提供支持,而不是由开发人员技术支持部门提供支持)。

【讨论】:

  • 谢谢。我也看到了,但就像我说的,我有一个 App Store 批准的应用程序具有此功能,所以我相信有一些方法可以做到这一点。并且没有用于该 VPN 应用的配置文件。
【解决方案2】:

这将每 3 秒监控一次您的互联网状态:

import Cocoa
import Darwin
import Network

//DispatchQueue.global(qos: .userInitiated).async {
let monitor = NWPathMonitor()
let queue = DispatchQueue(label: "Monitor")
monitor.start(queue: queue)
var count = 10


while count >= 0 {
    
monitor.pathUpdateHandler = { path in
    
    if path.status == .satisfied {
        print("There is internet")
        
        if path.usesInterfaceType(.wifi) { print("wifi") }
        else if path.usesInterfaceType(.cellular) { print("wifi") }
        else if path.usesInterfaceType(.wiredEthernet) { print("wiredEthernet") }
        else if path.usesInterfaceType(.loopback) { print("loopback") }
        else if path.usesInterfaceType(.other) { print("other") }

        
    } else {
        print("No internet")
    }
    
}
   sleep(3)
   count = count - 1
}

monitor.cancel()
//}

此代码每三秒返回一次互联网状态和连接类型。如果您希望它永远运行,请将 while count >= 0 更改为 while trueDispatchQueue.global(qos: .userInitiated).async {DispatchQueue.global(qos: .background).async { 您可以将任务移至后台。
要继续在后台运行代码(当应用程序不存在时),请遵循 https://www.hackingwithswift.com/example-code/system/how-to-run-code-when-your-app-is-terminated

注意:在使用可达性框架时,Appstore 有时会拒绝您的应用。

【讨论】:

  • 谢谢。所以如果用户不能禁用它,就没有办法在后台做某事吗?
  • 你的意思是你希望用户不能禁用它?如果是这样,据我所知,即使您可以这样做,Appstore 也可能会拒绝您的应用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 2011-10-15
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
相关资源
最近更新 更多