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)
VSCode WebView React 开源项目实战指南
廉珏俭Mercy
VSCodeWebViewReact开源项目实战指南本指南旨在帮助您了解并快速上手vscode-webview-react开源项目,该项目提供了一个基于React和TypeScript的起点,用于在VisualStudioCode的Webview中开发扩展。以下是核心模块的详细介绍:1.项目目录结构及介绍├──package.json//项目配置文件,包括依赖、scripts命令等├──publi
自测魅族手机webview加载h5时ul嵌套li标签js失效问题记录
ZhDan91
混合app 前端开发
自测魅族手机ul嵌套li标签js失效问题:可采用div嵌套option实现样式:.hot_list{width:100%;display:flex;flex-wrap:wrap;justify-content:space-between;}.hot_listoption{text-align:center;width:30%;padding:.16rem.34rem;border:0.1remso
webview的使用说明
1、WebChromeClient和WebViewClient的区别(1)、webviewclient就是帮助webview处理各种通知、请求事件的,具体来说包括:onloadresource、onpagestart、onpagefinish、onreceiveerror、onreceivedhttpauthrequest(2)、webchromeclient是辅助webview处理javascr
WebView 中 Cookie 丢失怎么办?跨域状态不同步的调试与修复经验
HTTPwise
http udp https websocket 网络安全 网络协议 tcp/ip
现代App内的WebView页面常涉及多个业务域名:主域名提供用户登录、其他二级域名承载活动或内容页。理想情况下Cookie能跨子域共享用户状态,但在WebView中却经常遇到Cookie丢失、登录态失效、或者主域和子域状态不同步的问题。这些问题在浏览器中难以复现,却在部分移动端WebView环境中频发,成为线上最难定位的“偶发bug”之一。背景:部分用户反馈活动页被频繁登出某次活动页部署在m.e
更新!「3D Web轻量化引擎」HOOPS Communicator发布2025.2.0版本:全新WebViewer用户界面、
工业3D_大熊
3D CAD开发工具 3d 3D建模 3D模型轻量化 工业3D 3D数据格式转换 3D模型可视化 3D Web轻量化
3DWeb轻量化引擎HOOPSCommunicator此前发布2025.2.0版本!此次更新聚焦于提升用户体验和稳定性,通过引入创新的界面设计以及对若干问题的修复,确保用户能够更加高效、流畅地处理3D数据可视化任务。以下将详细阐述本次更新的核心内容。一、增强功能本次更新的重点在于对WebViewer用户界面的革新。我们精心打造了全新的WebViewerUI,其核心基于WebComponents技术
WebView 页面在多语言环境中错位怎么办?国际化适配调试全过程
2501_91600747
http udp https websocket 网络安全 网络协议 tcp/ip
移动应用全球化后,WebView页面往往需要同时适配多种语言和地区设置,包括英语、中文、阿拉伯语等。尤其是当用户使用RTL(Right-to-Left,阿拉伯语、希伯来语等)语言环境时,页面容易出现布局错乱、文字溢出或控件位置异常。这类问题并不会在本地开发环境或英文/中文设置下暴露,常常等到国际用户反馈后才暴露。本文分享一次我们为多语言环境适配进行调试和修复的完整过程。背景:国际化上线后阿拉伯语用
android webview confilm,Android-WebView(四) 实现一个安全的webView
王诗沐
android webview confilm
正如文章Androidwebview(三)addJavascriptInterface的安全问题中所展示的那样,Androidapi17(Android4.2)版本之前,通过WebView.addJavascriptInterface()方法添加的JavaBridge存在安全性风险,那么该怎么避免呢?js向java通信的渠道--prompt我们知道js中常用的方法:alert,console.lo
WebView 安全之 addJavascriptInterface
WebView安全之addJavascriptInterface不会写代码的IT男关注2016.01.0318:14*字数474阅读5668评论0喜欢30x00addJavascriptInterface介绍WebView是Android平台下的一个重要组件,通常用来在Activity中嵌入一个简单的浏览器,实现在线网页浏览的功能。比如下面代码实现访问Google页面:WebViewwebView
介绍Flutter
一、Flutter的核心优势:不止于跨平台高性能原生渲染自研引擎Skia:直接调用GPU绘制UI,绕过原生控件依赖,消除JavaScript桥接性能损耗,实现60fps流畅动画。三棵树渲染机制(Widget-Element-RenderObject):通过差异化更新最小化重绘范围,效率远超传统WebView方案。极速开发体验热重载(HotReload):代码修改后毫秒级生效,保留应用状态调试,开发
在Unity WebView中运行React应用的解决方案
马特说
UNITY REACT unity react.js 游戏引擎
在UnityWebView中运行React应用的解决方案概述本文档详细介绍了如何在Unity应用中通过WebView加载React应用,并解决在Android平台上常见的路径和网络问题。目录项目架构React项目打包Unity本地服务器配置Android平台特殊处理路径映射问题解决网络权限配置完整实现步骤常见问题排查项目架构该项目采用以下架构:Unity应用:主应用程序,包含游戏逻辑和UIWebV
Unity WebView 中 LaTeX 渲染问题解决方案
UnityWebView中LaTeX渲染问题解决方案问题概述在UnityWebView节点信息面板中,LaTeX公式无法正确渲染,主要表现为:LaTeX公式显示为原始代码,没有被渲染特殊字符(如反斜杠\)被显示为特殊符号(如♦)公式渲染出现“Mathinputerror”错误提示问题原因分析1.字符编码与转义问题Unity向WebView传递数据时,存在字符编码和转义问题:双重转义:Unity中的
深入掌握Android WebView开发指南
weixin_42668301
本文还有配套的精品资源,点击获取简介:WebView是Android开发中的一个关键组件,它允许应用程序内嵌网页内容,从而增强应用的功能和用户体验。本文详细介绍了如何在Android应用中使用WebView组件,包括初始化设置、加载网页、交互控制、权限管理、进度条显示、安全隐私、缓存管理、硬件加速控制及资源清理等多个方面的知识。通过实际应用这些技术点,开发者可以构建出流畅、安全的内嵌网页浏览功能。
移动开发:WebView的性能优化工具推荐与使用
移动开发:WebView的性能优化工具推荐与使用关键词:WebView、性能优化、移动开发、渲染性能、内存管理、调试工具、缓存策略摘要:本文深入探讨移动开发中WebView的性能优化策略和工具。我们将从WebView的核心原理出发,分析其性能瓶颈,介绍一系列实用的性能优化工具和技术,包括ChromeDevTools、AndroidProfiler、Systrace等。文章还将提供详细的代码示例和优
Android WebView 性能优化指南
AndroidWebView性能优化指南WebView优化需要从多个维度综合考虑:优化维度关键措施预期收益初始化延迟加载、实例复用降低内存峰值渲染硬件加速、合理布局提升流畅度20%+内存独立进程、泄漏防护减少OOM风险网络缓存策略、资源拦截节省流量30%+安全漏洞修复、接口限制提升安全性监控性能埋点、远程调试快速定位问题WebView是Android中用于展示网页内容的组件,但如果不进行优化,可能
【微信小程序】小程序的双线程架构,为什么要设计成双线程的,双线程之间如何通信
我有一棵树
小程序 微信小程序
在开始学习之前,建议看一下官方文档逻辑层和渲染层微信小程序是双线程的,有渲染层和逻辑层两个执行环境,渲染层负责页面的渲染和样式,逻辑层负责小程序的逻辑和数据处理。渲染线程:渲染层使用了WebView负责渲染界面,包括解析wxml,wxss,样式计算,布局排版和绘制试图等操作。一个页面是一个WebView,所以渲染层会有多个webview逻辑线程:基于有JsCore运行js脚本,负责处理业务逻辑和数
小程序的「双线程模型」
TE-茶叶蛋
小程序开发 小程序
文章目录前言一、双线程模型结构概览二、逻辑层(AppService)示例:️三、渲染层(WebView)示例(WXML):四、通信机制(Native层桥接)⚙️通信方式:底层实现方式:五、为什么这么设计?缺点与限制总结结构图✅实践建议扩展小程序双线程模型的**进阶架构扩展**一、支持WebWorker的多线程能力(逻辑层并发能力增强)✅使用示例:⚠️注意:二、沙箱机制强化(增强渲染安全)三、小程序
uniapp微信小程序pdf预览,且可以添加自定义水印(兼容安卓和ios)
柒染染呀
微信小程序 pdf android ios
微信小程序pdf预览,且可以添加自定义水印(兼容安卓和ios)uniapp微信小程序pdf预览一、使用webview方式,访问pdf文件地址//showFilePath是pdf文件访问路径但是这样有个问题,如果这个访问地址是使用了代理,不是直接访问pdf文件的路径(以pdf结尾的路径),在小程序上安卓真机上会显示白屏,IOS可以显示。那么这个方式就不太可行使用pdfjs实现预览pdf文件,支持自定
排查 WebView 中 touch、click 事件失效:移动端调试过程详解
2501_91591841
http udp https websocket 网络安全 网络协议 tcp/ip
在Web开发中,事件绑定通常是最基础的交互逻辑。然而,在移动端WebView环境下,哪怕一个普通的点击事件,也可能因为平台差异、容器限制、手势冲突等原因出现完全不同的表现。特别是在App中加载的Web页面中,我们经常会遇到以下情况:某些Android机型上点击按钮无反应;滑动过程中页面“卡住”或无法滑动;iOS设备上触发手势存在延迟或遮挡;同一DOM元素,在浏览器中能响应事件,在WebView中却
调试 WebView 接口时间戳签名问题:一次精细化排查和修复过程
为了保证数据安全,很多接口会对请求进行签名校验,常见方式是前端生成时间戳+key,再做哈希作为签名参数提交到后端。如果设备系统时间不准、页面生成时间戳延迟,或者跨时区出现时间混乱,都会导致签名验证失败。在移动端WebView里,这类问题更加隐蔽:用户看到页面正常,但接口频繁返回签名错误或token失效,引发“偶现性”白屏、按钮无效等问题。我们可以通过使用WebDebugX来进行远程网页调试,可以在
webview加载url提示net::ERROR_UNKNOWN_URL_SCHEME
海阔天空6688
Android webview android scheme
解决方法:重写WebViewClient类的shouldOverrideUrlLoading()方法,在方法中对scheme协议进行处理newWebViewClient(){@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){//对协议进行处理if(url.startsWith("http")||url.sta
Android之提示Failed to load WebView provider: No WebView installed
码莎拉蒂 .
Andriod 积累 Android Failed to load WebView No WebView installed
1问题FatalException:android.util.AndroidRuntimeException:android.webkit.WebViewFactory$MissingWebViewPackageException:FailedtoloadWebViewprovider:NoWebViewinstalledatandroid.webkit.WebViewFactory.getPro
uniapp APP中内嵌webview的H5与APP相互通讯动态传参
夕溯流光
uni-app webview javascript 前端
文章目录概要思路代码概要在使用uni-app开发app的过程中使用到公司其他项目h5的页面,app项目中使用了web-view来进行内嵌,h5项目中核心功能是调用扫一扫进行扫码,由于h5本身基于微信开发,可以直接调用this.$wx.scanQRCode()实现扫一扫功能,但通过web-view嵌入app中,无法使用微信环境,导致直接调用摄像头失败,点击没有反应。思路后面看到web-view可以跟
uniapp(h5 app) 中 webview和h5通信
pan # jun
uni-app
1uniapph5和h5页面通信h5window.parent.postMessage(message,'*');uniapph5onload中window.addEventListener('message',function(e){//监听message事件//console.log(e.origin)console.log('收到的cocos游戏ID',e.data)//收到cocos退出游
uniapp,app/H5中,webview与嵌套的html相互通信
赫卡夹
移动端 前端 uni-app html 前端
这样一段代码,webview嵌了一个本地html希望它们相互通信传递消息如果是在APP中,很简单webview→html//constwebview=this.$scope.$getAppWebview().children()[0]//webview.evalJS(`updateCanvasSize(${x},${y}`)html→webviewhtml中引入(在官网下载)html中uni.po
DeepSeek 桌面端 快捷键唤起小窗口 极致轻量化
小纛
deepseek 桌面
DeepSeek桌面端(DeepSeekDesktop)DeepSeek没有官方桌面端。桌面端的好处是可以随时用快捷键唤起,在跨应用时很有用。目前Github上开源的DeepSeek桌面端是Electron做的,一个安装包要80多MB,太臃肿。本项目用Tauri(Rust+vite),不内置浏览器,而是调用系统原生浏览器内核(如webview2),非常轻量,而且支持快捷键唤起小窗口、开机启动。项目
WebView 嵌套页面调试指南:解决上下文丢失与状态失效问题
2501_91600889
http udp https websocket 网络安全 网络协议 tcp/ip
在移动Web开发中,嵌套iframe、多Tab页、多页面状态共享已是常见模式。尤其是在App中用WebView加载这些页面时,调试常常遇到一个隐形难题:状态丢失、数据不一致或逻辑错乱。比如点击跳转后上一页状态失效,iframe内页面切换时context混乱,或者多页签之间数据传递失败。此类问题在浏览器中难以复现,在WebView环境下尤为常见。这篇文章记录一次我们团队在调试“多页面嵌套+用户状态同
疏通经脉: Bridge 联通逻辑层和渲染层
风铃喵游
从零搭建小程序框架架构 前端 小程序 架构
本节概述经过前面两节的开发,我们已经完成了小程序逻辑线程和UI线程的启动引擎准备,这节开始,我们将完善nativebridge层的搭建,构建起逻辑线程和UI线程之间的桥梁。开始之前我们先来回顾一下逻辑引擎小节相关的流程图:一次小程序的启动过程,我们在创建好小程序的逻辑引擎worker和绘制引擎webview之后,从启动到渲染依次会经过:通知webview加载小程序资源,如果是首次启动,还需要通知逻
利用H5为小程序领域增添新活力
小程序开发2020
小程序开发宝典 小程序 ai
利用H5为小程序领域增添新活力关键词:H5技术、小程序开发、跨平台架构、WebView通信、动态内容渲染、性能优化、全栈开发摘要:本文深入探讨如何通过HTML5(H5)技术提升小程序开发效率与用户体验。从技术架构对比到核心通信机制,结合具体代码案例解析H5与小程序的深度融合方案。通过WebView嵌入、JSSDK扩展、动态模板渲染等技术手段,实现跨平台代码复用、复杂交互组件开发和实时内容更新。同时
vscode插件和源码通过命令进行通信
zhouhangzooo
【Visual Studio Code】 vscode通信 vscode命令
本文讲述一下vscode插件和源码通过命令进行通信原文链接:https://zhouhangzooo.github.io/2019/04/10/vscode插件与源码通信/在之前"vscode插件与webview相互通信"文章中,讲述webview和插件进行通信,里面有个注册命令,之前文章没有详细代码,其实代码vscoode官网都有,##接下来要说命令,那么先贴一下注册命令的代码123456789
【HarmonyOS next】ArkUI-X休闲益智记忆翻牌【进阶】
harmonyos-next
本文通过记忆翻牌游戏实现,揭秘网络图片在HarmonyOS与iOS设备上的渲染差异,并提供专业级优化方案。基于ArkUI-X的Web组件技术,我们实现了一套代码双端运行的混合架构。一、跨平台实现架构//ArkTS核心实现importweb_webviewfrom'@ohos.web.webview';@Entry@ComponentstructIndex{controller:web_webvie
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