接入文档
H5 lite方案
界面与兼容性说明
App调用H5兼容性配置指引
App调用H5兼容性配置指引
1.需要使用https;
2.安卓,IOS 通过web-view使用需要进行一定的适配。
方案如下:
# 安卓解决方案:
Android5.0 之后的版本原生webview,app层面需要摄像机权限。
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA" />
# 网页中会实时弹出获取摄像头权限,需要在webview授权处理中允许
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onPermissionRequest(final PermissionRequest request) {
Log.d("MainActivity", "onPermissionRequest");
MainActivity.this.runOnUiThread(new Runnable() {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void run() {
request.grant(request.getResources());
}
});
}
});
使用其它浏览器内核需要根据相关浏览器要求进行配置。
# IOS解决方案
WebRTC在iOS上,仅支持WKWebView。
需在配置里加上摄像头和麦克风的使用权限。App 的 info.plist 中加入:
.NSMicrophoneUsageDescription
.NSCameraUsageDescription
OC语法:
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; // 初始化配置对象
configuration.allowsInlineMediaPlayback = YES; // 默认是NO,这个值决定了用内嵌HTML5播放视频还是用本地的全屏控制,其中NO为使用原生全屏控制器,YES为视频内嵌播放。
// 设置为自动播放, 不需要用户采取任何手势开启播放
if (@available(iOS 10.0, *)) {
configuration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone; //WKAudiovisualMediaTypeNone 音视频的播放不需要用户手势触发,即为自动播放,iOS 10.0+支持
} else {
configuration.requiresUserActionForMediaPlayback = NO;
}
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
Swift语法
let configuration = WKWebViewConfiguration() // 初始化配置对象
configuration.allowsInlineMediaPlayback = true // 默认是false,这个值决定了用内嵌HTML5播放视频还是用本地的全屏控制
// 设置为自动播放,不需要用户采取任何手势开启播放
if #available(iOS 10.0, *) {
configuration.mediaTypesRequiringUserActionForPlayback = [] // WKAudiovisualMediaTypeNone 音视频的播放不需要用户手势触发,即为自动播放,iOS 10.0+支持
} else {
configuration.requiresUserActionForMediaPlayback = false
}
let webView = WKWebView(frame: CGRect.zero, configuration: configuration)
# 鸿蒙解决方案:
1、在module.json5 中声明H5所需权限:
"requestPermissions": [
{
"name": "ohos.permission.INTERNET",
"reason": "$string:EntryAbility_permission_internet",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "always"
}
},
// camera permisson
{
"name": "ohos.permission.CAMERA",
"reason": "$string:EntryAbility_permission_camera",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "always"
}
},
// audio permission
{
"name": "ohos.permission.MICROPHONE",
"reason": "$string:EntryAbility_permission_microphone",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "always"
}
}
]
2、通过biztoken接口获取Web需要加载的url
3、在页面Component中使用Web组件
a. 加载url
b. 注册js接口回调
c. 通过onShowFileSelector使用相册/相机选择照片或拍摄视频
/**
** 通过Camera拍摄视频并获取视频uri回调
**
*/
invokeCamera(callback: (uri: string) => void) {
const context = getContext(this) as common.UIAbilityContext;
const pickerProfile: cameraPicker.PickerProfile = {
cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK
};
cameraPicker.pick(context,
[cameraPicker.PickerMediaType.VIDEO, cameraPicker.PickerMediaType.VIDEO], pickerProfile)
.then((pickerResult: cameraPicker.PickerResult) => {
if (callback && pickerResult.resultUri) {
callback(pickerResult.resultUri);
}
})
.catch((error: BusinessError) => {
console.error(`invokeCamera failed, code: ${error.code}, message: ${error.message}`);
});
}
/**
* 声明JS接口类用于接收JS回调
*/
export class JavaScriptInterface {
private onShowResult?: (result: string) => void;
public setOnShowResult(callback: (result: string) => void): void {
this.onShowResult = callback;
}
// 对应Android的showResult方法
showResult(result: string): void {
if (this.onShowResult) {
this.onShowResult(result);
}
// 此处可添加原生业务逻辑
}
revalidation() {
console.log('revalidation')
}
backIndex() {
console.log('revalidation')
}
}
private jsInterface: JavaScriptInterface = new JavaScriptInterface();
build() {
Column() {
Web({ src: this.url, controller: this.controller })
.width('100%')
.height('100%')
.javaScriptAccess(true)
.javaScriptProxy({
object: this.jsInterface,
name: "finauth",
methodList: ["showResult", "revalidation", "backIndex"], // 显式声明可调用方法
controller: this.controller
})
.onShowFileSelector((event) => {
this.invokeCamera((uri: string) => {
event?.result.handleFileList([uri]);
})
return true
})
.onPermissionRequest((event) => {
console.log('onPermissionRequest')
if (event) {
event.request.grant(event.request.getAccessibleResource())
}
})
}
.width('100%')
.height('90%')
.backgroundColor(Color.White)
}