我们无法通过 iPad 上的代理连接到提供的移动热点网络。我们试图根据 this 获取系统当前代理设置发布,但是只有在 iPad 设置 -> Wi-Fi -> 当前连接网络上的信息标签 -> HTTP 代理 -> 手动中设置时,它才会检索代理设置。这意味着我们无法通过(可能)移动互联网提供商设置的代理服务器(代理设置在 iPad 设置中不可见)。
有没有人遇到过同样的问题,你是怎么处理的? 另一个问题是,是否有任何方法可以从代理设置中找出代理用户名和密码(出于安全原因我认为没有),或者您只需要知道这些设置并将其作为配置传递给应用程序? 提前致谢。
curl 代码不适用于移动热点代理:
void TestCurl(std::string ProxyName, std::string proxyPort){
CURL *curl;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_URL, "http://someURLaddress.php");
curl_easy_setopt(curl, CURLOPT_PORT, 80);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)" );
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10 );
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCallback);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, EncryptedMessage.c_str());
curl_easy_setopt( curl, CURLOPT_FOLLOWLOCATION, 1 );
curl_easy_setopt( curl, CURLOPT_VERBOSE, 1 );
std::string ProxyServerSettings = ProxyName + ":" + proxyPort;
curl_easy_setopt( curl, CURLOPT_PROXY, ProxyServerSettings.c_str());
}
else{
...
}
...//curl cleanup etc
}
最佳答案
it retrieves proxy settings only if they are set in iPad settings
如果您引用设置 > Wi-Fi >(信息)-> HTTP 代理,您有 3 种可能性:
- 没有配置 HTTP 代理,
- 有一个手动配置的 HTTP 代理,
- 有一个 HTTP 代理自动配置了 PAC文件 URL(又名代理自动配置)
CFNetworkCopySystemProxySettings
和 CFNetworkCopyProxiesForURL
API 都允许您检测相应的配置。
特别是,您可以做类似的事情(基于 ARC 的代码):
+ (NSDictionary *)detectProxySettings {
NSDictionary *settings = nil;
NSURL *url = [NSURL URLWithString:@"http://www.example.com"];
NSURL *PAC = nil;
NSDictionary *system = (NSDictionary *) CFBridgingRelease(CFNetworkCopySystemProxySettings());
NSArray *proxies = (NSArray *) CFBridgingRelease(CFNetworkCopyProxiesForURL((__bridge CFURLRef) url, (__bridge CFDictionaryRef) system));
if (![proxies count])
return nil; // case (1)
settings = [proxies objectAtIndex:0];
PAC = [settings objectForKey:(NSString *) kCFProxyAutoConfigurationURLKey];
if (PAC != nil) {
// case (3)
// ...
}
// else: case (2)
return settings;
}
[is] there any way of figuring out the proxy username and password from the proxy settings
您无法读取密码(有关更多详细信息,请参阅此 answer)。
也就是说,多亏了上面的 system
字典,您可以:
- 检查代理是否已通过身份验证:检查
系统
上的@"HTTPProxyAuthenticated"
键。如果存在,则该值为 bool 值 (NSNumber
),表示代理是否已验证, - 如果代理已通过身份验证,则获取用户名:检查
系统
上的@"HTTPProxyUsername"
键。如果存在,则值为包含用户名的字符串 (NSString
)。
综上所述:如果代理已通过身份验证,则NO 无法自动检索密码。在这种情况下,您应该实现自己的 UI 以要求最终用户输入相应用户名的代理密码(例如使用 UIAlertViewStyleSecureTextInput
)。
关于iOS Libcurl 代理 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24123702/