- 版本:7.0.3
- GitHub: https://github.com/Notalib/nativescript-webview-ext
- NPM: https://npmjs.net.cn/package/nativescript-webview-ext-fork
- 下载
- 昨天: 0
- 上周: 0
- 上个月: 0
@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
之间实现双向事件监听器- 从
NativeScript
到WebView
- 从
WebView
到NativeScript
- 从
- 添加注入
css
和javascript
文件的功能。- 到当前页面。
- 在页面加载时自动注入。
- 垫片
- Promise
- Fetch API(在 Android 上覆盖原生 API 以支持 x-local:// 和 file://)
- 允许使用
WkWebView
进行alert
、confirm
和prompt
。 - 支持
- 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://
的自定义方案处理程序仅在 Android
和 iOS 11+
上受支持
由于 ITMS-90809,已移除对 iOS <11
的自定义方案支持。
API
NativeScript 视图
属性 | 值 | 描述 |
---|---|---|
readonly supportXLocalScheme | true / false | x-local:// 是否受支持?在 iOS >= 11 或 Android 上为 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调试器。注意:适用于App中的所有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。 |
函数 | 描述 |
---|---|
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) | 将JavaScript文件注册到在 loadFinishedEvent 时注入。如果页面已经加载,脚本将被注入到当前页面。 |
autoLoadStyleSheetFile(resourceName: string, filepath: string, insertBefore?: boolean) | 将CSS文件注册到在 loadFinishedEvent 时注入。如果页面已经加载,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:当向网页控制台添加一行时触发。args是WebConsoleEventData 。 |
webPrompt | 当在webview内部触发window.prompt 时触发,需要使用自定义对话框来使用web提示框。args在webConfirmEvent 中。`args.callback(string |
来自webview的事件 | 当在webview内部调用nsWebViewBridge.emit(...)时触发。args在WebViewEventData |
WebView
在WebView中,我们有nsWebViewBridge
来在NativeScript
层和WebView
之间发送事件。注意:此桥接器仅在WebView中的DOMContentLoaded
或onload
时可用。
函数 | 描述 |
---|---|
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?
- User agent?
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的成员是视力受损、阅读障碍或其他残疾的人。我们的目的是确保无法阅读普通印刷文本的人能够平等地获取知识、参与社区和体验。