React Native WebView for Android 不显示 PDF 和 Word 文件
React Native WebView for Android not displaying PDF and Word files
我正在开发一个关于发布个人简历的新项目。
我需要在应用程序中显示用户的简历。
我的标准 WebView 代码如下,在 iOS 上运行良好。
import * as React from 'react';
import { WebView } from 'react-native';
export default class App extends React.Component {
render() {
return (
<WebView
style={{flex: 1, backgroundColor: 'white'}}
source={{
uri: 'http://www.africau.edu/images/default/sample.pdf',
}}
bounces={true}
useWebKit={true}
scrollEnabled={true}
/>
);
}
}
此代码也需要在 Android 上运行。当我在 Android 上尝试时,页面什么也没显示。
Android Webview 无法显示 PDF 文件。有一个与此问题相关的问题。您可以从 this link
查看
您的问题有多种解决方案,您可以选择最适合自己的一种。
2) 使用 Google 文档作为查看器。尝试在您的 Webview http://docs.google.com/gview?embedded=true&url=http://www.africau.edu/images/default/sample.pdf
中加载此 URL
我选择了选项 2,但遇到了 Google 文档查看器 error 所以我做了这个 hacky 的事情来检查是否没有加载内容以刷新 webview。
const retries = 10
const PdfViewerScreen = ({ route, navigation }: Props) => {
const { pdfUrl } = route.params || {}
const webview = useRef(null)
const [tries, setTries] = useState(1)
const [reset, setReset] = useState(Date.now())
const isAndroid = Platform.OS === 'android'
const base = !isAndroid
? ''
: 'https://docs.google.com/gview?embedded=true&url='
// Use date as reset to be able to
// reload the webview
const uri = `${base}${pdfUrl}?t=${reset}`
// Js code to get baseURI when
// webview is loaded. docs.google.com has a bug
// where no content is returned.
const myInjectedJs = `
(function(){
window.ReactNativeWebView.postMessage(window.document.baseURI);
})();`
const onMessage = (event: WebViewMessageEvent) => {
// Issue does not occur in iOS
if(!isAndroid) return
const baseURI = event.nativeEvent.data
if (tries === retries) navigation.goBack()
if (baseURI !== uri) {
setReset(Date.now())
setTries(tries + 1)
}
}
return (
<>
<WebView
ref={webview}
javaScriptEnabled={true}
domStorageEnabled={true}
startInLoadingState={true}
style={tailwind(`flex-1`)}
injectedJavaScript={myInjectedJs}
source={{ uri }}
onMessage={onMessage}
renderLoading={() => (
<View style={tailwind('w-full h-full')}>
<Loading />
</View>
)}
/>
</>
)
}
我正在开发一个关于发布个人简历的新项目。
我需要在应用程序中显示用户的简历。
我的标准 WebView 代码如下,在 iOS 上运行良好。
import * as React from 'react';
import { WebView } from 'react-native';
export default class App extends React.Component {
render() {
return (
<WebView
style={{flex: 1, backgroundColor: 'white'}}
source={{
uri: 'http://www.africau.edu/images/default/sample.pdf',
}}
bounces={true}
useWebKit={true}
scrollEnabled={true}
/>
);
}
}
此代码也需要在 Android 上运行。当我在 Android 上尝试时,页面什么也没显示。
Android Webview 无法显示 PDF 文件。有一个与此问题相关的问题。您可以从 this link
查看您的问题有多种解决方案,您可以选择最适合自己的一种。
2) 使用 Google 文档作为查看器。尝试在您的 Webview http://docs.google.com/gview?embedded=true&url=http://www.africau.edu/images/default/sample.pdf
我选择了选项 2,但遇到了 Google 文档查看器 error 所以我做了这个 hacky 的事情来检查是否没有加载内容以刷新 webview。
const retries = 10
const PdfViewerScreen = ({ route, navigation }: Props) => {
const { pdfUrl } = route.params || {}
const webview = useRef(null)
const [tries, setTries] = useState(1)
const [reset, setReset] = useState(Date.now())
const isAndroid = Platform.OS === 'android'
const base = !isAndroid
? ''
: 'https://docs.google.com/gview?embedded=true&url='
// Use date as reset to be able to
// reload the webview
const uri = `${base}${pdfUrl}?t=${reset}`
// Js code to get baseURI when
// webview is loaded. docs.google.com has a bug
// where no content is returned.
const myInjectedJs = `
(function(){
window.ReactNativeWebView.postMessage(window.document.baseURI);
})();`
const onMessage = (event: WebViewMessageEvent) => {
// Issue does not occur in iOS
if(!isAndroid) return
const baseURI = event.nativeEvent.data
if (tries === retries) navigation.goBack()
if (baseURI !== uri) {
setReset(Date.now())
setTries(tries + 1)
}
}
return (
<>
<WebView
ref={webview}
javaScriptEnabled={true}
domStorageEnabled={true}
startInLoadingState={true}
style={tailwind(`flex-1`)}
injectedJavaScript={myInjectedJs}
source={{ uri }}
onMessage={onMessage}
renderLoading={() => (
<View style={tailwind('w-full h-full')}>
<Loading />
</View>
)}
/>
</>
)
}