背景:

最近公司准备上一个只有原生登录界面 + 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交互详情的更多相关文章

  1. iOS与H5交互及UIWebView缓存

    iOS原生App与H5页面交互笔记 最近在做一个项目用到了原生App与H5交互,之前有做过简单的H5页面直接调用原生方法的例子,就是利用UIWebView中的代理方法 //webview每次加载之前都 ...

  2. Native与H5交互的一些解决方法

    一. 原生代码中直接加载页面 1.    具体案例 加载本地/网络HTML5作为功能介绍页 2.    代码示例 //本地 -(void)loadLocalPage:(UIWebView*)webVi ...

  3. iOS与H5交互

    H5与App原生交互,一般会是前端页面中的JavaScript与App使用的原生开发语言的交互.技术方案应能达到以下要求: 在js与原生进行交互的时候能保证正常的正向调用逻辑返回,反向可以处理异步回调 ...

  4. iOS原生APP和H5交互-delegate和第三方

    一.原生代码中直接加载页面(拦截) 1.    具体案例 加载本地/网络HTML5作为功能介绍页 2.    代码示例 //本地 -(void)loadLocalPage:(UIWebView*)we ...

  5. iOS与H5交互遇到的坑

    之前的博客写过使用<JavaScriptCore/JavaScriptCore.h>库来实现与H5的交互,但是在项目中还是遇到了一些不得不踩的坑.在这里将我遇到的问题以及参考网上几位大神的 ...

  6. WebViewJavascriptBridge详细使用 iOS与H5交互的方案

    WebViewJavascriptBridge详细使用 源网址: https://www.cnblogs.com/jiang-xiao-yan/p/5345755.html    前言 WebView ...

  7. webview和H5交互

    由于H5的灵活多变,动态可配的特点,也为了避免冗长 的审核周期,H5页面在app上的重要性正日益突显. iOS应用于H5交互的控件主要是UIWebView及WKWebView WKWebView是14 ...

  8. iOS JavaScriptCore与H5交互时出现异常提示

    在利用JavaScriptCore与H5交互时出现异常提示: This application is modifying the autolayout engine from a background ...

  9. Android与H5交互(java与js的交互)

    一.理论概述 1.js调用java方法 直接调用WebView的该方法就可以添加接口了,不过先要启动交互 // 启用javascript mWebView.getSettings().setJavaS ...

随机推荐

  1. 域名扫描工具Fierce

    域名扫描工具Fierce   该工具是一个域名扫描综合性工具.它可以快速获取指定域名的DNS服务器,并检查是否存在区域传输(Zone Transfer)漏洞.如果不存在该漏洞,会自动执行暴力破解,以获 ...

  2. .NET string字符串的截取、移除、替换、插入

    在实际开发中经常要用到string的各种截取等操作,在这里总结自己认为经常出现的.NET 字符串的截取.移除.替换.插入操作,方面以后查阅. 前台代码: <%@ Page Language=&q ...

  3. Object obj=new Object()的内存引用

    Object obj=new Object(); 一句很简单的代码,但是这里却设计Java栈,Java堆,java方法去三个最重要的内存区域之间的关联. 假设这句代码出现在方法体中. 1.Object ...

  4. 搭建ssm的领悟

    今天搭建了ssm,但是一直报错误 "Cannot load JDBC driver class 'com.mysql.jdbc.Driver" 我以为是版本的问题就换,以为是路径加 ...

  5. 深入理解定时器系列——被誉为神器的requestAnimationFrame

    与setTimeout和setInterval不同,requestAnimationFrame不需要设置时间间隔.这有什么好处呢?为什么requestAnimationFrame被称为神器呢?本文将详 ...

  6. android 5.0以上通知栏、状态栏图标变成白色

    在5.0以上的系统上发现,平常的自定义notification出来的icon,居然在状态栏上变成了纯白色的icon. 看源代码会发现: protected void applyColorsAndBac ...

  7. js学习笔记

    javacript笔记根据EC5.0一共有六种数据类型:number,string,bool undefine,nullobject(广义的) --->object(狭义的),array,fun ...

  8. XML的简介及其与HTML的区别及联系

    XML: Extensible Markup Language(可扩展标记语言) HTML:HyperText Markup Language(超文本标记语言) 两者都是由万维网联盟(W3C)推出的S ...

  9. RequireJS与SeaJS模块化加载示例

    web应用越变的庞大,模块化越显得重要,尤其Nodejs的流行,Javascript不限用于浏览器,还用于后台或其他场景时,没有Class,没有 Package的Javascript语言变得难以管理, ...

  10. 命令行操作svn和git和git

    前几天在写代码的时候电脑突然坏掉,老大交代的任务没完成,非常痛恨自己用svn或者git保存代码,相信很多程序员遇到过,硬盘坏掉,存在硬盘中的代码丢失,无法找回的问题,svn和git可谓程序员界的福音, ...