H5页面:这是真正的网页应用,运行在通用浏览器中,各种浏览器虽然在细微上有所差别,但总的来说是一致的,微信浏览器同时也是一种通用浏览器,能够支持真正的网页应用。
因此我们才有可能在微信小程序和H5页面之间进行跳转,但这种跳转是受到微信浏览器的严格控制的,因此我们有必要了解这些控制包括哪些。
H5页面所在的域名:假设你需要调转的H5页面URL为https://www.mysite.com/h5page,那么这里所说的域名就是www.mysite.com,另外你没有看错,这个URL必须是https,如果你还没有为你的网站加上SSL,那么就先去申请一个证书吧(注意必须是公开申请的证书,不能是自签名的,微信不认哦!)
好了,这些都准备好了,让我们开始开发一个小例子。
由于web-view组件是一个全屏组件,不能和其它小程序组件合用,因此需要独立占据一个页面,所以我们到例子就是在小程序的A页面加一个链接,跳转到B页面,然后在B页面使用web-view组件来加载H5页面。
2)采用主流分布式Vue框架,时间未知,风险未知;
首先自我介绍下,本人是一名JAVA开发工程师,平时喜欢研究相关主流技术和挑战自己。对此我还是比较倾向于第二种解决方案,但是第二种解决方案无疑是最复杂,最耗时,最未知,风险最大。公司内没有人愿意承接。于是我抱着学习和研究的态度以及对主流技术的向往,我找到我们领导我是这样说的:我还是比较建议公司采用第二种方案。1)这无疑是给我们进行敲门砖及学习的机会;2)这是公司提升前端技术能力与主流技术看齐的机会。最后公司同意了我建议,采用方案二,有我来承接此事,进行牵头负责。
中间心酸过程忽略,刚接下来第一天就后悔了,VUE用都没用过,还怎么玩。于是我花了大量的时间,看了大量文献,我这里使用到是Vue 2 + Vant 2 + axios + router。原来并不是什么网址拿来就可以设置跳转的,你的小程序中就不能直接跳转到百度上去,小程序能够跳转的域名必须在业务域名中进行注册,总算这次是在小程序开发号里面设置了,但注意在服务号的设置里也有业务域名这个设置,不要搞混了(话说微信起名也太没有想象力了,简直是一坨浆糊)。这时候控制权已经从小程序转移到了H5页面,但微信页面跳转内部的机制比较复杂,涉及到了OAuth认证之类的,所以这个错误已经是H5页面报的了,这就需要到H5页面关联的服务号中去进行设置,这次设置的项目叫做网页授权域名,在公众号设置的功能设置里由于小程序官方没有提供外部H5网页直接跳转到小程序的api,所以目前只支持小程序内嵌H5,并且只有内嵌的H5才能跳回小程序在微信开发中工具里返回“{"base_resp":{"ret":-1}}”时,需要点左上角“设置”--“项目设置”--勾选“不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书” 源码中验证使用的是session 来校验验证码是否正确。我这边前端是小程序无法存session改用框架自带的缓存。
这里讲一点转Taro的调试经验,有报错的文件先拎出来放在一边,因为es5,6语法差异,很多js文件转es6是不支持的,所以会报错,建议是先把所有报错的文件注释,或者改成es6写法再转。我这边是去掉了很多的文件才转成功了的。这里需要自己一步一步调试解决报错,转成功之后根目录多出来一个taroConvert的文件夹这说明已经转Taro成功了,接下来就是运行以及二次开发。
进入taroConvert文件夹(二次开发就在这个文件里面,小程序代码不用管了),执行命令 npm install 或者cnpm install 先拉取所有依赖。
可以看一下package.json文件的运行命令以及安装的依赖,我这里是要运行H5的,输入命令 npm run dev:h5打开H5开发模式,这个步骤有可能会有个nerv.js不存在的报错,可以安装一下,然后在你文件src下面的的app.js import一下。
执行命令 import Nerv from 'nervjs',这个报错就会解决。其它的页面代码报错可以自己调试。开启成功的话浏览器中会打开127.0.0.1:8082的窗口运行项目。
WKWebView是苹果在iOS 8之后推出的框架,关于它比webview的优势这里就不讲了。主要说一下与JS交互的问题,其实WKWebView已经内置了JS与OC的互调、传值等方法,使用起来也非常方便,下面就来细细的探讨一下以及自己遇到过的坑...
首先来看下WKWebView的初始化相关设置:
一、导入相关头文件、设置相关代理和属性
二、WKWebView初始化
注意:
楼主遇到的第一个坑:如果JS给OC传值为空,必须写成: postMessage(null),如果什么都不写,方法是调不通的。
1、在viewWillAppear中配置,addScriptMessageHandler name: "这里就是JS的方法,方法名必须统一"
楼主遇到的第二个坑:配置完后必须在 viewWillDisappear 中 remove,否则会造成循环引用,导致crash
2、实现 WKScriptMessageHandler 协议
以上就是JS调OC,JS向OC传值...
楼主这里举三个例子:
1: webview加载完成前,将用户信息传给js
2: webview加载完成,将相关信息传给js
3: 调用相册或相机时,将选择的图片请求后台接口,后台返回图片地址,将该地址回传给H5,H5将图片显示到页面上
第一个例子:webView加载完成前传值
因为 evaluateJavaScript 方法默认是在加载完成后调用,所以直接在页面开始加载中调用是传不过去的,这个时候怎么办呢? 我们可以让js端写两个方法, 第一个方法是js端开始向oc端发起信息需求的方法名,当oc端收到该方法名的时候,就去调用js端第二个获取传值的方法,把信息传递过去。
先让JS端写个方法调OC,OC实现方法后在这个方法内部给JS传值
在WKScriptMessageHandler协议中,实现该方法,然后在方法内部给JS传值
注意: 以上就是在Webview加载完成前传值,如果打印没报错,证明传参成功,如果web端没收到,让他把获取到值的方法写到页面中即可。
第二个例子: webView加载完成,传值给js
第三个例子: 传图片地址给js,js拿到后显示图片
1:拍照事件
1.1:将拍的照片请求上传图片接口,成功返回图片地址,并传值给H5
2: 从相册中选取照片
2.2:将相册中选取的照片请求上传图片接口,成功返回图片地址,并传值给H5
注意: getPhotoCallback 即为调用的方法名,后面传值格式必须为: ('') , 这里遇到了第三个坑, 如果方法名写为: 名称.名称 (例如:hello. getPhotoCallback),这种是调不通的,可以写成hello_getPhotoCallback的形式,一般的话最好还是定义一个完整的名称。 刚开始这个问题卡了比较久,一直调不通,在此记录一下.....
在 viewDidLoad 中注册进度条监听
开始加载网页
加载完成
加载失败
页面跳转失败
progressView懒加载
添加监听观察者
最后别忘记 removeObserver
Demo地址:https://github.com/zhwIdea/WKWebViewAndJS