IOS原声与JS交互
IOS原声与JS交互
跟原生开发相比,H5的开发相对来一个成熟的框架和团队来讲在开发速度和开发效率上有着比原生很大的优势,至少不用等待审核。那么问题来了,H5与本地原生代码势必要有交互的,比如本地上传一些信息,H5打开本地的页面,打开本地进行微信等第三方分享等,今天就简单讲一下iOS中本地UIWebView,WKWebView与H5的交互。
DEMO地址:点击下载
UIWebView的交互
stringByEvaluatingJavaScriptFromString的使用
UIWebView在2.0时代就有的类,一直到现在(目前9.x)都可以使用的WEB容器,它的方法很简单,在iOS7.0之前JS交互的方法只有一个stringByEvaluatingJavaScriptFromString:
(nullable NSString )stringByEvaluatingJavaScriptFromString:(NSString )script; 使用stringByEvaluatingJavaScriptFromString方法,需要等UIWebView中的页面加载完成之后去调用.
以下是简单的使用场景:
1、获取当前页面的url。
(void)webViewDidFinishLoad:(UIWebView *)webView { NSString *currentURL = [webView stringByEvaluatingJavaScriptFromString:@”document.location.href”]; } 2、获取页面title:
(void)webViewDidFinishLoad:(UIWebView *)webView { NSString *currentURL = [webView stringByEvaluatingJavaScriptFromString:@”document.location.href”]; NSString *title = [webview stringByEvaluatingJavaScriptFromString:@”document.title”]; } 3、修改界面元素的值。
NSString *js_result = [webView stringByEvaluatingJavaScriptFromString:@”document.getElementsByName(‘q’)[0].value=’iOS’;”]; 4、表单提交:
NSString *js_result2 = [webView stringByEvaluatingJavaScriptFromString:@”document.forms[0].submit(); “]; 这样就实现了在google搜索关键字:“iOS”的功能。 5、插入js代码 上面的功能我们可以封装到一个js函数中,将这个函数插入到页面上执行,代码如下:
"script.type = 'text/javascript';"
"script.text = \"function myFunction() { "
"var field = document.getElementsByName('q')[0];"
"field.value='iOS';"
"document.forms[0].submit();"
"}\";"
"document.getElementsByTagName('head')[0].appendChild(script);"];
[webView stringByEvaluatingJavaScriptFromString:@"myFunction();"];
看上面的代码:
a、首先通过js创建一个script的标签,type为’text/javascript’。 b、然后在这个标签中插入一段字符串,这段字符串就是一个函数:myFunction,这个函数实现google自动搜索关键字的功能。 c、然后使用stringByEvaluatingJavaScriptFromString执行myFunction函数。
6、直接调用JS函数
上面的函数调用是本地注入到H5中,然后本地调用的,那么如果H5中就有原生的JS函数:myFunction();,那么我们就可以直接执行:
[webView stringByEvaluatingJavaScriptFromString:@”myFunction();”]; JavaScriptCore框架的使用
我们会发现stringByEvaluatingJavaScriptFromString的方法调用太笨拙,在iOS7.0中苹果公司增加了JS利器JavaScriptCore框架,框架让Objective-C和JavaScript代码直接的交互变得更加的简单方便。该框架其实只是基于webkit中以C/C++实现的JavaScriptCore的一个包装。其本身是可以单独作为一个开发库来使用,框架中有完整的数据计算逻辑,今天只讲H5与本地交互,所以不作涉及,有兴趣可以参考:iOS7新JavaScriptCore框架入门介绍。
JavaScriptCore提供了很多灵活的本地OC与JS的交互方式,通过JSContext和JSValue来完成的,JSContext是一个WebView中js代码运行环境,所有的JS交互都要通过- (JSValue )evaluateScript:(NSString )script;方法就可以执行一段JavaScript脚本。
JSValue则可以说是JavaScript和Object-C之间互换的桥梁,它提供了多种方法可以方便地把JavaScript数据类型转换成Objective-C.
具体如何交互我们先来看一段H5代码:
测试iOS与JS之前的互调 * { font-size: 40px; } function showAppAlertMsg(message){ alert(message); }
Test how to use objective-c call js
我们可以看出其中H5实现的JS代码如下:
function showAppAlertMsg(message){ alert(message); }
函数showAppAlertMsg是H5实现可以由我们本地主动调用的。那么相对应的H5主动调用的方法是:
其中callSystemCamera()是H5调用的函数,我们可以看到在HTML代码中是找不到这个函数的实现的,因为这个函数是需要我们本地去实现。
接下来我们就讲一下我们本地如何调用由H5实现的函数showAppAlertMsg,本地如何实现能够右H5端调用的方法:
1.在页面加载完成之后获取JS运行环境JSContext
(void)webViewDidFinishLoad:(UIWebView *)webView { JSContext *jsContext = [webView valueForKeyPath:@”documentView.webView.mainFrame.javaScriptContext”]; } 2.利用evaluateScript声明函数并传递参数执行代码
JSValue *jsValue = [jsContext evaluateScript:@”showAppAlertMsg”]; [jsValue callWithArguments:@[@”这是app本地交互文案”]]; 第一行代码是声明一个函数showAppAlertMsg,第二行是传递参数并执行代码callWithArguments.
以上是主动调用H5实现的函数,也可以称之为传递数据给H5。
本地实现能够让H5调用的函数:
// 也可以通过下标的方式获取到方法
self.jsContext[@"callSystemCamera"] = ^(){
NSLog(@"callSystemCamera");
};
self.jsContext[@"showAlertMsg"] = ^(NSString *title, NSString *message){
NSLog(@"callSystemCamera");
};
self.jsContext[@"callWithDict"] = ^(id jsonDic){
NSLog(@"callWithDict%@",jsonDic);
};
一目了然,通过Block传递参数和方法。
上面是利用JavaScriptCore的最基本的方法实现JS调用,还有另外一种方案利用JSExport协议进行交互.其实可以理解为通过JSExport协议实现一种把本地的实例绑定为H5中的一个对象,通过这个对象调用本地实例方法的一种交互设计。 该设计在H5端与上面的是不一样的:
我们会发现 与之前的H5代码相比 多了一个 OCModel,这个在JS中可以理解为一个对象,点击按钮之后调用对象OCModel中的函数OCModel.callSystemCamera,那么该对象如何由本地绑定呢。
1.首先声明一个JSExport协议,该协议需要声明刚才H5中的函数:
import
import “NLJsObjCModel.h”
@implementation NLJsObjCModel
(void)callWithDict:(NSDictionary *)params { NSLog(@”Js调用了OC的方法,参数为:%@”, params); }
// Js调用了callSystemCamera - (void)callSystemCamera { NSLog(@”JS调用了OC的方法,调起系统相册”);
// JS调用后OC后,又通过OC调用JS,但是这个是没有传参数的
JSValue *jsFunc = self.jsContext[@"jsFunc"];
[jsFunc callWithArguments:nil];
}
(void)jsCallObjcAndObjcCallJsWithDict:(NSDictionary *)params { NSLog(@”jsCallObjcAndObjcCallJsWithDict was called, params is %@”, params);
// 调用JS的方法 JSValue *jsParamFunc = self.jsContext[@”jsParamFunc”]; [jsParamFunc callWithArguments:@[@{@”age”: @10, @”name”: @”lili”, @”height”: @158}]]; }
(void)showAlert:(NSString )title msg:(NSString )msg { dispatch_async(dispatch_get_main_queue(), ^{ UIAlertView *a = [[UIAlertView alloc] initWithTitle:title message:msg delegate:nil cancelButtonTitle:@”Ok” otherButtonTitles:nil, nil]; [a show]; }); } @end 3.将NLJsObjCModel实例对象绑定到JS中:
pragma mark - UIWebViewDelegate
(void)webViewDidFinishLoad:(UIWebView *)webView { self.jsContext = [webView valueForKeyPath:@”documentView.webView.mainFrame.javaScriptContext”]; // 通过模型调用方法,这种方式更好些。 NLJsObjCModel *model = [[NLJsObjCModel alloc] init]; self.jsContext[@”OCModel”] = model; model.jsContext = self.jsContext; model.webView = self.webView;
self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) { context.exception = exceptionValue; NSLog(@”异常信息:%@”, exceptionValue); }; } 到此结束,H5按钮点击之后就可以通过JSExport协议传递跟本地对象,本地对象就能收到相应。
WKWebView的交互使用
iOS8以后,苹果推出了新框架Wekkit,提供了替换UIWebView的组件WKWebView。
先看下 WKWebView的特性: 1. 在性能、稳定性、功能方面有很大提升(最直观的体现就是加载网页是占用的内存,模拟器加载百度与开源中国网站时,WKWebView占用23M,而UIWebView占用85M); 2. 允许JavaScript的Nitro库加载并使用(UIWebView中限制); 3. 支持了更多的HTML5特性; 4. 高达60fps的滚动刷新率以及内置手势; 5. 将UIWebViewDelegate与UIWebView重构成了14类与3个协议(查看苹果官方文档);
WKWebView 的使用呢与UIWebView相同,不同的是回调和代理方法.这里简单介绍一下.
WKNavigationDelegate
// 页面开始加载时调用 - (void)webView:(WKWebView )webView didStartProvisionalNavigation:(WKNavigation )navigation; // 当内容开始返回时调用 - (void)webView:(WKWebView )webView didCommitNavigation:(WKNavigation )navigation; // 页面加载完成之后调用 - (void)webView:(WKWebView )webView didFinishNavigation:(WKNavigation )navigation; // 页面加载失败时调用 - (void)webView:(WKWebView )webView didFailProvisionalNavigation:(WKNavigation )navigation; 页面跳转的代理方法:
// 接收到服务器跳转请求之后调用 - (void)webView:(WKWebView )webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation )navigation; // 在收到响应后,决定是否跳转 - (void)webView:(WKWebView )webView decidePolicyForNavigationResponse:(WKNavigationResponse )navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler; // 在发送请求之前,决定是否跳转 - (void)webView:(WKWebView )webView decidePolicyForNavigationAction:(WKNavigationAction )navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler; 新的 WKUIDelegate协议
这个协议主要用于WKWebView处理web界面的三种提示框(警告框、确认框、输入框),下面是警告框的例子:
/** * web界面中有弹出警告框时调用 * * @param webView 实现该代理的webview * @param message 警告框中的内容 * @param frame 主窗口 * @param completionHandler 警告框消失调用 */ - (void)webView:(WKWebView )webView runJavaScriptAlertPanelWithMessage:(NSString )message initiatedByFrame:(void (^)())completionHandler; 动态加载并运行JS代码(WKUserScript)
用于在客户端内部加入JS代码,并执行,示例如下
// 图片缩放的js代码 NSString *js = @”var count = document.images.length;for (var i = 0; i < count; i++) {var image = document.images[i];image.style.width=320;};window.alert(‘找到’ + count + ‘张图’);”; // 根据JS字符串初始化WKUserScript对象 WKUserScript *script = [[WKUserScript alloc] initWithSource:js injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES]; // 根据生成的WKUserScript对象,初始化WKWebViewConfiguration WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; [config.userContentController addUserScript:script]; _webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config]; [_webView loadHTMLString:@”http://www.nsu.edu.cn/v/2014v3/img/background/3.jpg’ />”baseURL:nil]; [self.view addSubview:_webView]; 五、webView 执行JS代码 用户调用用JS写过的代码,一般指服务端开发的:
//javaScriptString是JS方法名,completionHandler是异步回调block [self.webView evaluateJavaScript:javaScriptString completionHandler:completionHandler];
六、JS调用App注册过的方法 在WKWebView里面注册供JS调用的方法,是通过WKUserContentController类下面的方法:
(void)addScriptMessageHandler:(id )scriptMessageHandler name:(NSString *)name; scriptMessageHandler是代理回调,JS调用name方法后,OC会调用scriptMessageHandler指定的对象。
JS在调用OC注册方法的时候要用下面的方式:
window.webkit.messageHandlers..postMessage() 注意,name(方法名)是放在中间的,在这里个人理解该name可以理解为一个标识,该标识将OC本地的实例对象绑定到JS中,将messageBody只能是一个对象,如果要传多个值,需要封装成数组,或者字典。整个示例如下:
//OC注册供JS调用的方法 [[_webView configuration].userContentController addScriptMessageHandler:self name:@”app”];
//OC在JS调用方法做的处理 - (void)userContentController:(WKUserContentController )userContentController didReceiveScriptMessage:(WKScriptMessage )message { NSLog(@”JS 调用了 %@ 方法,传回参数 %@”,message.name,message.body); }
//JS调用 window.webkit.messageHandlers.app.postMessage(null); 最后:
简单做一个总结,在iOS7以前我们只能使用UIWebView,所以在js交互中只能通过stringByEvaluatingJavaScriptFromString进行本地调用H5,而H5端调用本地多采用URLSchemes方式(解耦—Hybrid H5跨平台性思考),
iOS7之后使用UIWebView则可以使用JavaScriptCore框架,通过JSContext进行JS交互。 iOS8之后可以使用WKWebView本身的框架,毕竟WKWebView本身已经优化很多,并且提供了更多的方法和协议,不过注意一点的是在WKWebView中鉴于一些线程和进程的问题是无法获取JSContext的。
地址:http://www.w2bc.com/article/159394
你可能感兴趣的:(WebView)
微信 PC 版 4.0:新架构,新升级
创意锦囊
微信 架构
探索微信PC版4.0:新架构带来的革命性升级微信在2023年底推出了PC客户端4.0测试版,引入了全新的QT+C++原生跨平台架构。这次架构重构标志着微信在桌面端从传统的WebView技术迈向更现代化、高性能的原生技术基础,带来了显著的功能升级和用户体验优化。从旧到新:架构大变革旧架构:WebView+JavaScript微信旧版PC客户端主要依赖WebView技术,通过HTML、CSS和Java
【Flutter】webview_flutter使用详解
Jzin
flutter
文章目录前言一、如何使用前言webview_flutter是Flutter官方推出的一款用于Flutter上的webview插件,该插件在iOS用的是WKWebView支持;在Android上用的是系统WebView。插件地址:https://pub.dev/packages/webview_flutter一、如何使用第一步:在项目根目录下运行如下命令配置依赖flutterpubaddwebvie
百度指数+selenium+request+比特指纹浏览器+pywebview+pandas+flask过程性
万山y
python selenium 爬虫 flask pandas
1.cookies和headrs问题使用selenium获得的cookies测试没有问题,但是获得的heards头不可以使用,经过测试比较需要添加或者修改几项重点的heards为{'Cipher-Text':'1704885072633_1704970047346_SlMkwPX0ZnotTaSrpOEx50xhLlPT5iMH867nxTtYuapcdPhsh2d2ooVE2F+RSm+yhIF
优雅解决webview_flutter不支持安卓选择图片视频文件问题
GeniuswongAir
flutter android
这个问题,网上一搜索,就是要去修改别人写好的插件。搞Flutter开发,尽量不要去修改别人的插件,特别是像webview_flutter这种比较大的官方插件。相信我,你拿捏不了它。主要问题就是:webview_flutter在安卓上加载H5,如果需要上传图片、视频、文件,就点击没反应。解决办法:不要去修改webview_flutter_android插件,这非常得不优雅。直接在Flutter端,我
微信小程序使用web-view跳转网页解决跳转出现空白或者被拦截问题
开朗的网友(管理员)
微信小程序 前端 小程序
1.为了解决微信小程序跳转网页时出现的空白或被拦截问题,可以使用web-view组件进行跳转及其跳转后操作。首先,在小程序的页面布局文件中添加web-view组件的引用2.在需要跳转的地方,使用小程序提供的API进行跳转,并将参数对象作为参数传递过去wx.navigateTo({url:'/pages/webview/webview?url=https://www.example.com¶
C#使用WebView2指定用户数据文件夹
碎碎念的安静
c# 前端
在WebView2中,userDataFolder用于存储用户相关的数据,包括缓存、cookies、本地存储等。这个文件夹中的内容可以被WebView2控件访问和管理,用于提高浏览性能和用户体验。1.权限问题导致创建缓存文件夹失败做项目时遇到一个问题,用户将程序装到了C:\ProgramFiles(x86)文件夹下,在运行WebView2实例加载时报错,提示:“无法创建数据目录MicrosoftE
微信小程序加载H5页面及与H5页面通信的实战教程
Jiaberrr
小程序 微信小程序 前端 javascript webview
在微信小程序的开发过程中,我们有时需要在小程序中嵌入H5页面。本文将详细介绍如何在微信小程序中通过webview加载H5页面,并实现小程序与H5页面的通信。一、准备工作搭建微信小程序开发环境,具体步骤请参考官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/quickstart.html准备一个H5页面,可以是本地文件或线
iOS使用SDWebview加载图片失败?
AnderQZ
今天调试遇到一个很无奈的问题,就是出现了image无法加载出来。最后才发现是图片使用了中文命名,真TM的坑!SDWebimage没办法识别中文,必须要encode才行!
Android WebView常见问题及解决方案汇总
zhengxiuchen86
解决 解决方案 webview web android 问题
AndroidWebView常见问题及解决方案汇总参考文章:(1)AndroidWebView常见问题及解决方案汇总(2)http://www.cnblogs.com/olartan/p/5713013.html备忘一下。
Flutter 使用第三方包加载3d模型
AiFlutter
flutter 3d
1.O3D(第三方包)这是一个用于以glTF和GLB格式呈现交互式3D模型的Flutter小部件。这个小部件在WebView中嵌入了Google的web组件。在线演示:O3DBabakCode3DUI特性渲染glTF和GLB模型;支持动画模型,具有可配置的自动播放设置;可选地支持将模型启动到AR查看器中;可选地自动旋转模型,具有可配置的延迟;支持小部件的可配置背景颜色。2.使用流程2.1添加依赖在
Unity 插件 UniWebView,可以内嵌网页/浏览器到应用中
Jinx Boy
unity 游戏引擎 android
给大家推荐一个非常好用的unity内嵌网页插件:UniWebView最近在做安卓pad应用开发,需要用到内嵌网页的功能,发现这个最好用。一拖一改就可以了就是遇到了两个问题:一个是没有定位权限有些网页会打不开,解决方案可以看这篇:UnityAndroid内嵌网页,网页不开,没有定位权限另一个是加密的网页内容不允许加载,解决方案可以看这篇:Android开发,嵌入网页,网页打不开报错ERR_CLEAR
Android web view传递参数给js
HEHE_fang
https://www.jianshu.com/p/9d6a5353123b如果想加载之前就初始化一些数据给webview,比如登陆账户的id,cookie等如果是单纯的传递cookie,还是好办的如果是传递的参数比较多,用load中的loadurl(url,map);没有实验成功,难道webview没有直接修改js代码的方式?
多进程 Webview 实战
xifei66
Android学习之路 android webview 多进程
"AndroidP以及之后版本不支持同时从多个进程使用具有相同数据目录的WebView"以上为官方给出的说明,用白话来说就是,一个app中,如果有多个进程A、B、C,并且在A、B、C进程都是用到WebView的话,在AndroidP以及之后的版本中运行会报错://AndroidP以及之后版本不支持同时从多个进程使用具有相同数据目录的WebView//为其它进程webView设置目录@Require
WebView交互架构项目实战(三),androidstudio地图开发
wq221aas
程序员 架构 移动开发 android
不过根据官方文档,AppCache已经不推荐使用了,标准也不会再支持。现在主流的浏览器都是还支持AppCache的,以后就不太确定了。同样给出Android端启用AppCache的代码。WebViewmyWebView=(WebView)findViewById(R.id.webview);WebSettingswebSettings=myWebView.getSettings();webSett
多进程android webview,Android Pie(9.0)WebView在多进程中
weixin_39983993
多进程android webview
解决了.我的项目托管了AdMob广告,我在Application类onCreate()中调用了MobileAds.initialize()方法.广告初始值设定项会加载一个WebView,在调用WebView.setDataDirectorySuffix(“dir_name_no_separator”)方法之前,该WebView现在禁止在新进程中执行.当创建第二个进程时,它也会通过相同的应用程序创建
WebView交互架构项目实战(三),史上超级详细
m0_66264881
程序员 架构 移动开发 android
returnsplashTargetPath+“/”;}***1:常用JS本地化及延迟加载*******资源等文件(不需要更新)本地存储,在需要的时候直接从本地获取。哪些资源需要我们去存储在本地呢,当然是一些不会被更新的资源,例如图片文件,js文件,css文件,比预加载更粗暴的优化方法是直接将常用的JS脚本本地化,直接打包放入apk中。比如H5页面获取用户信息,设置标题等通用方法,就可以直接写入一
WebView交互架构项目实战(三):多进程WebView使用实践
2401_84433924
交互 架构
prompt(“settitle”,JSON.stringify(params))},‘params’:{},‘callback’:function(res){}},}catch(e){alert(‘demo.jserror:’+e);}varreadyEvent=document.createEvent(‘Events’);readyEvent.initEvent(‘JSBridgeReady’
webview无法加载http流量及Expo修改Android权限
小童不学前端
React Natvie react native Expo android http
文章目录前言react-native-webview无法加载http流量报错修改http网络权限1.迁移到EASBuild2.创建android文件夹3.修改AndroidManifest.xml4.添加网络安全配置文件(可选)5.构建项目6.使用HTTPS前言在使用RN直接创建项目时,我们可以进行修改里面的一些权限,但是当我们使用Expo开发时,却发现没有android的这些文件夹,所以修改权限
react native中ScrollView嵌套WebView导致的闪退(rn版本0.70.0)
诚实可靠王大锤
前端 react native javascript
reactnative中ScrollView嵌套WebView导致的闪退(rn版本0.70.0)网上找了一圈,WebView的问题区也看了一圈,没有可以解决我的闪退的问题,重复进出页面后依然会闪退,最终解决方案1.在ScrollView中添加overScrollMode=“never”2.在退出页面时卸载包含WebView的组件,可以用公共变量进行控制,退出时卸载,进入后重新加载3.在webvie
uni-app基础框架搭建(vue3+ts+vite)
LB_bei
前端 uni-app
1.基础准备uni-app官网uni-app,uniCloud,serverless,环境安装,创建uni-app,自定义模板,国内特殊情况,更新依赖到指定版本,运行、发布uni-app,运行并发布快应用,运行并发布快应用(webview),运行并发布快应用(webview)-华为,cli创建项目和HBuilderX可视化界面创https://uniapp.dcloud.net.cn/quicks
uniapp引入uniapp打包的H5跳转H5以及H5返回app方法
qq_Girl200
uni-app webview 前端
在app项目添加webview文件夹添加gridWebview.vue文件。代码如下exportdefault{data(){return{src:'',}},computed:{token(){returnthis.$store.state.login.token||''},roles(){returnthis.$store.state.login.roles||''},userInfo(){r
学习一下Appium 常用方法介绍
Feng.Lee
漫谈测试 学习 appium
由于appium是扩展了Webdriver协议,所以可以使用webdriver提供的方法,比如在处理webview页面,完全可以使用webdriver中的方法。当然在原生应用中,也可以使用。1.1点击操作WebElementbutton=driver.findElement(By.id(“login”));或者WebElementbutton=driver.findElementById(“log
ios加载html富文本编辑器,IOS - 富文本解决方案(上)
Mr.括号
ios加载html富文本编辑器
概述针对富文本来说,一直都是移动端的痛。虽然网上的解决方案很多,但是大多数都是基于展示,真正可以进行编辑的,却很少。而这些少数的实现中,适合我使用就没有了。所以我决定自己研究,并实现。需求需求说起来很简单,就是要设计一款IOS、Androd、PC端通用的富文本编辑器。模仿新浪微博中-头条文章。调研经过多次的分析和调研,有过这么几套方案。使用UIWebView来实现使用内嵌js编辑器实现使用html
python+html开发桌面应用程序(一)pywebview介绍
丁爸
python3 web前端 python js
本文介绍用python+html开发桌面应用程序,主要是用pywebview来加载、显示html页面。一.pywebview简介pywebview是围绕webview组件的轻型跨平台包装器,它允许在其自己的本机GUI窗口中显示HTML内容。您可能会想到Python的Electron,但是pywebview打包的执行文件小很多。它为您提供了桌面应用程序中的Web技术功能,隐藏了GUI基于浏览器的事实
WebView快速打开
鹿屿二向箔
webview
WebView是一个用于在应用程序中显示网页的组件。在Android和iOS等移动操作系统中,都有内置的WebView组件。为了实现WebView的快速打开,可以采取以下几种方法:###Android1.**使用缓存**:-启用缓存可以显著提高网页加载速度。可以在`WebView`的设置中启用缓存,并配置合适的缓存路径。2.**预加载WebView**:-如果已知用户将要打开某个网页,可以在后台预
android开发中使用WebView性能优化攻略
cesske
android
目录前言1.缓存策略2.硬件加速3.异步加载4.压缩和优化资源5.禁用不必要的特性6.内存管理7.监控和分析8.适配不同设备9.更新WebView组件总结前言在Android开发中,WebView用于展示网页内容,但它可能会引入性能问题,如加载速度慢、内存占用高、滚动不流畅等。以下是一些针对WebView性能优化的策略和技巧:1.缓存策略开启应用缓存:通过设置WebView的缓存模式来缓存网页数据
曾经的iOS 9,为前端世界都带来了些什么?
qq_34281962
移动开发 前端 开发人员 苹果 ios 技术
2015年9月,Apple重磅发布了全新的iPhone6s/6sPlus、iPadPro与全新的操作系统watchOS2与tvOS9(是的,这货居然是第9版),加上已经发布的iOS9,它们都为前端世界带来了哪些变化呢?作为一个web开发者,是时候站在我们的角度来说一说了!注!该译文存在大量英文术语,笔者将默认读者知晓ES6、viewport、nativeapp、webview等常用前端术语,并不对
Flutter 第三方库
creazylee
flutter_redux:在Flutter上使用Redux。flutter_webview_plugin:WebView插件。flutter_amap:高德地图Flutter插件。flutter_alipay:支付宝支付Flutter插件。amap_location:高德地图定位插件。flutter_mobile_vision:二维码识别神库,支持人面识别。barcode_scan:二维码识别库
Android中webview优化策略
小虫飘飘
webview
在Android开发中,要实现WebView的秒开体验,可以通过一系列性能优化策略来显著提升WebView的加载速度和用户体验。以下是一些关键的优化措施:1.加载优化预加载WebView:在应用启动时提前初始化WebView并进行预加载,如加载一个空白页(about:blank),以减少WebView首次加载页面的时间。延迟加载:将一些非首屏必需的操作推迟到首屏显示后再执行,如后台网络请求、埋点上
iOS Native与JS通信:JSBridge
ilycyq
ios javascript 开发语言 cocoa objective-c xcode 前端
文章目录一、简介二、JS调用Native1.使用URLSchemea.UIWebViewb.WKWebView2.使用JavaScriptCore(iOS7+)3.使用WKWebView和WKScriptMessageHandler(iOS8+)三、Native调用JS1.使用UIWebView2.使用WKWebView3.使用JavaScriptCore(iOS7+)一、简介对于移动应用程序的开
java解析APK
3213213333332132
java apk linux 解析APK
解析apk有两种方法
1、结合安卓提供apktool工具,用java执行cmd解析命令获取apk信息
2、利用相关jar包里的集成方法解析apk
这里只给出第二种方法,因为第一种方法在linux服务器下会出现不在控制范围之内的结果。
public class ApkUtil
{
/**
* 日志对象
*/
private static Logger
nginx自定义ip访问N种方法
ronin47
nginx 禁止ip访问
因业务需要,禁止一部分内网访问接口, 由于前端架了F5,直接用deny或allow是不行的,这是因为直接获取的前端F5的地址。
所以开始思考有哪些主案可以实现这样的需求,目前可实施的是三种:
一:把ip段放在redis里,写一段lua
二:利用geo传递变量,写一段
mysql timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性
dcj3sjt126com
mysql
timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下:
1.
CURRENT_TIMESTAMP
当要向数据库执行insert操作时,如果有个timestamp字段属性设为
CURRENT_TIMESTAMP,则无论这
struts2+spring+hibernate分页显示
171815164
Hibernate
分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流。
1、DAO层接口的设计,在MemberDao接口中定义了如下两个方法:
public in
构建自己的Wrapper应用
g21121
rap
我们已经了解Wrapper的目录结构,下面可是正式利用Wrapper来包装我们自己的应用,这里假设Wrapper的安装目录为:/usr/local/wrapper。
首先,创建项目应用
&nb
[简单]工作记录_多线程相关
53873039oycg
多线程
最近遇到多线程的问题,原来使用异步请求多个接口(n*3次请求) 方案一 使用多线程一次返回数据,最开始是使用5个线程,一个线程顺序请求3个接口,超时终止返回 缺点 测试发现必须3个接
调试jdk中的源码,查看jdk局部变量
程序员是怎么炼成的
jdk 源码
转自:http://www.douban.com/note/211369821/
学习jdk源码时使用--
学习java最好的办法就是看jdk源代码,面对浩瀚的jdk(光源码就有40M多,比一个大型网站的源码都多)从何入手呢,要是能单步调试跟进到jdk源码里并且能查看其中的局部变量最好了。
可惜的是sun提供的jdk并不能查看运行中的局部变量
Oracle RAC Failover 详解
aijuans
oracle
Oracle RAC 同时具备HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基础就是Failover(故障转移). 它指集群中任何一个节点的故障都不会影响用户的使用,连接到故障节点的用户会被自动转移到健康节点,从用户感受而言, 是感觉不到这种切换。
Oracle 10g RAC 的Failover 可以分为3种:
1. Client-Si
form表单提交数据编码方式及tomcat的接受编码方式
antonyup_2006
JavaScript tomcat 浏览器 互联网 servlet
原帖地址:http://www.iteye.com/topic/266705
form有2中方法把数据提交给服务器,get和post,分别说下吧。
(一)get提交
1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。
对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:
JS初学者必知的基础
百合不是茶
js函数 js入门基础
JavaScript是网页的交互语言,实现网页的各种效果,
JavaScript 是世界上最流行的脚本语言。
JavaScript 是属于 web 的语言,它适用于 PC、笔记本电脑、平板电脑和移动电话。
JavaScript 被设计为向 HTML 页面增加交互性。
许多 HTML 开发者都不是程序员,但是 JavaScript 却拥有非常简单的语法。几乎每个人都有能力将小的
iBatis的分页分析与详解
bijian1013
java ibatis
分页是操作数据库型系统常遇到的问题。分页实现方法很多,但效率的差异就很大了。iBatis是通过什么方式来实现这个分页的了。查看它的实现部分,发现返回的PaginatedList实际上是个接口,实现这个接口的是PaginatedDataList类的对象,查看PaginatedDataList类发现,每次翻页的时候最
精通Oracle10编程SQL(15)使用对象类型
bijian1013
oracle 数据库 plsql
/*
*使用对象类型
*/
--建立和使用简单对象类型
--对象类型包括对象类型规范和对象类型体两部分。
--建立和使用不包含任何方法的对象类型
CREATE OR REPLACE TYPE person_typ1 as OBJECT(
name varchar2(10),gender varchar2(4),birthdate date
);
drop type p
【Linux命令二】文本处理命令awk
bit1129
linux命令
awk是Linux用来进行文本处理的命令,在日常工作中,广泛应用于日志分析。awk是一门解释型编程语言,包含变量,数组,循环控制结构,条件控制结构等。它的语法采用类C语言的语法。
awk命令用来做什么?
1.awk适用于具有一定结构的文本行,对其中的列进行提取信息
2.awk可以把当前正在处理的文本行提交给Linux的其它命令处理,然后把直接结构返回给awk
3.awk实际工
JAVA(ssh2框架)+Flex实现权限控制方案分析
白糖_
java
目前项目使用的是Struts2+Hibernate+Spring的架构模式,目前已经有一套针对SSH2的权限系统,运行良好。但是项目有了新需求:在目前系统的基础上使用Flex逐步取代JSP,在取代JSP过程中可能存在Flex与JSP并存的情况,所以权限系统需要进行修改。
【SSH2权限系统的实现机制】
权限控制分为页面和后台两块:不同类型用户的帐号分配的访问权限是不同的,用户使
angular.forEach
boyitech
AngularJS AngularJS API angular.forEach
angular.forEach 描述: 循环对obj对象的每个元素调用iterator, obj对象可以是一个Object或一个Array. Iterator函数调用方法: iterator(value, key, obj), 其中obj是被迭代对象,key是obj的property key或者是数组的index,value就是相应的值啦. (此函数不能够迭代继承的属性.)
java-谷歌面试题-给定一个排序数组,如何构造一个二叉排序树
bylijinnan
二叉排序树
import java.util.LinkedList;
public class CreateBSTfromSortedArray {
/**
* 题目:给定一个排序数组,如何构造一个二叉排序树
* 递归
*/
public static void main(String[] args) {
int[] data = { 1, 2, 3, 4,
action执行2次
Chen.H
JavaScript jsp XHTML css Webwork
xwork 写道 <action name="userTypeAction"
class="com.ekangcount.website.system.view.action.UserTypeAction">
<result name="ssss" type="dispatcher">
[时空与能量]逆转时空需要消耗大量能源
comsci
能源
无论如何,人类始终都想摆脱时间和空间的限制....但是受到质量与能量关系的限制,我们人类在目前和今后很长一段时间内,都无法获得大量廉价的能源来进行时空跨越.....
在进行时空穿梭的实验中,消耗超大规模的能源是必然
oracle的正则表达式(regular expression)详细介绍
daizj
oracle 正则表达式
正则表达式是很多编程语言中都有的。可惜oracle8i、oracle9i中一直迟迟不肯加入,好在oracle10g中终于增加了期盼已久的正则表达式功能。你可以在oracle10g中使用正则表达式肆意地匹配你想匹配的任何字符串了。
正则表达式中常用到的元数据(metacharacter)如下:
^ 匹配字符串的开头位置。
$ 匹配支付传的结尾位置。
*
报表工具与报表性能的关系
datamachine
报表工具 birt 报表性能 润乾报表
在选择报表工具时,性能一直是用户关心的指标,但是,报表工具的性能和整个报表系统的性能有多大关系呢?
要回答这个问题,首先要分析一下报表的处理过程包含哪些环节,哪些环节容易出现性能瓶颈,如何优化这些环节。
一、报表处理的一般过程分析
1、用户选择报表输入参数后,报表引擎会根据报表模板和输入参数来解析报表,并将数据计算和读取请求以SQL的方式发送给数据库。
2、
初一上学期难记忆单词背诵第一课
dcj3sjt126com
word english
what 什么
your 你
name 名字
my 我的
am 是
one 一
two 二
three 三
four 四
five 五
class 班级,课
six 六
seven 七
eight 八
nince 九
ten 十
zero 零
how 怎样
old 老的
eleven 十一
twelve 十二
thirteen
我学过和准备学的各种技术
dcj3sjt126com
技术
语言VB https://msdn.microsoft.com/zh-cn/library/2x7h1hfk.aspxJava http://docs.oracle.com/javase/8/C# https://msdn.microsoft.com/library/vstudioPHP http://php.net/manual/en/Html
struts2中token防止重复提交表单
蕃薯耀
重复提交表单 struts2中token
struts2中token防止重复提交表单
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2015年7月12日 11:52:32 星期日
ht
线性查找二维数组
hao3100590
二维数组
1.算法描述
有序(行有序,列有序,且每行从左至右递增,列从上至下递增)二维数组查找,要求复杂度O(n)
2.使用到的相关知识:
结构体定义和使用,二维数组传递(http://blog.csdn.net/yzhhmhm/article/details/2045816)
3.使用数组名传递
这个的不便之处很明显,一旦确定就是不能设置列值
//使
spring security 3中推荐使用BCrypt算法加密密码
jackyrong
Spring Security
spring security 3中推荐使用BCrypt算法加密密码了,以前使用的是md5,
Md5PasswordEncoder 和 ShaPasswordEncoder,现在不推荐了,推荐用bcrpt
Bcrpt中的salt可以是随机的,比如:
int i = 0;
while (i < 10) {
String password = "1234
学习编程并不难,做到以下几点即可!
lampcy
java html 编程语言
不论你是想自己设计游戏,还是开发iPhone或安卓手机上的应用,还是仅仅为了娱乐,学习编程语言都是一条必经之路。编程语言种类繁多,用途各 异,然而一旦掌握其中之一,其他的也就迎刃而解。作为初学者,你可能要先从Java或HTML开始学,一旦掌握了一门编程语言,你就发挥无穷的想象,开发 各种神奇的软件啦。
1、确定目标
学习编程语言既充满乐趣,又充满挑战。有些花费多年时间学习一门编程语言的大学生到
架构师之mysql----------------用group+inner join,left join ,right join 查重复数据(替代in)
nannan408
right join
1.前言。
如题。
2.代码
(1)单表查重复数据,根据a分组
SELECT m.a,m.b, INNER JOIN (select a,b,COUNT(*) AS rank FROM test.`A` A GROUP BY a HAVING rank>1 )k ON m.a=k.a
(2)多表查询 ,
使用改为le
jQuery选择器小结 VS 节点查找(附css的一些东西)
Everyday都不同
jquery css name选择器 追加元素 查找节点
最近做前端页面,频繁用到一些jQuery的选择器,所以特意来总结一下:
测试页面:
<html>
<head>
<script src="jquery-1.7.2.min.js"></script>
<script>
/*$(function() {
$(documen
关于EXT
tntxia
ext
ExtJS是一个很不错的Ajax框架,可以用来开发带有华丽外观的富客户端应用,使得我们的b/s应用更加具有活力及生命力。ExtJS是一个用 javascript编写,与后台技术无关的前端ajax框架。因此,可以把ExtJS用在.Net、Java、Php等各种开发语言开发的应用中。
ExtJs最开始基于YUI技术,由开发人员Jack
一个MIT计算机博士对数学的思考
xjnine
Math
在过去的一年中,我一直在数学的海洋中游荡,research进展不多,对于数学世界的阅历算是有了一些长进。为什么要深入数学的世界?作为计算机的学生,我没有任何企图要成为一个数学家。我学习数学的目的,是要想爬上巨人的肩膀,希望站在更高的高度,能把我自己研究的东西看得更深广一些。说起来,我在刚来这个学校的时候,并没有预料到我将会有一个深入数学的旅程。我的导师最初希望我去做的题目,是对appe