Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为多个UIWebView设置不同的用户代理_Ios_Objective C_Uiwebview_User Agent_Nsurlrequest - Fatal编程技术网

Ios 为多个UIWebView设置不同的用户代理

Ios 为多个UIWebView设置不同的用户代理,ios,objective-c,uiwebview,user-agent,nsurlrequest,Ios,Objective C,Uiwebview,User Agent,Nsurlrequest,我的应用程序有UIWebViews,一些加载站点需要桌面版本的站点,一些加载站点需要移动版本的站点 因此,我将用户代理设置为桌面用户代理或移动用户代理来实现这一点 例如,如果我希望UIWebView加载站点的桌面版本,我只需在加载之前运行以下代码: NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) Apple

我的应用程序有UIWebViews,一些加载站点需要桌面版本的站点,一些加载站点需要移动版本的站点

因此,我将用户代理设置为桌面用户代理或移动用户代理来实现这一点

例如,如果我希望UIWebView加载站点的桌面版本,我只需在加载之前运行以下代码:

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
问题是,这当然是在设置NSUserDefaults变量,这意味着对于在此之后加载的我的应用程序中的任何UIWebView,它都将使用桌面用户代理。我可以根据需要在桌面和手机之间切换NSUserAgent并相应加载,但有时我的应用程序需要同时加载两个UIWebView,一个手机,一个桌面

是否有任何方法可以设置特定于所述UIWebView的UIWebView的用户代理


我假设这将涉及swizzling NSUrlRequest方法或其他什么?我对这些东西知之甚少

如果可能的话,简单的方法就是使用WKWebView而不是UIWebView。WKWebView将用户代理字符串作为类本身的属性公开(
.customUserAgent
,iOS9+)。作为额外的好处,在视图中运行的JavaScript代码将更快,并且使用更少的电池电量,因为JavaScript可以预编译为本机代码


也就是说,如果出于某种原因您必须坚持使用UIWebView,您可以创建一个NSURLProtocol来拦截所有应用程序的HTTP请求,并根据URL中的主机名更改字段。苹果网站上有一些NSURL协议的例子。从这个开始,根据需要进行调整。

感谢您的编辑。我忘了他们是在iOS 9之前才添加的。不用担心!这有助于我当前的项目,今晚切换到WKWebView!很高兴我能帮忙。