ShadowsocksR-Live / iShadowsocksR

ShadowsocksR (SSRoT) client for iOS
GNU General Public License v3.0
574 stars 326 forks source link

怎样控制设置中的VPN开关 #64

Closed paopao517 closed 2 years ago

paopao517 commented 2 years ago

请问 在系统设置的 VPN 选项中--- 如何让用户只能在APP中才能正确开启VPN,在系统设置里无法开启?

ssrlive commented 2 years ago

時間久了忘了。你自己看看代碼。可以在App裏加一個額外的標記一同傳進後臺進程,但設置裏不存儲這個額外標記,於是後臺進程判斷這個標記決定是否繼續執行。實現很簡單的。

paopao517 commented 2 years ago

時間久了忘了。你自己看看代碼。可以在App裏加一個額外的標記一同傳進後臺進程,但設置裏不存儲這個額外標記,於是後臺進程判斷這個標記決定是否繼續執行。實現很簡單的。

感谢提供思路! 但是我看过后没什么头绪,这个标记是在 NETunnelProviderManager类中添加的吗?进入后台时,我把protocolConfiguration. serverAddress随便设置了之后并不起作用,是我的方法不对吗,还请大佬再指点一二。(好像没领悟大佬说的方法)

var manager: NETunnelProviderManager?

    NETunnelProviderManager.loadAllFromPreferences {  (managers, error) -> Void in
        if let managers = managers {
            if managers.count > 0 {
                manager = managers[0]
            }else{
// manager = self.createProviderManager()
}
manager?.isEnabled = true
manager?.protocolConfiguration?.serverAddress = "1234"
manager?.protocolConfiguration?.username = "1234"
manager?.saveToPreferences(completionHandler: { (error) -> Void in
if let error = error {
}else{
manager?.loadFromPreferences(completionHandler: { (error) -> Void in

                    })
                }
            })
        }else{
        }
    }
ssrlive commented 2 years ago

protocolConfiguration 傳進來的數據是會全局保存的,不能使用 protocolConfiguration, 後臺進程和 前臺 app 可以共享 組, group,你可以創建一個組,然在這個組下用 app 寫一個標記 flag=true ,後臺進程執行時讀取這個 flag,如果是true就允許繼續執行並將flag設置為 false,如果flag是false就直接退出執行,VPN就啓動失敗了。

或者在 protocolConfiguration 加一個時間戳,前臺app啓動傳參時寫入當前時間,後臺進程讀取這個時間戳,與當前時間比較,如果相差在一秒以内,則為 app 啓動的,繼續執行,否則直接報錯退出。這個方法只解決了只允許從app啓動的問題,要解決其它需求還是使用第一種最好。