站在一个前端的角度了解app里使用的webview

本文深入探讨混合应用程序(HybridApp)中WebView组件的作用及其实现原理,包括其在Android和iOS平台上的特性、事件与数据交互方式,以及前端与原生应用之间的沟通机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

移动应用开发模式

现在的移动应用开发模式有3种:

  • Native App: 本地应用程序(原生App)
  • Web App:网页应用程序(移动web)
  • Hybrid App:混合应用程序(混合App)

现在越来越多的app采用混合模式开发(Hyprid App),既有原生app的优良用户体验,又有web app的跨平台优点。 而其核心是使用 WebView 控件实现加载url,接下来我总结了关于 WebView 的介绍和使用。

webview的概念

看过一些从app开发者的角度写的关于 Hybrid App,但却还没有从前端的角度去理解 Hybrid App

webview 用来展示网页的 view 组件,该组件是你运行自己的浏览器或者在你的线程中展示线上内容的基础。使用 webkit 渲染引擎来展示,并且支持前进后退等基于浏览历史,放大缩小,等更多功能。

简单来说 WebView 是手机中内置了一款高性能 webkit 内核浏览器,在 SD 中封装的一个组件。不给过没有提供地址栏和导航栏,只是单纯的展示一个网页界面。

上面这段话是一个app开发者说的,而站在一个前端开发者的角度,使用过后的感受就是:

webview 可以简单理解为页面里的 iframe 。原生app与 webview 的交互可以简单看作是页面与页面内 iframe 页面进行的交互。就如页面与页面内的 iframe 共用一个 window 一样,原生与 webview 也共用了一套原生的方法。

原生app与webview的交互

在项目中,可能会存在原生和 webview 属于两个不同的组开发的情况,比如一个app将业务分开,原生部分业务由原生的app开发者开发, webview 内业务由前端开发者开发,此时需要原生开发者与前端开发者统一一下交互方式,前端需要告知app哪些方法可以调用,而app需要告诉前端app提供了哪些方法和数据给前端。

原生app分 androidios 两种应用,原生的写法,这两种应用的开发语言和框架都不同,所以他们与 webview 的交互也不同。

android 与 webview 的事件交互

androidwebview 的事件交互其实也就是 androidwebview 内部的js事件交互,他们的事件交互又分为 android 调用js事件和js调用 android 事件。

博文--Android:你要的WebView与 JS 交互方式 都在这里了已经将相关 android 方法和js使用的方法写的非常浅显易懂了。

我接触到的项目中使用了图片中的两个方法1,作为一个前端开发者,在js上只需要调用 android 提供的映射对象中的方法和声明一个方法给app调用就ok,可以说是非常的简洁了。

ios 与 webview 的事件交互

ios的webview有两种:UIWebViewWKWebView,不同类型的 webview 与ios的交互方法也不同:

1.拦截url(适用于 UIWebViewWKWebView,只适合简单的调用,如果要传递参数,虽然也可以拼接在url上,如 jxaction://scan?method=aaa,但是需要我们自行对字符串进行分割解析信息)

2.JavaScriptCore(只适用于 UIWebView,iOS7+)

3.WKScriptMessageHandler(只适用于 WKWebView,iOS8+)

4.WebViewJavascriptBridge(适用于 UIWebViewWKWebView,属于第三方框架)

这四种方法都有对应的比较好的demo,可以根据需要选择。

接触的项目中使用了 javaScriptCore,大概是因为使用这个方法在js中写方法和调用方法都比较简洁和方便吧。

原生与webview的数据交互

上面是事件的交互,那数据的交互呢?

在使用过程中,数据的交互有两种方式:

  1. webview 传入的 url 中携带数据
  2. webview 中调用原生提供的映射对象中指定的方法获取。 webview 传数据给原生也可以使用该方法,将数据作为参数传递给原生app。

注:ios的第一种方法不支持传参给原生

webview 的属性

就像 html 标签都有各自的属性一样, webview 也有自己的属性。

android 和 ios 的 webview 有所不同。ios 官方提供了有 UIwebview(貌似将要被弃用了)和 WKwebview 的属性。android文档中也提供了 webview 相关的接口

接触了一下RN的 webview 组件,官方提供了丰富的属性和方法。既然将 webview 比作 iframe,那就举个例子:像 iframesrcwebview 中就有对应的 source 与其相对应,当然,RN上 webview 的属性要丰富的多。

weex中也有 webview,但它并不是作为一个组件使用,而是作为一个模块控制 <web /> 组件一起使用。 官方的demo感觉很良心了。

最后,上个RN官方的 webview 的超简例子

import React, { Component } from 'react';
import { WebView } from 'react-native';

class MyWeb extends Component {
  render() {
    return (
      <WebView
        source={{uri: 'https://github.com/facebook/react-native'}}
        style={{marginTop: 20}}
      />
    );
  }
}
复制代码

了解了一波webview,感觉作为一个前端也可以自己写一个app了,用h5写:yum:

### 解决iOS应用审核时出现白屏问题的方法 当开发人员提交iOS应用程序到App Store进行审核时,可能会遇到一些技术挑战,比如在加载过程中显示空白屏幕。这种现象通常由以下几个原因引起: #### 1. **CSS文件加载位置不当** 如果样式表(CSS)被放置在HTML文档的底部附近,则可能导致许多浏览器(包括Internet Explorer)阻止渐进渲染[^3]。这些浏览器会暂停页面绘制过程,直到所有必要的资源都已下载完毕并解析完成为止。这会导致用户看到的是一个完全空白的白色页面。 为了防止这种情况发生,在构建Web视图或混合型移动应用时应遵循最佳实践——始终将外部样式表链接放在`<head>`标签内部而不是靠近<body>结束处的位置上。这样可以确保即使某些部分尚未准备好呈现给最终使用者之前也能先显示出部分内容来改善用户体验感知速度。 ```html <!DOCTYPE html> <html lang="en"> <head> <!-- 正确做法 --> <link rel="stylesheet" href="/styles.css"> </head> <body> ... </body> </html> ``` #### 2. **JavaScript执行错误** 另一个常见原因是由于初始化脚本失败或者存在未捕获异常而导致整个界面无法正常工作。对于基于WebView的应用程序来说尤为重要因为它们依赖于嵌入式的网页环境运行逻辑代码。因此建议开发者们仔细检查所有的JS函数调用链路是否存在潜在风险点,并通过try-catch语句包裹可能抛出错误的操作以便及时处理意外情况从而避免全局崩溃效应扩散至UI层面上去影响整体表现效果。 此外还可以利用现代前端框架所提供的生命周期钩子机制如React中的componentDidCatch()方法来进行更深层次的安全防护措施部署以进一步增强系统的鲁棒性和稳定性水平。 ```javascript class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error) { return { hasError: true }; } componentDidCatch(error, info) { logErrorToMyService(error, info); // 记录日志用于调试分析 } render() { if (this.state.hasError) { return <h1>Something went wrong.</h1>; } return this.props.children; } } ``` #### 3. **网络请求超时/失败** 最后一点需要注意的就是数据获取环节可能出现的问题。假如某个关键性的API接口响应缓慢甚至完全没有返回任何有效载荷的话那么很自然地就会造成前端组件缺少必要参数进而陷入停滞状态直至设定好的重试次数耗尽之后才会给出提示信息告知当前状况如何解决此类难题则需从多个角度出发综合考虑解决方案比如说设置合理的timeout阈值以及启用缓存策略减少不必要的重复查询动作等等手段都可以有效地缓解上述症状带来的困扰程度达到优化性能的目的同时提升用户的满意度评分等级。 综上所述针对iOS app review期间所遭遇的white screen issue可以通过调整资源配置顺序改进客户端侧编程技巧再加上完善的服务端支持共同协作才能彻底根除这一顽疾让产品顺利上线赢得更多消费者的青睐和支持[^1].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值