UIwebView 和 H5交互详情
背景:
最近公司准备上一个只有原生登录界面 + H5网页 ,并且支持ios7.0 以上系统的混合app;这可把我难住了,原生的UI界面我可以正写反写各种style把界面搭建起来。而要这个app的难点在于交互,与前端h5 的交互。
经同事推荐,使用webViewJavascripeBridge 这个交互三方神器;
准备工作,把webViewJavascripeBridge 导入到xcode工程中,或用cocoapod管理
废话不多说,上代码
一、 首先是ios端的代码:
- (void)viewDidLoad {
[super viewDidLoad];
UIWebView* webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:webView];
[WebViewJavascriptBridge enableLogging];
_bridge = [WebViewJavascriptBridge bridgeForWebView:webView];
(1)h5向客户端通讯,让客户端能响应到网页的点击事件
[_bridge registerHandler:@"logOut" handler:^(id data, WVJBResponseCallback responseCallback) {
//登出操作
[self logOutBtnClick];
}];
(2)客户端向h5通讯,把账号和密码传输过去,让网页调用登录接口
id data = @{@"phone":账号,@"password":MD5密码};
[_bridge callHandler:@"login" data:data responseCallback:^(id response) {
}];
(3)加载html网址
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:目标html]]];
}
明天继续贴h5端代码
最近几天公司事情比较多,现在更新补上!
二、 首先H5端的代码:
在对应的html body中贴上如下代码
<script>
window.onerror = function(err) {
log('window.onerror: ' + err)
}
//A.(以下用这个代表对应的代码)
function setupWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
window.WVJBCallbacks = [callback];
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}
//B
setupWebViewJavascriptBridge(function(bridge) {
//C
app.bridge = bridge;
//D
bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {
var responseData = { 'Javascript Says':'Right back atcha!' }
//E
var jsData = JSON.stringify(data)
var phoneStr = ''
var passwordStr = ''
var stringArr = jsData.split('"')
for(var i in stringArr){
if (i == 3){
phoneStr = stringArr[i]
localStorage.setItem('userphone',phoneStr)
}
if (i == 7){
passwordStr = stringArr[i]
localStorage.setItem('password',passwordStr)
}
}
})
</script>
分析:A为固定代码,直接copy
B为客户端往前端通讯时前端要做的内容函数
C在前端的 custom.js 中添加一个空的 bridge 来保存 (为了前端能向客户端通讯,配合在对应的按钮事件中 加上F代码,就可以实现前端向客户端的通讯)
D为bridge 的handle
E是把得到的数据进行解析并保存在localStorage 中 (其他地方就可以拿到这个数据,进行一系列的操作)
F:(代码中的数据({'foo': 'bar'})可以跟客户端来约定,传什么数据对应什么事件;函数名字也要约定一致)
bridge.callHandler('testObjcCallback', {'foo': 'bar'}, function(response) {
//此处写前端其他行为
})
个人主要精通于ios,对前端研究不深,以上前端和客户端代码都由我一个人编写(部分代码参考marcuswestin),so,如果大家有发现什么问题或者有什么建议,欢迎批评指教!
邮箱:developer_yh@163.com
GitHub:https://github.com/developeryh
UIwebView 和 H5交互详情的更多相关文章
- iOS与H5交互及UIWebView缓存
iOS原生App与H5页面交互笔记 最近在做一个项目用到了原生App与H5交互,之前有做过简单的H5页面直接调用原生方法的例子,就是利用UIWebView中的代理方法 //webview每次加载之前都 ...
- Native与H5交互的一些解决方法
一. 原生代码中直接加载页面 1. 具体案例 加载本地/网络HTML5作为功能介绍页 2. 代码示例 //本地 -(void)loadLocalPage:(UIWebView*)webVi ...
- iOS与H5交互
H5与App原生交互,一般会是前端页面中的JavaScript与App使用的原生开发语言的交互.技术方案应能达到以下要求: 在js与原生进行交互的时候能保证正常的正向调用逻辑返回,反向可以处理异步回调 ...
- iOS原生APP和H5交互-delegate和第三方
一.原生代码中直接加载页面(拦截) 1. 具体案例 加载本地/网络HTML5作为功能介绍页 2. 代码示例 //本地 -(void)loadLocalPage:(UIWebView*)we ...
- iOS与H5交互遇到的坑
之前的博客写过使用<JavaScriptCore/JavaScriptCore.h>库来实现与H5的交互,但是在项目中还是遇到了一些不得不踩的坑.在这里将我遇到的问题以及参考网上几位大神的 ...
- WebViewJavascriptBridge详细使用 iOS与H5交互的方案
WebViewJavascriptBridge详细使用 源网址: https://www.cnblogs.com/jiang-xiao-yan/p/5345755.html 前言 WebView ...
- webview和H5交互
由于H5的灵活多变,动态可配的特点,也为了避免冗长 的审核周期,H5页面在app上的重要性正日益突显. iOS应用于H5交互的控件主要是UIWebView及WKWebView WKWebView是14 ...
- iOS JavaScriptCore与H5交互时出现异常提示
在利用JavaScriptCore与H5交互时出现异常提示: This application is modifying the autolayout engine from a background ...
- Android与H5交互(java与js的交互)
一.理论概述 1.js调用java方法 直接调用WebView的该方法就可以添加接口了,不过先要启动交互 // 启用javascript mWebView.getSettings().setJavaS ...
随机推荐
- orcal 操作
清空表数据(不清除表结构): truncate table 表名
- oracle(sql)基础篇系列(四)——数字字典、索引、序列、三范式
数字字典表 --查看当前用户下面有哪些张表 select * from user_tables; select table_name from user_tables; --查看当前用户下面有 ...
- 2016-1-28 图解HTTP(03)
6.2.5 非HTTP/1.1首部字段 不限于RFC2616中定义的47种首部字段,还有Cookie.Set-Cookie和Content-Disposition等在其他RFC中首部字段 ...
- JFreeChart
花了四个小时给同学写的.还行吧,原来都没有用过到处找资料写的. package DrawLine; import org.jfree.chart.ChartFactory; import org.jf ...
- JavaScript解惑记之Array.prototype.sort()
前言 看JS红宝书的5.2.5章节关于sort()方法,如何用一个compare函数,让数组顺序,倒序,有点云里雾里的.在网上度娘了一下,发现更迷糊了.走投无路的情况下,只能发动神技能,去 stack ...
- NotificationCenter接收不到通知的原因
今天在项目中遇到一个奇葩的事情,我在一个类中明明写了: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #00af ...
- display:none与visible:hidden的区别
display:none和visible:hidden都能把网页上某个元素隐藏起来,但两者有区别: display:none ---不为被隐藏的对象保留其物理空间,即该对象在页面上彻底消失,通俗来说就 ...
- 【PostgreSQL】PostgreSQL的安装
到了新公司,新公司的数据库是使用PostgreSQL,第一次学习,第一次安装. 开始安装:
- Python模块之常用模块,反射以及正则表达式
常用模块 1. OS模块 用于提供系统级别的操作,系统目录,文件,路径,环境变量等 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("di ...
- Webform Application传值 ViewState
Application:所有的会话共享一个Application空间,任何一个人改变Application的内容,其他人都会发现被改变了.Application中的内容不会被自动释放 存放位置:服务端 ...