最近业务上需要在APP WebView 内的H5 实现图片分享和保持的功能,分享功能那就需要调用APP内的封装方法才行。
至于保存功能,也是一样。暂且不用考虑这些,我们看看WebView 是否由提供保持的功能,搜寻issue,发现android长按
无法调出菜单,(自己实践确实是无法调出)iOS可行,(低于13版本)。
至于如何实现,在react-native-webView 中 也比较简单,下面就贴下简单的代码
1 2 3 4 5 6
| <WebView onMessage={({nativeEvent})=>{ nativeEvent.data }} >
|
1
| window.ReactNativeWebView.postMessage(JSON.stringify({url:'image url',title:'image name'}));
|
WebView 中的单页面应用
如果webView 中嵌入单页面应用的话会怎么样,如果没经过任何的处理,就会出现直接按设备物理键返回,会返回APP上级路由页面。
首先我们得先处理物理设备的返回键,就是进入webView 界面,拦截,监听webView 中路由历史,如果为栈顶,就退出。
onNavigationStateChange 属性有个bug 就是 h5 页面的 history api 无法监听其变化,至少在android 上是这样,官方也没有给出
修复,但有如下的讨论
https://github.com/react-native-community/react-native-webview/issues/24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| <WebView ref={ref => { this.webViewRef = ref; }} style={{ flex: 1 }} source={{ uri: 'http://192.168.10.199:3006/applyHome' }} onNavigationStateChange={navState => { this.canGoBack = navState.canGoBack; console.log(navState); }} injectedJavaScript={` (function() { function wrap(fn,type) { return function wrapper() { var res = fn.apply(this, arguments); window.ReactNativeWebView.postMessage("{ type:${type}, url:${window.location.href} }"); return res; } } history.pushState = wrap(history.pushState,'push'); history.back= wrap(history.pushState,'back') history.replaceState = wrap(history.replaceState,'replace'); window.addEventListener('popstate', function() { window.ReactNativeWebView.postMessage("{type:"pop",url:${window.location.href}}"); }); })(); true; `} onMessage={({ nativeEvent: state }) => { const params=JSON.parse(state.data) if (params.type === 'pop'||params.type === 'back') { this.setState({ pushCount: this.state.pushCount - 1, }); } else if(params.type==='push') { this.setState({ pushCount: this.state.pushCount + 1, }); } }} />
|
WebView 中 与App 中的 cookies 共享
做混合开发,经常会遇到webView 中网页要获取app中的登陆状态,但好在react-native-webView 中做了处理
我们并不需要担心,webView 中的页面 我们只要按正常的请求就可以