利用UIWebView获取userAgent需要注意的地方

2024-09-05 13:48

本文主要是介绍利用UIWebView获取userAgent需要注意的地方,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

网络通信有时候需要传递参数userAgent,iOS中获取userAgent很简单.

    UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectZero];NSString *userAgentString = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];

打印信息如下

userAgentString --> Mozilla/5.0 (iPod touch; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D167

有时候,你想在后台线程中获取userAgent,直接就有如下信息提示:

bool _WebTryThreadLock(bool), 0x14e6b590: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now...

找了一下资料,原来是这么回事:

Webviews and the Webkit JavaScript engine are both single-threaded and cannot be used on a background thread.

Webview以及Webkit Java脚本引擎,这两个都是单线程的,不能够在子线程中使用.

 

所以,不要试图在子线程中获取userAgent,虽然获取userAgent耗时间,但第一次获取后可以把userAgent值存储起来,下回直接读取就行了.

 

 

附录:

stringByEvaluatingJavaScriptFromString使用方法
http://it.100xuexi.com/view/otdetail/20120511/abfdd193-50d1-43da-b49f-5411c014ad9b.html
使用stringByEvaluatingJavaScriptFromString方法,需要等UIWebView中的页面加载完成之后去调用。我们在界面上拖放一个UIWebView控件。在Load中将googlemobile加载到这个控件中,代码如下:
1. - (void)viewDidLoad
2. {
3. [super viewDidLoad];
4. webview.backgroundColor = [UIColor clearColor];
5. webview.scalesPageToFit =YES;
6. webview.delegate =self;
7. NSURL *url =[[NSURL alloc] initWithString:@"http://www.google.com.hk/m?gl=CN&hl=zh_CN&source=ihp"];
8.
9. NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
10. [webview loadRequest:request];
11. }
我们在webViewDidFinishLoad方法中就可以通过javascript操作界面元素了。
1、获取当前页面的url。
1. - (void)webViewDidFinishLoad:(UIWebView *)webView {
2. NSString *currentURL = [webView stringByEvaluatingJavaScriptFromString:@"document.location.href"];
3. }
2、获取页面title:
1. - (void)webViewDidFinishLoad:(UIWebView *)webView {
2. NSString *currentURL = [webView stringByEvaluatingJavaScriptFromString:@"document.location.href"];
3.
4. NSString *title = [webview stringByEvaluatingJavaScriptFromString:@"document.title"];
5. }
3、修改界面元素的值。
1. NSString *js_result = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByName('q')[0].value='朱祁林';"];
4、表单提交:
1. NSString *js_result2 = [webView stringByEvaluatingJavaScriptFromString:@"document.forms[0].submit(); "];
这样就实现了在google搜索关键字:“朱祁林”的功能。
5、插入js代码
上面的功能我们可以封装到一个js函数中,将这个函数插入到页面上执行,代码如下:
1. [webView stringByEvaluatingJavaScriptFromString:@"var script = document.createElement('script');"
2. "script.type = 'text/javascript';"
3. "script.text = \"function myFunction() { "
4. "var field = document.getElementsByName('q')[0];"
5. "field.value='朱祁林';"
6. "document.forms[0].submit();"
7. "}\";"
8. "document.getElementsByTagName('head')[0].appendChild(script);"];
9.
10. [webView stringByEvaluatingJavaScriptFromString:@"myFunction();"];
看上面的代码:
a、首先通过js创建一个script的标签,type为'text/javascript'。
b、然后在这个标签中插入一段字符串,这段字符串就是一个函数:myFunction,这个函数实现google自动搜索关键字的功能。
c、然后使用stringByEvaluatingJavaScriptFromString执行myFunction函数。
演示:
第一步打开google mobile网站
 
第二步输入关键字
 
第三步搜素
 
总结:这篇文章主要是讲解了stringByEvaluatingJavaScriptFromString的用法,它的功能非常的强大,用起来非常简单,通过它我们可以很方便的操作uiwebview中的页面元素。

这篇关于利用UIWebView获取userAgent需要注意的地方的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139132

相关文章

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

SpringMVC入参绑定特别注意

1.直接在controller中定义一个变量,但是此种传输方式有一个限制就是参数名和请求中的参数名必须保持一致,否则失效。 @RequestMapping("test2")@ResponseBodypublic DBHackResponse<UserInfoVo> test2(String id , String name){UserInfoVo userInfoVo = new UserInf

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

JS和jQuery获取节点的兄弟,父级,子级元素

原文转自http://blog.csdn.net/duanshuyong/article/details/7562423 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。 JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素。 <div id="test"><div></div><div></div

vcpkg子包路径批量获取

获取vcpkg 子包的路径,并拼接为set(CMAKE_PREFIX_PATH “拼接路径” ) import osdef find_directories_with_subdirs(root_dir):# 构建根目录下的 "packages" 文件夹路径root_packages_dir = os.path.join(root_dir, "packages")# 如果 "packages"

Weex入门教程之4,获取当前全局环境变量和配置信息(屏幕高度、宽度等)

$getConfig() 获取当前全局环境变量和配置信息。 Returns: config (object): 配置对象;bundleUrl (string): bundle 的 url;debug (boolean): 是否是调试模式;env (object): 环境对象; weexVersion (string): Weex sdk 版本;appName (string): 应用名字;

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD