__CAPGO_KEEP_0__ 首页

移动开发混合

移动开发混合 - 掌握混合移动开发。探索框架,如Capacitor,优缺点,性能,和企业级CI/CD

马丁·多纳迪厄

马丁·多纳迪厄

内容营销人员

移动开发混合

你可能处于两种情况之一。你的团队需要在iOS和Android上发布应用,而不需要雇用两个独立的本机团队,或者你已经发布了一个混合应用,正在发现实际工作是在第一次发布之后开始的。

大多数关于移动开发混合的建议都存在缺陷。它关注框架选择,而忽略了更难的问题:架构在负载下如何表现,性能问题来自哪里,如何测试web和native之间的code桥梁,以及如何在发布后修复问题而不将每次小的更改转变为商店评论事件。

混合开发可能是正确的战略选择,但如果你把它当作“只是包裹web应用”,那么它也可能成为维护陷阱。通常来说,区别在于从一开始就遵循的架构纪律、UI选择、插件管理和更新策略。

目录

混合移动开发的困境

大多数公司并不是因为混合式趋势而选择混合式。他们选择混合式是因为维护独立的iOS和Android代码库是昂贵的、缓慢的,并且难以招募人手。如果您的产品路线图已经很繁忙,双倍您的实现表面通常会比产品价值带来更多的组织阻力。

因此,移动开发混合式持续受到产品和工程领导者的关注。它提供了使用web技术来构建、重用更多逻辑,并从共享代码库中跨平台发布的方法。对于具有强大JavaScript或前端深度的团队来说,这通常是快速实现可信移动存在的途径。

但是,混合式并不是免费的捷径。它只是将复杂性转移了,而不是去除它。您可以节省重复的UI和业务逻辑,但您需要处理WebView、原生插件、性能预算、发布管道和移动特定UX的架构决策。那些忽视这些权衡的团队通常会误问native versus hybrid,而不是问实际需求是否适合模型。

一个有用的起点是基于事实的 移动应用开发比较 ,它以商业术语而不是技术偏好来框定更广泛的native versus hybrid决策。如果您正在评估共享code方法的更广泛的范围,这个 跨平台移动应用开发指南 也值得一看,因为许多团队混淆了混合式和跨平台术语,即使渲染模型不同。

实用原则: 选择混合模式时,应优先考虑共享交付速度,而不是绝对渲染性能,且产品可以容忍一些平台抽象而不影响用户体验。

混合应用背后的工作原理

混合应用最容易理解的方式是 在本机应用壳中运行的web应用

。用户从应用商店或Google Play商店安装它,就像安装任何其他移动应用一样,但用户看到的大部分内容是由嵌入式浏览器技术渲染的,而不是由本机UI组件渲染的。

混合应用架构的五层图示,从本机壳到设备API。

本机壳和WebView 在顶层是本机壳

。这是平台特定的容器,打包应用,处理安装,参与应用生命周期事件,暴露操作系统能力的访问权限。 WebView在 iOS 上,通常是 WKWebView。 在 Android 上,通常是 WebView。 应用程序的界面是使用 HTML、CSS 和 JavaScript 在嵌入式浏览器引擎中渲染,而不是通过 SwiftUI、UIKit、Jetpack Compose 或经典的 Android 视图。

这种架构是混合开发的定义特征。 ionic 清晰地描述了它:混合移动开发将 HTML5、CSS 和 JavaScript 写在 浏览器引擎,如 iOS 上的 WKWebView 和 Android 上的 WebView 渲染界面, 这种模型可以引入性能延迟和动画卡顿).

For teams that want a more implementation-level explanation of how web code talks to device capabilities, this walkthrough on how Capacitor bridges web and native code 是一个不错的技术伴侣。

如果你正在对产品、工程和设计在同一个心理模型上进行对齐,一个短暂的视觉解释会有所帮助:

能力的桥梁是

第二个关键层是 原生桥梁 或插件层。这是让JavaScript向操作系统请求原生工作的东西。相机访问、地理位置、生物识别、文件系统访问、推送注册和类似的设备功能并不是来自WebView的。它们来自暴露原生API给web层的插件。

在实践中,用户会在web UI中点击一个按钮。JavaScript会通过桥梁发起一个调用。原生code接收到它,和平台API进行交谈,然后将结果返回给JavaScript层。这个往返过程是为什么插件质量那么重要的原因。 如果桥梁设计得不好、不稳定或维护得很薄弱,应用程序会感觉脆弱,即使前端code很干净。

将桥梁视为产品边界,而不是便利层。小心地版本它、文档其契约,并避免让每个特性团队都自己发明原生抽象。

这也是为什么“只重用网站”通常会失败的原因。移动用户期望生命周期处理、离线行为、导航模式、键盘行为、安全区域支持和响应触摸交互的普通web应用通常不能很好地处理这些。一个混合应用可以感觉很精致,但只有当web层从头开始设计为移动应用时才会如此。

选择你的框架,混合生态系统

因为人们经常将 hybrid frameworks cross-platform native-rendering frameworks

混在一起,导致混合生态系统变得混乱。它们解决相关的商业问题,但它们不一样地渲染UI,也不一样地失败。

WebView-based hybrid frameworks Ionic, Capacitor, and Cordova.

Capacitor Capacitor

和Cordova Capacitor

CORDOVA 仍然在历史上和遗留资产中具有重要意义。您仍然会发现依赖于Cordova插件或继承了Cordova-era构建假设的企业应用。但是,如果我正在为新团队提供建议,我通常会将Cordova视为要迁移的对象,而不是目标。

原生渲染替代方案

然后你有 React NativeFlutter。这些通常出现在同一个购买对话中,因为它们也减少了重复的平台工作,但它们并不是在WebView中的混合体。

React Native通过原生UI抽象渲染。Flutter使用自己的渲染模型。两者都可以为UI重度产品提供更强大的运动性能和更紧密的平台感受,但两者也都带来了自己的生态系统约束、插件决策和平台特定逃生门。

如果您的利益相关者正在比较这些选项,这个 React Native的利弊和成本 is useful because it highlights the practical trade-offs teams run into after the initial excitement of code sharing wears off. For a more direct framing of a common enterprise decision, this comparison of React Native vs Capacitor 帮助解释了 WebView 模型与原生渲染方法之间的区别。

我如何在实践中筛选框架

我不从流行度开始。 我从渲染需求、插件风险和团队组成开始。

框架 主要技术 UI 渲染 性能 最佳用途
Ionic + Capacitor HTML、CSS、JavaScript 在原生壳内的 WebView 适合标准应用流程,图形交互较弱 内容应用、企业应用、内部工具、商业流程
Cordova HTML、CSS、JavaScript 原生壳内的WebView 与Capacitor类似的架构限制,较旧的插件模式 遗留的混合应用和继承的代码库
React Native JavaScript或TypeScript 通过框架抽象的原生渲染组件 许多应用类型的UI响应性更强 需要更接近原生体验的消费者应用
Flutter Dart 框架管理的渲染 强大的视觉一致性和流畅的UI,当UI设计良好时 愿意采用Dart的自定义UI系统和团队

几个问题可以快速缩小选择范围:

  • 这款应用到底是什么类型? A workflow app, catalog, field service tool, booking flow, and internal operations app often fit hybrid well. A game-like interface or highly animated social product usually pushes me toward native-rendering frameworks or native code.
  • 您已经具备什么样的才华? A strong web team can become productive in Capacitor and Ionic much faster than a team that has to build native mobile depth from scratch.
  • 您需要多少原生界面? 您的路线图越依赖于自定义传感器、先进的媒体管道、后台执行或不寻常的OS集成,越应该小心评估插件的成熟度。
  • 这个应用程序会存活多久? 一个短命的 MVP 可以容忍粗糙的边缘。一个需要维护数年且受到监管的企业应用程序需要更清晰的治理、更新策略和插件所有权。

框架很少是真正的风险。弱的发布纪律、不明确的插件所有权和从桌面Web复制的UI决定通常是导致混合程序沉没的原因。

混合开发的利弊

混合开发在产品经济利益倾向于共享交付时效果良好,但当应用程序的价值依赖于平台特定的性能或非常精致的原生交互模式时,它就会遇到困难。

混合移动应用开发策略的利弊比较图表

混合适合的场景

对于许多商业应用来说,最大优势是简单的: 一个代码库和一个主要的技能集一个面向Web的团队可以在不将每个功能分成两个单独实现的情况下构建、维护和迭代两种平台。

这通常适用于以下产品:

  • 运营应用程序 适合销售团队、销售团队或内部人员
  • 内容丰富的应用 表单、仪表板、列表和账户工作流程占主导地位的应用
  • 商业和服务应用 可靠性和发布速度比精致的动画系统更重要的应用
  • 验证工作流程更重要于最大化原生一致性的产品原型和MVP 战略优势不仅仅是初始速度。它还包括持续的一致性。共享的业务逻辑、统一的设计系统和单一的发布流程可以在iOS和Android之间减少漂移。

团队会被烧伤

当团队期望混合应用在每个场景中表现得像原生一样时,问题就出现了。它不会。

常见的失败模式通常是这些:

性能期望是不现实的

  • 不符合预期的性能 复杂的手势、高频的视觉更新和图形密集的屏幕暴露了浏览器渲染的局限性。
  • UI 并不针对移动设备设计。 团队将响应式的 Web 应用程序放入一个壳中并称之为完成。用户马上就能察觉到。
  • 插件依赖成为架构债务。 一个不支持的插件可以阻止操作系统更新或关键功能发布。
  • 调试跨越层次。 一些 bug 存在于 JavaScript 中,另一些存在于本机 code 中,另一些存在于它们之间的桥梁中。

混合不是一个默认的妥协。它变成一个妥协,当产品需要一个东西,而架构优化为另一个东西时。

我通常向企业团队提供这样的指导:如果您的应用程序的核心任务是帮助用户完成任务、消耗信息或移动业务工作流程,混合通常是一个实用性的匹配。如果您的应用程序的核心任务是通过运动来愉悦用户、实时强烈的交互或先进的图形,混合通常是错误的重心。

性能、安全性和测试最佳实践

混合应用程序不会因为使用 Web 技术而失败。它们失败是因为团队将 Web 的习惯带入移动运行时而没有改变他们的标准。生产级混合工程需要明确的规则来确保性能、安全性和测试。

在现代、光线充足的办公室环境中工作的专业软件开发人员,使用多个显示器。

__CAPGO_KEEP_0__

大多数混合性能问题都是自我造成的。庞大的包文件、过大的图片、过多的重绘和长列表的简单渲染会使任何WebView都感到沉重。

首先关注基本问题:

  • 一次渲染少量UI。 使用虚拟滚动或列表窗口来处理长列表、目录屏幕和事件日志。
  • 发送更小的包文件。 将code按路由或功能分割,保持启动路径简洁。
  • 优化图片和资产。 大型媒体文件会惩罚启动时间和滚动。
  • 检查动画选择。 如果一个屏幕依赖于复杂的运动来感觉良好,请在低端设备上尽早测试。
  • 在真实硬件上进行性能分析。 浏览器开发工具很有帮助,但移动瓶颈在设备上表现出不同的方式。

此指南中有一个有用的检查清单,特别是对于试图从“它工作”到“它在生产设备上感觉稳定”的团队。 混合应用继承了来自web和native世界的风险。这意味着您需要对传输、存储和桥梁通信进行控制。混合应用继承了来自web和native世界的风险。这意味着您需要对传输、存储和桥梁通信进行控制。

几个关键点:

将桥梁调用视为特权操作。

验证输入并避免将过于广泛的本机函数暴露给JavaScript。

  • 小心存储敏感数据。 不要假设浏览器存储选项适用于凭据或受管辖数据。
  • 保护web层。 Security rules for hybrid architecture
  • A few essential points: WebView 内部仍然存在严重的 XSS 和不安全内容注入问题。
  • 尽量保持插件库的精简。 每个插件都会扩大攻击面和维护负担。

安全审查应该从系统层面来审查整个应用,而不是仅仅关注在 WebView 中的 Web 前端。

一个真实的测试堆栈

纯 Web 测试不足,纯设备测试太慢。正确的答案是层次化的策略。

首先围绕商业逻辑和 UI 行为编写单元测试。然后添加浏览器端的端到端测试,重点关注主要用户旅程。最后,针对原生行为最重要的位置运行目标设备测试,例如权限、相机流程、推送设置、深度链接和文件处理。

最后一类是很多混合团队都低估的。应用可能在浏览器中看起来很好,但在真实设备上仍然会出现问题,因为桥接协议、生命周期行为或权限流程的行为与预期不同。

超越构建 CI/CD 和实时更新

混合应用并不是当商店列表发布时就完成了。对于企业团队,发布后运营模型的重要性与构建本身一样。发布纪律、回滚策略和更新速度是区分可管理的混合资产和令人焦虑的混合资产的关键。

https://capgo.app 的截图

一个完整的混合交付管道是什么样的

A healthy CI/CD setup for hybrid usually includes these stages:

  1. CI/CD混合应用通常需要以下阶段:
    构建和验证Web应用

  2. 编译Web应用,运行测试,验证环境配置,之后再进行原生打包
    原生同步和平台构建

  3. 将Web资源同步到原生项目中,构建签名的iOS和Android包,验证插件集成
    基于渠道的分发

  4. 将构建推送到内部测试,QA,beta组,或者分阶段的生产用户群,之后再进行大规模发布
    发布后可观察

跟踪应用程序崩溃,桥接失败,插件回归,和应用程序版本的采用率,以便支持和工程团队可以快速响应

这个管道很重要,因为混合应用程序有两个发布面:应用程序二进制文件和内部的Web包。如果您将它们视为一个不可分割的东西,那么您的发布过程会比需要的慢得多

为什么实时更新会改变运营流程

28% 的企业移动团队报告由于 App Store 和 Play Store 审核周期而延迟部署关键 JS/CSS/config 修复,平均审核时间为 3 到 7 天根据 此混合应用开发分析。同一来源指出,混合指南往往忽略独立更新器,这些更新器支持 分钟级更新.

具有自动回滚保护

这个问题是操作性的,而不是理论性的。如果生产错误存在于 JavaScript、样式、配置、副本或其他 web 交付资产中,等待完整的商店审查往往是多余的摩擦。

  • 一个实时更新系统让团队能够: 快速修复 web 层面的缺陷
  • 而无需重建和重新提交完整的应用程序二进制文件 目标发布渠道
  • 以便 beta 用户、区域或客户段可以选择性地接收更改 如果更新引入了回归
  • 保持本机发布的焦点 在需要本机审查的变化上

本机发布的一个选项是 Capacitor 的实时更新是如何工作的. 在实际操作中,类似于 Capgo 的平台会将签名的 Web 包传递给 Capacitor 应用程序,使团队能够在标准应用商店审查周期外更新 JavaScript、CSS、复制、配置和资产,同时保留回滚控制.

如果您的混合应用程序没有发布后更新策略,您就完成了架构。您只完成了第一批货物。

治理是重要的界限。实时更新应该像控制释放系统一样对待,包括通道、批准、签名、可观察性和回滚路径。它们不是绕过工程纪律的借口。它们是应用纪律的方式,速度更快。

企业级迁移和扩展策略

大型组织通常从两个方向迁移到混合。他们要么想整合碎片化的本机和 Web 努力,要么已经有一个混合应用程序,需要扩展它而不创建一个混乱的插件、重复的 UI 模式和不一致的发布实践的丛林。

何时进行迁移

迁移到混合时,业务逻辑已经高度共享,工作流程是表单驱动的或内容中心的,公司希望一支团队拥有更大的交付路径时,迁移才有意义。

当原生应用因为高效的平台交互、先进的媒体管道或性能敏感的界面而获胜时,这就不太合理了。在这种情况下,我通常会推荐一种选择性的策略而不是全面的重写。将工作流程密集的界面移到混合层,但保留性能关键模块为原生。

同样的原则在反向应用时也有效。成功的混合应用不需要永远保持纯粹的混合状态。许多成熟的团队将应用的大部分内容放在共享的Web层,并在明确的原生模块中切割出特定的内容。

如何在不失控的情况下进行扩展

企业扩展主要是一个治理问题。

以下几种模式很有效:

  • 定义插件审批流程。 不要让每个小组自由添加原生依赖。
  • 保持共享组件系统。 移动Web层需要像任何严肃的前端平台一样严格遵守设计原则。
  • 清晰地分离平台code所有权。 必须有人负责iOS构建健康、Android构建健康和桥接稳定性。
  • 标准化发布政策。 决定哪些功能通过商店发布、哪些功能适合实时更新、以及谁负责回滚.
  • 构建可替换的架构. 如果某个功能超出了混合约束,你应该能够在不重写整个应用的情况下重新实现该功能片段.

最强大的企业混合程序不是那些避免使用原生code的程序,而是那些有意识地使用混合、保持界限清晰、并将原生投资保留给那些值得它的部分的程序.


如果您的团队正在使用Capacitor并需要一种控制的方式来发布后发布修复, Capgo 值得评估。它为团队提供了一个实时更新工作流程,适用于JavaScript、CSS、配置、副本和资产,具有签名包装交付、滚动频道和回滚支持,适合生产环境中维护混合应用的现实情况.

实时更新 Capacitor 应用

当 web 层 bug 活跃时,通过 Capgo 将修复推送到用户,而不是等待几天的 app store 审批。用户在后台接收更新,而原生变化仍在正常的审批路径中

立即开始

最新博客

Capgo 为您提供创建真正专业的移动应用所需的最佳见解。