接入文档
FaceID基础版
H5接入
H5界面与兼容性说明
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" />
 <uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT" />

# 网页中会实时弹出获取摄像头权限,需要在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。

OC语法:

// 初始化配置对象WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];// 默认是NO,这个值决定了用内嵌HTML5播放视频还是用本地的全屏控制
configuration.allowsInlineMediaPlayback = YES;// 自动播放, 不需要用户采取任何手势开启播放if (@available(iOS 10.0, *)) {
    // WKAudiovisualMediaTypeNone 音视频的播放不需要用户手势触发,即为自动播放
    configuration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone;
} else {
    configuration.requiresUserActionForMediaPlayback = NO;
}
       WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];

Swift语法

// 初始化配置对象
let configuration = WKWebViewConfiguration() // 默认是NO,这个值决定了用内嵌HTML5播放视频还是用本地的全屏控制
configuration.allowsInlineMediaPlayback = true
// 自动播放,不需要用户采取任何手势开启播放
if #available(iOS 10.0, *) {
// WKAudiovisualMediaTypeNone 音视频的播放不需要用户手势触发,即为自动播放
configuration.mediaTypesRequiringUserActionForPlayback = []
} 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"
    }
  },
  // album permisson
  {
    "name": "ohos.permission.READ_IMAGEVIDEO",
    "reason": "$string:EntryAbility_permission_album",
    "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;
  let want: Want = {
    action: "ohos.want.action.videoCapture",
    parameters: {
      "callBundleName": context.abilityInfo.bundleName,
    }
  };
  let result: (error: BusinessError, data: common.AbilityResult) => void =
    (error: BusinessError, data: common.AbilityResult) => {
      if (error && error.code !== 0) {

        return;
      }
      let resultUri: string = data.want?.parameters?.resourceUri as string;
      if (callback && resultUri) {
        callback(resultUri);
      }
    }
  context.startAbilityForResult(want, result);
}

/**
* 选择相册图片并返回文件uri
*/
invokevideoCamera(callback: (uri: string) => void) {
  const context = getContext(this) as common.UIAbilityContext;
  let want: Want = {
    action: "ohos.want.action.imageCapture",
    parameters: {
      "callBundleName": context.abilityInfo.bundleName,
    }
  };
  let result: (error: BusinessError, data: common.AbilityResult) => void =
    (error: BusinessError, data: common.AbilityResult) => {
      if (error && error.code !== 0) {
        return;
      }
      let resultUri: string = data.want?.parameters?.resourceUri as string;
      if (callback && resultUri) {
        callback(resultUri);
      }
    }
  context.startAbilityForResult(want, result);
}



/**
* 声明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) => {
        let acceptType = event?.fileSelector.getAcceptType()
        if (acceptType != null || acceptType != undefined) {
          if (acceptType[0] == '.mov') {
            this.invokeCamera((uri: string) => {
              event?.result.handleFileList([uri]);
            })
          } else {
            this.invokevideoCamera((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)
}
该文档未解决您的疑问?查看常见问题