Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在后台检测网络更改(iOS)_Swift_Vpn_Reachability_Uibackgroundmode - Fatal编程技术网

Swift 在后台检测网络更改(iOS)

Swift 在后台检测网络更改(iOS),swift,vpn,reachability,uibackgroundmode,Swift,Vpn,Reachability,Uibackgroundmode,我正在尝试创建一个VPN应用程序,在设置应用程序中手动关闭VPN时通知用户。更一般地说,我希望能够在网络设置更改时做出反应。我在StackOverflow上看到了很多关于可达性、网络等方面的评论,但我不知道是否可以在后台检查这些东西。有没有办法通过使用“获取”或“远程通知”来实现这一点。我的手机上有一个应用程序,如果我关闭VPN,它会给我一个通知,所以我知道有办法做到这一点,但我不知道怎么做。根据: 答案可能是否定的。 苹果开发人员的讨论可能会得到苹果员工的回答 没有在网络更改的后台运行代码的机

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

根据:

答案可能是否定的。 苹果开发人员的讨论可能会得到苹果员工的回答

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


这将每隔3秒监控您的internet状态:

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()
//}
此代码每三秒返回一次internet状态和连接类型。如果希望永远运行此操作,请使用
DispatchQueue.global(qos:.userInitiated).async{
DispatchQueue.global(qos:.background).async{
将任务移动到后台。
要继续在后台运行代码(当应用程序不存在时),请执行以下操作。


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

请查看此答案。这可能不是您提到的所有问题的解决方案,但可能会对您有所帮助。@HackMac谢谢。有任何一个允许在后台进行网络监控吗?我已经能够在应用程序运行时检测到网络更改打开。我不确定,从未将它们用于此类任务,但我只会将它们分配到调度队列后台,并使用计时器调用函数very min或类似的方式(我不知道最好的方法,但它应该可以工作)@HackMac,在应用程序关闭后,它将在后台继续工作?对于在应用程序终止后运行的任务,请参阅:-或许多人创建了一个代理应用程序来执行此任务。谢谢。我也看到了,但正如我所说,我有一个AppStore批准的应用程序具有此功能,所以我相信有一些方法可以做到这一点。还有没有用于该VPN应用程序的配置文件。谢谢。因此,如果用户无法禁用它,则无法在后台执行操作?你的意思是希望用户无法禁用它吗?如果是这样,正如我所知,即使你可以这样做,Appstore也可能会拒绝你的应用程序。