如何在Xamarin.iOS中向NSURLSession添加代理?

时间:2014-06-13 18:58:44

标签: objective-c xamarin.ios xamarin nsurlsession

我需要使用代理加载webview的内容。 我有这个代码(Objective-C):

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.connectionProxyDictionary = @{ (NSString *)kCFStreamPropertyHTTPProxyHost: [proxyURL host], (NSString *)kCFStreamPropertyHTTPProxyPort: [proxyURL port] };

以下Xamarin代码不起作用,ConnectionProxyDictionary已设置但应用程序未使用此设置:

var configuration = NSUrlSessionConfiguration.DefaultSessionConfiguration;
configuration.ConnectionProxyDictionary = new NSDictionary("kCFStreamPropertyHTTPProxyHost", proxyURL.Host, "kCFStreamPropertyHTTPProxyPort", proxyURL.port);

如何将Objective-C代码移植到Xamarin.iOS?还有另一种方法可以达到同样的目标吗?

2 个答案:

答案 0 :(得分:1)

它不起作用的原因是因为在Objective-C中,kXX被替换为对常量的实际引用,而在C#中,您只是插入了一个字符串名称。

你需要获取该常量的值并传递它:

使用此:

 using MonoTouch.ObjCRuntime;
 ...

 var keyHost = Dlfcn.GetStringConstant ("kCFStreamPropertyHTTPProxyHost")
 var keyPort = Dlfcn.GetStringConstant ("kCFStreamPropertyHTTPProxyPort")

然后使用keyHost和keyPort作为NSDictionary中的参数

答案 1 :(得分:0)

var configuration = NSUrlSessionConfiguration.DefaultSessionConfiguration;                  
NSObject[] values = new NSObject[]
{
    NSObject.FromObject(proxyURL.host),     //ProxyHost
    NSNumber.FromInt32 (proxyURL.port),     //Port
    NSNumber.FromInt32 (1),                   //Enable HTTP proxy

};

NSObject[] keys = new NSObject[]
{
    NSObject.FromObject("HTTPProxy"),
    NSObject.FromObject("HTTPPort"),
    NSObject.FromObject("HTTPEnable")
};

NSDictionary proxyDict = NSDictionary.FromObjectsAndKeys (values, keys);
configuration.ConnectionProxyDictionary = proxyDict;

var session = NSUrlSession.FromConfiguration (configuration);
var task = session.CreateDataTask(NSUrl.FromString("http://google.com"));
task.Resume ();