我在github下载了一个工程:https://github.com/ohdarling/ProxyMenu 运行后可以修改系统的网络代理配置。
然后新建一个工程,将修改的代码拷贝到新工程里,运行却不生效。
以下是代码片段:
void changeProxy() {
static AuthorizationRef authRef;
static AuthorizationFlags authFlags;
authFlags = kAuthorizationFlagDefaults
| kAuthorizationFlagExtendRights
| kAuthorizationFlagInteractionAllowed
| kAuthorizationFlagPreAuthorize;
OSStatus authErr = AuthorizationCreate(nil, kAuthorizationEmptyEnvironment, authFlags, &authRef);
if (authErr != noErr) {
authRef = nil;
} else {
if (authRef == NULL) {
printf("No authorization has been granted to modify network configuration\n");
return;
}
SCPreferencesRef prefRef = SCPreferencesCreateWithAuthorization(nil, CFSTR("system-proxy-setup"), nil, authRef);
NSMutableDictionary *sets = [(__bridge NSDictionary *)SCPreferencesPathGetValue(prefRef, (__bridge CFStringRef)[NSString stringWithFormat:@"/%@", kSCPrefNetworkServices]) mutableCopy];
[sets enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, __kindof NSDictionary *_Nonnull obj, BOOL * _Nonnull stop) {
// NSString *hardware = [obj valueForKeyPath:@"Interface.Hardware"];
// BOOL modify = ([hardware isEqualToString:@"AirPort"]
// || [hardware isEqualToString:@"Wi-Fi"]
// || [hardware isEqualToString:@"Ethernet"]);
if (YES/*modify*/) {
NSMutableDictionary *proxies = [obj[@"Proxies"] mutableCopy];
NSArray<NSString *> *keys = @[(NSString *)kCFNetworkProxiesHTTPProxy,
(NSString *)kCFNetworkProxiesHTTPSProxy,
(NSString *)kCFNetworkProxiesSOCKSProxy,
(NSString *)kCFNetworkProxiesHTTPPort,
(NSString *)kCFNetworkProxiesHTTPSPort,
(NSString *)kCFNetworkProxiesSOCKSPort,
(NSString *)kCFNetworkProxiesProxyAutoConfigURLString];
[proxies removeObjectsForKeys:keys];
[proxies setObject:[NSNumber numberWithBool:NO] forKey:(NSString *)kCFNetworkProxiesHTTPEnable];
[proxies setObject:[NSNumber numberWithBool:NO] forKey:(NSString *)kCFNetworkProxiesHTTPSEnable];
[proxies setObject:[NSNumber numberWithBool:NO] forKey:(NSString *)kCFNetworkProxiesSOCKSEnable];
[proxies setObject:[NSNumber numberWithBool:NO] forKey:(NSString *)kCFNetworkProxiesProxyAutoConfigEnable];
// [proxies removeObjectForKey:(NSString *)kCFNetworkProxiesProxyAutoConfigURLString];
// [proxies setObject:[NSNumber numberWithBool:NO] forKey:(NSString *)kCFNetworkProxiesHTTPEnable];
[proxies setObject:@"127.0.0.1" forKey:(NSString *)kCFNetworkProxiesSOCKSProxy];
[proxies setObject:[NSNumber numberWithInt:8877] forKey:(NSString *)kCFNetworkProxiesSOCKSPort];
[proxies setObject:[NSNumber numberWithInt:YES] forKey:(NSString *)kCFNetworkProxiesSOCKSEnable];
[proxies setObject:@"127.0.0.1" forKey:(NSString *)kCFNetworkProxiesHTTPProxy];
[proxies setObject:@"127.0.0.1" forKey:(NSString *)kCFNetworkProxiesHTTPSProxy];
[proxies setObject:[NSNumber numberWithInt:9999] forKey:(NSString *)kCFNetworkProxiesHTTPPort];
[proxies setObject:[NSNumber numberWithInt:9999] forKey:(NSString *)kCFNetworkProxiesHTTPSPort];
[proxies setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFNetworkProxiesHTTPEnable];
[proxies setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFNetworkProxiesHTTPSEnable];
if (SCPreferencesPathSetValue(prefRef, (__bridge CFStringRef)[NSString stringWithFormat:@"/%@/%@/%@", kSCPrefNetworkServices, key, kSCEntNetProxies], (__bridge CFDictionaryRef)proxies)) {
printf("update %s proxies successful ...\n", [key UTF8String]);
};
}
}];
if (SCPreferencesCommitChanges(prefRef)) {
printf("commit successful ...\n");
}
if (SCPreferencesApplyChanges(prefRef)) {
printf("apply changes successful ...\n");
}
SCPreferencesSynchronize(prefRef);
printf("synchronize successful ...\n");
AuthorizationFree(authRef, kAuthorizationFlagDefaults);
authRef = NULL;
}
}
问题出在SCPreferencesCommitChanges和SCPreferencesApplyChanges上,这两个函数都返回false。
但是在原项目中,是修改成功的。
问题出在哪里?我应该怎么设置?