我们做什么?
我们正在为iOS和安卓平台构建一个React本地应用程序。该应用程序有一个外部网站与相机操作内部,打开通过react-native-webview模块。从我们的实验中我们观察到,为了使它正常工作,我们必须向终端用户询问相机的权限两次。
这两个请求都显示给用户弹出窗口,显示文本以允许相机访问:第一个用于“application_name”,第二个用于“url_inside_webview”- 图像方案。
对我们来说是一个关键的问题,因为:
复制问题的技术细节
操作系统: Apple iOS 15.1及更高版本
响应本机依赖关系:
"dependencies": {
"react": "17.0.2",
"react-native": "0.66.0",
"react-native-permissions": "^3.0.6",
"react-native-webview": "^11.14.0"
}在react中的设置权限-本机:
import { request, PERMISSIONS, RESULTS } from 'react-native-permissions';
// ... //
request(PERMISSIONS.IOS.CAMERA)
.then((statuses) => {
if (statuses[PERMISSIONS.IOS.CAMERA] === RESULTS.GRANTED) {
setWebviewRenderAvailable(true);
});
});ios/Podfile中的配置:
target 'MyAwesomeProject' do
# Check permissions for camera
permissions_path = '../node_modules/react-native-permissions/ios'
pod 'RNPermissions', :path => '../node_modules/react-native-permissions'
pod 'Permission-Camera', :path => "#{permissions_path}/Camera"
pod 'Permission-PhotoLibrary', :path => "#{permissions_path}/PhotoLibrary"
end更新Info.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- ... -->
<key>NSCameraUsageDescription</key>
<string>Camera Access</string>
<!-- ... -->
</dict>
</plist>启动webview视图:
import { WebView } from 'react-native-webview';
// ... //
<WebView
scalesPageToFit={true}
startInLoadingState
useWebKit
originWhitelist={['*']}
allowsInlineMediaPlayback
mediaPlaybackRequiresUserAction={false}
source={{ uri: '<access link>' }}
style={{marginTop: 1, width: widthWebview, height: heightWebview }}
ref={webView}
javaScriptEnabled={true}
cacheEnabled={true}
onMessage={onMessage}
onLoadEnd={onLoaded}
/>我们的观察
对于本机iOS应用程序,WKWebView的持久权限出现在iOS 15中:
理想情况下,我们希望::
我们想知道是否有任何选择来达到预期的行为?,甚至从根本上说,一个应用程序只请求一次许可是可能的吗?
发布于 2022-06-03 18:17:16
步骤1:升级lib版本以响应-本机-webview@11.15.0
第2步:添加下面的支柱
mediaCapturePermissionGrantType="grantIfSameHostElsePrompt"这使iOS能够记住权限决策,并通过从本机层继承授权来消除初始的双提示符。
参考资料:Github发布
https://stackoverflow.com/questions/72093547
复制相似问题