Я использовал Webview в android и ios, создавая собственные компоненты пользовательского интерфейса вact-native.В веб-обзоре после выполнения какого-либо действия происходит нажатие кнопки, при котором веб-сайт генерирует событие window.close (), которое мне нужно отловить и выполнить некоторые действия.Моя проблема заключается в том, как я могу захватить событие window.close (), которое будет выброшено с веб-сайта, и передать его в конец RN для дальнейшей обработки.
Ниже приведен собственный код компонента пользовательского интерфейса, реализованный в конце RN:
index.android.js file =>
import PropTypes from 'prop-types';
import { requireNativeComponent, ViewPropTypes } from 'react-native';
// El nom a "name" no importa
const mcs = {
name: 'PermissionWebview',
propTypes: {
sourceUri: PropTypes.string,
...ViewPropTypes,
},
};
module.exports = requireNativeComponent('PermissionWebviewViewManager', mcs);
WebViewMMS.android.js file =>
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import PermissionWebview from '../mms_android';
class WebViewMMS extends Component {
static navigationOptions = () => ({
title: 'Testing',
});
constructor(props) {
super(props);
const { navigation } = this.props;
this.state = {
mmsUrl: navigation.state.params.mmsUrl,
};
}
render() {
const { mmsUrl } = this.state;
return (
<PermissionWebview
mediaPlaybackRequiresUserAction={false}
domStorageEnabled
allowsInlineMediaPlayback
allowFileAccessFromFileURLs
allowUniversalAccessFromFileURLs
sourceUri={mmsUrl}
style={{ flex: 1 }}
/>
);
}
}
module.exports = WebViewMMS;
WebViewMMS.propTypes = {
navigation: PropTypes.shape({
navigate: PropTypes.func.isRequired,
}).isRequired,
};
Файл Webviewmanager.java =>
public class PermissionWebviewViewManager extends SimpleViewManager<PermissionWebviewView> {
public static final String REACT_CLASS = "PermissionWebviewViewManager";
private String source;
@Override
public String getName() {
return REACT_CLASS;
}
@Override
public PermissionWebviewView createViewInstance(ThemedReactContext context) {
return new PermissionWebviewView(context); //If your customview has more constructor parameters pass it from here.
}
@ReactProp(name = "sourceUri")
public void setSource(PermissionWebviewView view, String source) {
view.loadUrl(source);
}
}
Webviewpacakge.java =>
public class PermissionWebviewPackage implements ReactPackage {
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Arrays.<ViewManager>asList(
new PermissionWebviewViewManager()
);
}
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
customWebview.java file =>
public class PermissionWebviewView extends WebView {
private Context context;
public PermissionWebviewView(Context context) {
super(context);
this.context = context;
this.clearHistory();
this.clearCache(true);
this.loadUrl("about:blank");
this.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
this.setWebViewClient(new WebViewClient());
WebSettings webSettings = this.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setUseWideViewPort(true);
this.setWebChromeClient(new WebChromeClient() {
@Override
public void onPermissionRequest(final PermissionRequest request) {
request.grant(request.getResources());
}
});
}
}
Может кто-нибудь помочь мне разобраться, как мне решить вышеупомянутую проблему?