在React Native应用程序中调试WebView

fsi0uk1n  于 2022-11-17  发布在  React
关注(0)|答案(7)|浏览(258)

我有一个React Native应用程序,它使用WebView从资产中呈现HTML页面。该页面有一些javascript进行一些处理。问题是我无法从Web视图中看到console.log语句。我尝试过Chrome Remote Remote Debugging WebViews
下面是代码的样子。注意,对于Android,我试图提供一些本地属性来启用调试。

import React from 'react';
import Expo from 'expo';
import { WebView } from 'react-native';

export default class App extends React.Component {

  render() {
    const htmlURL = Expo.Asset.fromModule(require('./assets/index.html')).uri;
    return (
      <WebView nativeConfig={{props: {webContentsDebuggingEnabled: true}}}  
      source={{uri: htmlURL}} />
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});

任何关于如何工作的想法都将受到高度赞赏。

ffx8fchx

ffx8fchx1#

您可以从WebView内部使用window.postMessage和WebView组件的onMessage属性:
在html中:

...
window.postMessage(stringMessage, '*');
...

在react原生组件中:

import React from 'react';
import Expo from 'expo';
import { WebView } from 'react-native';

export default class App extends React.Component {
  handleMessage = (event) => {
     console.log(event.nativeEvent.data);
  }
  render() {
    const htmlURL = Expo.Asset.fromModule(require('./assets/index.html')).uri;
    return (
      <WebView nativeConfig={{props: {webContentsDebuggingEnabled: true}}}  
      source={{uri: htmlURL}}
      onMessage={this.handleMessage}
      />
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});
hgb9j2n6

hgb9j2n62#

对于试图在Mac for iOS模拟器或连接设备上执行此操作的人:=〉使用safari技术预览-〉开发-〉模拟器-〉原生应用程序
jsContext和Webview都将可见,以打开用于调试+控制台这提供了所有典型调试器功能
额外好处:您甚至可以使用windows for jscontext来解决react原生类等问题。例如,在您的应用程序类中添加“window.app = this;”,然后您可以通过控制台访问您的应用程序类对象。

dffbzjpn

dffbzjpn3#

只是想补充一点,官方的react-native-webview库有一个关于Debugging的部分,你可能会发现很有帮助!

9bfwbjaz

9bfwbjaz4#

在React Native中检查WebView最简单的方法是使用Remote JS Debugger。这对于在iOS或Android中工作都有额外的好处,因为你只是在调试应用程序上运行的JavaScript。
为了查看WebView,您需要更进一步,使用Chrome's Remote Devices

如果单击与要调试得index.html匹配得文档旁边得检查,则可以在控制台中查看该WebView得所有日志.

我在<header>index.html中添加了一个<script>,它只执行以下操作:
console.log('This is showing in the console!')
您可以在上图中看到,它在检查该WebView的DevTools中注销。
有关react-native-webview调试指南的更多信息,请访问Debugging Guide Docs

tquggr8v

tquggr8v5#

不确定它是否与您的情况相关,但如果您也在为iOS开发,有一个非常简单的方法可以在Mac + iOS模拟器(或真实设备)上完成。最后,React Native WebView创建一个本地web视图(iOS上的UIWebView,Android上的WebView),因此任何适用于web应用的调试方法都适用于此处。
1.在iOS模拟器(或设备)上:打开设置应用程序-〉Safari -〉高级-〉打开Web检查器。
1.在Mac上打开Safari并在以下位置启用开发者模式:首选项-〉高级-〉在菜单栏中显示开发者菜单(底部的复选框)。
1.在Mac上的Safari中,你现在会看到“开发”菜单。打开它,找到模拟器或你连接的设备。当你悬停在这个菜单项上时,你会看到当前加载的页面。这对设备上加载的任何页面都有效,无论它是在你的应用程序中以WebView显示还是在系统浏览器上显示。
1.选择页面后,您可以使用Safari Web检查器执行几乎任何操作:查看所有加载的资源、网络请求、突出显示元素、控制台日志、调试JS代码等等。

0ejtzxu1

0ejtzxu16#

我建议统一javascript's控制台消息(console.log)和logcat合并为一个logcat,可通过[Monitor]查看。(https://developer.android.com/studio/profile/am-basics.html)。将控制台消息和WebView消息放在一个位置会很有帮助,尤其是当您遇到争用条件/计时问题时,这样你就可以看到事件的顺序。监视器还允许你应用过滤器,选择你看到的消息。iOS用户也会觉得这很有帮助。
以下是一个示例:x1c 0d1x有关如何在React Native中自定义WebView(用于构建用户界面的JavaScript library。“它由FacebookInstagram以及个人开发人员和企业社区”wiki“维护)的一些背景信息,请参见CustomWebViewManager and CustomWebView in React Native
信息:WebChromeClient让你处理Javascript'sconsole.log("message")
{via onConsoleMessage(ConsoleMessage cm)}、alert()等功能。
捕获JavaScript的控制台消息:

//find or get your React Native webView or create a CustomWebView
WebView webView = (WebView) this.findViewById(R.id.webView1);

//by setting a WebClient to catch javascript's console messages:
// and relay them to logcat (view in monitor) or do what you want with them
WebChromeClient webChromeClient = new WebChromeClient() {
        public boolean onConsoleMessage(ConsoleMessage cm) {
            Log.d(TAG, cm.message() + " -- From line "
                    + cm.lineNumber() + " of "
                    + cm.sourceId() );
            return true;
        }
    });

webView.setWebChromeClient(webChromeClient);

cross platform支持的问题是Virtual Machine和相关的Sandbox。我认为react-native * 试图 * 成为非常纯粹的JavaScript(但失败了,JavaScript作为一种语言是纯粹的,* 实现 * 从来不是,总是关于妥协)。我个人对跨平台支持的偏好是Cordova

ct3nt3jp

ct3nt3jp7#

在最新的Chrome版本中,您只需在React Native应用中启用调试模式,然后导航到chrome://inspect/#devices
在“设备”选项卡中,找到与应用程序对应得“WebView in .....”项,然后单击“检查”以查看调试器.

相关问题