如何从网络扩展中停用按需连接VPN?

时间:2019-12-04 10:39:05

标签: ios swift vpn networkextension nevpnmanager

我已经用NEOnDemandRuleConnect配置了一个永远在线的VPN,如果用户已经支付了订阅费用,我将从后端检索一些用户数据,例如到期日期。如果到期,我想在不打开主应用程序的情况下停用VPN,请通过网络扩展程序进行操作。我使用每日计时器从后端检索数据,然后检查订阅是否已过期。然后,我将具有一个从系统设置应用程序加载VPN管理器,然后将其停用并最终保存的功能。如果我不停用管理器,则该设备将没有连接,因为它已配置为始终与NEOnDemandRule连接的VPN。该功能或多或少会是这个

func stopProtection(completion: @escaping (Result<Void>) -> Void) {

    NSLog("Called stopProtection")

    NETunnelProviderManager.loadAllFromPreferences { (managers, error) in

        if let error = error {
            NSLog("[SUBS] ERROR \(error)")
        }

        if let managers = managers {
            if managers.count > 0 {
                let index = managers.firstIndex(where: { $0.localizedDescription == Constants.vpnBundleId })

                guard let index = index else {
                    completion(.error(ProtectionServiceError.noKidsVpnInstalled))
                    return
                }

                let myManager = managers[index]

                myManager.loadFromPreferences(completionHandler: { (error) in
                    guard error == nil else {
                        completion(.error(ProtectionServiceError.errorStoppingTunnel))
                        return
                    }

                    // Deactivate the VPN and save it
                    myManager.isEnabled = false

                    myManager.saveToPreferences(completionHandler: { (error) in
                        guard error == nil else {
                            completion(.error(ProtectionServiceError.errorStoppingTunnel))
                            return
                        }

                        completion(.success(()))
                    })
                })
            } else {
                completion(.error(ProtectionServiceError.errorStoppingTunnel))
            }
        }
    }
}

所有这些代码和逻辑都在扩展中执行,并具有所有可能的限制。使用上一个函数,我只会得到第一个NSLog,说Called stopProtection,但不会加载任何管理器。从主要目标调用它会起作用。我不知道是否可以从扩展中加载和修改管理器,或者这是另一种方式。

1 个答案:

答案 0 :(得分:0)

好吧,我已经通过附加到进程并查看设备控制台来调试网络扩展,然后弹出此错误,

NETunnelProviderManager objects cannot be instantiated from NEProvider processes

所以不,有答案!