@nota/nativescript-webview-ext
由 nota 提供 | v8.0.2
为 NativeScript 扩展 WebView 功能,增加 'x-local' 协议以支持本地文件。WebView 与原生层之间的事件、JavaScript 执行、注入 CSS 和 JS 文件。
npm i --save @nota/nativescript-webview-ext

@nota/nativescript-webview-ext

为 NativeScript 扩展 WebView 功能,增加 "x-local" 自定义协议以加载本地文件,处理 WebView 和 NativeScript 之间的事件,JavaScript 执行,注入 CSS 和 JS 文件。支持 Android 19+ 和 iOS9+。

功能

  • 为 WebView 添加了对 x-local:// 的自定义协议处理器,以在 WebView 内部加载资源。
    • 注意:此功能不支持 iOS <11
  • 增加对捕获 URL 的支持。
    • 允许应用在外部浏览器中打开外部链接并处理 tel 链接。
  • 添加了以下功能:
    • executeJavaScript(code: string) 用于执行 JavaScript 代码并获取结果。
    • executePromise(code: string) 用于调用承诺并获取结果。
    • getTitle() 返回 document.title。
  • NativeScript 和 WebView 之间的双向事件监听器
    • NativeScriptWebView
    • WebViewNativeScript
  • 添加了注入 cssjavascript 文件的功能。
    • 到当前页面。
    • 页面加载时自动注入。
  • 填充项
    • 承诺
    • Fetch API(在 Android 上覆盖原生 API 以支持 x-local:// 和 file://)
  • 允许使用 WkWebView 进行 alertconfirmprompt
  • 支持
    • Android 19+
    • iOS 11+:完全支持
    • iOS <11:部分支持

安装

描述您的插件安装步骤。理想情况下,它可能类似于

tns plugin add @nota/nativescript-webview-ext

将 minSdkVersion 更新为 19 或更高

需要 Android SDK 19,更新 App_Resources/Android/app.gradle

android {
defaultConfig {
minSdkVersion 19 // change this line
generatedDensities = []
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
}

核心支持

按如下模板加载

<Page class="page" xmlns="http://schemas.nativescript.org/tns.xsd" xmlns:nota="@nota/nativescript-webview-ext">
<ActionBar class="action-bar">
<Label class="action-bar-title" text="Home"></Label>
</ActionBar>

<nota:WebViewExt src="https://nota.dk"></<nota:WebViewExt>
</Page>

Angular 支持

@nota/nativescript-webview-ext/angular 导入 WebViewExtModule 并将其添加到您的 NgModule 中。

这注册了 WebViewExt 元素。将 <WebView> 标签替换为 <WebViewExt>

Vue 支持

在您的应用程序入口文件(可能是 app.js 或 main.js)中导入 @nota/nativescript-webview-ext/vue

这注册了 WebViewExt 元素。将 <WebView> 标签替换为 <WebViewExt>

使用

限制

x-local:// 的自定义协议处理器仅支持 AndroidiOS 11+

由于 ITMS-90809,移除了对 iOS <11 的自定义协议支持。

API

NativeScript 视图

属性 描述
readonly supportXLocalScheme true / false 是否支持 x-local://?在 iOS >= 11Android 上为 true,在 iOS < 11 上为 false。
src 加载 src
autoInjectJSBridge true / false 是否在 loadFinishedEvent 上注入 window.nsWebViewBridge?默认为 true
builtInZoomControls true / false Android:是否使用内置的缩放机制
cacheMode default / no_cache / cache_first / cache_only Android:设置缓存模式。
databaseStorage true / false Android:启用/禁用数据库存储 API。注意:它会影响进程中的所有 WebView。
debugMode true / false Android:为 Android 上的 WebView 启用 Chrome 调试器。注意:适用于应用程序中的所有 WebView。
displayZoomControls true / false Android:使用内置的缩放机制时,显示屏幕上的缩放控件
domStorage true / false Android:启用/禁用 DOM 存储 API。例如 localStorage
scrollBounce true / false iOS: 是否启用scrollView弹动?默认为true。
supportZoom true / false Android: webview是否支持缩放
viewPortSize false / view-port字符串 / ViewPortProperties 在加载完成后设置viewport元数据。 注意: WkWebView默认将initial-scale设置为1.0。
limitsNavigationsToAppBoundDomains false iOS: 允许启用Service Workers 注意: 如果设置为true,WKAppBoundDomains也应该在info.plist中设置。
函数 描述
loadUrl(src: string): Promise 打开一个URL,并在加载完成后解析一个promise。
registerLocalResource(resourceName: string, path: string): void; 将“x-local://{resourceName}”映射为“{path}”。
unregisterLocalResource(resourceName: string): void; 从“x-local://{resourceName}”映射为“{path}”中移除映射。
getRegisteredLocalResource(resourceName: string): void; 获取从“x-local://{resourceName}”映射为“{path}”的映射。
loadJavaScriptFile(scriptName: string, filepath: string) 将javascript文件注入到webview中。应该在loadFinishedEvent之后调用
loadStyleSheetFile(stylesheetName: string, filepath: string, insertBefore: boolean) 将CSS文件加载到document.head中。如果before为true,它将被添加到document.head的顶部,否则作为最后一个元素
loadJavaScriptFiles(files: {resourceName: string, filepath: string}[]) 将多个javascript文件注入到webview中。应该在loadFinishedEvent之后调用
loadStyleSheetFiles(files: {resourceName: string, filepath: string, insertBefore: boolean}[]) 将多个CSS文件加载到document.head中。如果before为true,它将被添加到document.head的顶部,否则作为最后一个元素
autoLoadJavaScriptFile(resourceName: string, filepath: string) loadFinishedEvent时注册一个要注入的JavaScript文件。如果页面已经加载,脚本将被注入到当前页面。
autoLoadStyleSheetFile(resourceName: string, filepath: string, insertBefore?: boolean) loadFinishedEvent时注册一个要注入的CSS文件。如果页面已经加载,CSS文件将被注入到当前页面。
autoExecuteJavaScript(scriptCode: string, name: string) loadFinishedEvent上执行一个脚本。脚本可以是promise
executeJavaScript(scriptCode: string) 在网页中执行JavaScript。 注意: scriptCode应该与ES5兼容,否则可能在'iOS < 11'上不起作用
executePromise(scriptCode: string, timeout: number = 500) 在webview中运行一个promise。 注意: 执行scriptCode必须返回一个promise。
emitToWebView(eventName: string, data: any) 向webview发出一个事件。注意:data必须可以通过JSON.stringify进行字符串化,否则会抛出异常。
getTitle() 返回一个包含当前文档标题的promise。

事件

事件 描述
loadFinished 当发生loadFinished事件时被触发。args是LoadFinishedEventData
loadProgress Android仅:在页面加载期间触发,以指示进度。args是LoadProgressEventData
loadStarted 当发生loadStarted事件时被触发。args是LoadStartedEventData
shouldOverrideUrlLoading 在webview请求URL之前触发。可以通过在ShouldOverrideUrlLoadEventData中将args.cancel设置为true来取消
titleChanged 文档标题已更改
webAlert 当在webview中触发window.alert时被触发,需要使用自定义对话框来处理web警报。args是WebAlertEventData。必须调用args.callback()来指示警报已关闭。
webConfirm 当在webview中触发window.confirm时被触发,需要使用自定义对话框来处理web确认框。args是webConfirmEvent。必须调用args.callback(boolean)来指示确认框已关闭。
webConsole Android仅:当向web控制台添加一行时被触发。args是WebConsoleEventData
webPrompt 当在webview内部触发 window.prompt 时引发,需要使用自定义对话框来使用网页提示框。在 webConfirmEvent 中的参数。`args.callback(string`
来自webview的事件 当在webview内部调用 nsWebViewBridge.emit(...) 时引发。参数在 WebViewEventData

WebView

在WebView内部,我们有 nsWebViewBridge 用于在 NativeScript-层和 WebView 之间发送事件。 注意: 桥接器仅在内置的 DOMContentLoadedonload 中可用。

函数 描述
window.nsWebViewBridge.on(eventName: string, cb: (data: any) => void) 注册来自本地层的事件处理程序。
window.nsWebViewBridge.off(eventName: string, cb?: (data: any) => void) 注销来自本地层的事件处理程序。
window.nsWebViewBridge.emit(eventName: string, data: any) 向NativeScript层发出事件。将在WebViewExt上以任何其他事件的方式发出,数据将是WebViewEventData对象的组成部分

等待nsWebViewBridge可用

    window.addEventListener("ns-bridge-ready", function(e) {
var nsWebViewBridge = e.detail || window.nsWebViewBridge;

// do stuff here
});

即将推出的可能功能

  • Cookie助手?
  • 与本地层共享缓存?

Android

  • 设置
    • AppCache?
    • 用户代理?

iOS

  • 设置?

演示和单元测试

运行演示

要运行演示项目,插件必须在本地构建,并且必须运行http服务器。

运行演示的最简单方法是遵循以下步骤

  • 从 https://github.com/Notalib/nativescript-webview-ext.git 克隆git存储库
  • 进入 src 文件夹
  • 使用npm脚本
    • npm run demo.ios
    • npm run demo.android

运行单元测试

  • 从 https://github.com/Notalib/nativescript-webview-ext.git 克隆git存储库
  • 进入 src 文件夹
  • 使用npm脚本
    • npm run test.ios
    • npm run test.android

许可协议

Apache许可协议版本2.0,2004年1月

关于Nota

Nota是丹麦为印刷残疾人提供图书馆和专业知识中心。要成为Nota的成员,您必须证明您无法阅读普通印刷文本。Nota的成员是视力受损者、阅读障碍者或其他受损者。我们的目的是确保无法阅读普通印刷文本的人能够平等地获得知识、社区参与和体验。