以编程方式更改 mac osx 上的代理
change proxy on mac osx programmatically
如何以编程方式更改 mac osx 上的代理设置。我精通 ios,并且由于 mac os 编程很相似,所以应该不会有太多问题。但是我缺乏以编程方式创建代理更改所需的逻辑。手动调整非常容易。这是我在系统偏好设置中的网络选项卡:
我尝试过的:
let dynamicStore: SCDynamicStoreRef = SCDynamicStoreCreate(nil, "setProxy" as CFString, nil, nil)!
let updated = SCDynamicStoreSetValue(dynamicStore, "HTTPProxy" as CFStringRef, "111.222.333.1") // updated is false, indicating unsuccessful operation
也试过这个,但是返回的字典是只读的
let dynamicStore: SCDynamicStoreRef = SCDynamicStoreCreate(nil, "myFunc" as
CFString, nil, nil)!
let proxyDict = SCDynamicStoreCopyProxies(dynamicStore)
if let proxyDict = SCDynamicStoreCopyProxies(dynamicStore) as NSDictionary? {
if let port = proxyDict["HTTPPort"] as? Int {
print("HTTPPort:", port)
proxyDict["HTTPPort"] = 8088; // can't do that
}
}
我运行没主意了。
来自 this answer,这是一个示例脚本:
e=$(networksetup -getsocksfirewallproxy wi-fi | grep "No")
if [ -n "$e" ]; then
echo "Turning on proxy"
networksetup -setsocksfirewallproxystate wi-fi on
else
echo "Turning off proxy"
networksetup -setsocksfirewallproxystate wi-fi off
fi
它为用户的 Wi-Fi 连接切换 (on/off) SOCKS 代理。
您可以使用这个想法来制作您需要的脚本。您可以在 bash 脚本或 Cocoa.
中实现所需的逻辑
- 使用
networksetup -listallnetworkservices
列出所有连接。
- 使用
networksetup -setwebproxy
为特定连接设置代理。
例如,这是我的终端输出:
$ networksetup -listallnetworkservices
An asterisk (*) denotes that a network service is disabled.
MBBEthernet
Wi-Fi
Wi-Fi Modem Yota 4G LTE
Bluetooth PAN
Thunderbolt Bridge
iPhone
$ networksetup -setwebproxy some bad args
** Error: The parameters were not valid.
$ networksetup -setwebproxy Wi-Fi 1.2.3.4 8080
最后一条命令输出为空,表示成功。
另见 man networksetup
。
How to execute a shell command from a Cocoa app.
从终端应用程序执行的上述命令要求授权。抱歉,我不确定您是否可以保留它 "as is"(只需启动您的 NSTask
,OS X 即可完成其余工作),或者您需要通过 SFAuthorization 在这样做之前。
CFDictionaryCreateMutableCopy
可以解决问题,但即使您成功更改了字典,SCDynamicStoreSetMultiple
也没有任何效果。
如何以编程方式更改 mac osx 上的代理设置。我精通 ios,并且由于 mac os 编程很相似,所以应该不会有太多问题。但是我缺乏以编程方式创建代理更改所需的逻辑。手动调整非常容易。这是我在系统偏好设置中的网络选项卡:
我尝试过的:
let dynamicStore: SCDynamicStoreRef = SCDynamicStoreCreate(nil, "setProxy" as CFString, nil, nil)!
let updated = SCDynamicStoreSetValue(dynamicStore, "HTTPProxy" as CFStringRef, "111.222.333.1") // updated is false, indicating unsuccessful operation
也试过这个,但是返回的字典是只读的
let dynamicStore: SCDynamicStoreRef = SCDynamicStoreCreate(nil, "myFunc" as
CFString, nil, nil)!
let proxyDict = SCDynamicStoreCopyProxies(dynamicStore)
if let proxyDict = SCDynamicStoreCopyProxies(dynamicStore) as NSDictionary? {
if let port = proxyDict["HTTPPort"] as? Int {
print("HTTPPort:", port)
proxyDict["HTTPPort"] = 8088; // can't do that
}
}
我运行没主意了。
来自 this answer,这是一个示例脚本:
e=$(networksetup -getsocksfirewallproxy wi-fi | grep "No")
if [ -n "$e" ]; then
echo "Turning on proxy"
networksetup -setsocksfirewallproxystate wi-fi on
else
echo "Turning off proxy"
networksetup -setsocksfirewallproxystate wi-fi off
fi
它为用户的 Wi-Fi 连接切换 (on/off) SOCKS 代理。
您可以使用这个想法来制作您需要的脚本。您可以在 bash 脚本或 Cocoa.
中实现所需的逻辑- 使用
networksetup -listallnetworkservices
列出所有连接。 - 使用
networksetup -setwebproxy
为特定连接设置代理。
例如,这是我的终端输出:
$ networksetup -listallnetworkservices
An asterisk (*) denotes that a network service is disabled.
MBBEthernet
Wi-Fi
Wi-Fi Modem Yota 4G LTE
Bluetooth PAN
Thunderbolt Bridge
iPhone
$ networksetup -setwebproxy some bad args
** Error: The parameters were not valid.
$ networksetup -setwebproxy Wi-Fi 1.2.3.4 8080
最后一条命令输出为空,表示成功。
另见 man networksetup
。
How to execute a shell command from a Cocoa app.
从终端应用程序执行的上述命令要求授权。抱歉,我不确定您是否可以保留它 "as is"(只需启动您的 NSTask
,OS X 即可完成其余工作),或者您需要通过 SFAuthorization 在这样做之前。
CFDictionaryCreateMutableCopy
可以解决问题,但即使您成功更改了字典,SCDynamicStoreSetMultiple
也没有任何效果。