以编程方式在mac osx上更改代理

时间:2016-03-21 09:30:30

标签: macos cocoa proxy ip-address

如何以编程方式更改mac osx上的代理设置。我精通ios,因为mac os编程类似,所以不应该有很多问题。但是我缺乏以编程方式创建代理更改所需的逻辑。手动调整非常容易。这是我之后的系统偏好设置中的网络标签:

enter image description here

我尝试过:

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
        }
    }

我的想法已经不多了。

2 个答案:

答案 0 :(得分:3)

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连接切换(打开/关闭)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

从终端应用程序执行的上述命令要求授权。对不起,我不确定你是否可以“按原样”保留它(只需启动你的NSTask,OS X将完成剩下的工作),或者你需要通过SFAuthorization获得正确的凭据这样做。

答案 1 :(得分:0)

CFDictionaryCreateMutableCopy可以解决问题,但即使您成功更改字典后,SCDynamicStoreSetMultiple也没有效果。