基于Mendix移动原生的离线应用

一、前言

不同行业的企业会有特殊的业务场景,比如某些制造业的企业的工厂是物理隔离的,但工程师需要拿着平板输入很多生产数据;某些煤炭和矿业企业,在实际的工作区都是比较偏远,信号比较差,但是又需要用手机打开应用输入信息,等等这些业务场景需要都需要一个离线的应用来支持。

二、需求分析

首先,我们来看一下有哪些类型的离线应用。

Picture1.png

从上图我们可以看出,支持离线应用的有PWA,Hybrid,Native共三种。

Picture2.png

其中Hybrid套壳移动应用,支持原生功能+复用Web资源,但是开发比较复杂,本次将不会介绍。PWA开发的应用无需依赖应用市场,体积小、加载快,提供部分独立应用能力的网页应用,但是离线功能基于所使用的浏览器,比如苹果的Safari不支持离线缓存能力,Chrome支持离线缓存,但是基于PWA的应用能力受限于浏览器,比如无法获得手机上每天运动的步数,心率等数据。所以本文会重点介绍通过移动原生开发的离线应用。移动原生应用具有更好更快用户体验,更好集成移动设备的各种功能。

三、安装安卓Studio测试

下载路径:
Download Android Studio & App Tools - Android Developers
首先下载Android studio安装包,如果只是测试移动原生的基本功能和调试,可以使用推荐的APP-Make it Native,但是如果需要测试离线功能和自定义移动原生组件则需要安装此工具来测试。Make it Native只支持标准原生组件的测试,且无法测试离线功能。

Picture3.png

基本是一直点Next直到安装完成,网上有很多安装教程,这里就不介绍具体的安装细节了。安装成功点击finish,等待启动。

Picture4.png

继续点击Next安装,直到打开如下界面。

Picture5.png

点击More Actions,然后选择Virtual Device Manager。

Picture6.png

运行设备

Picture7.png

把开发出的离线应用生成APK文件,然后拖入到打开的手机端安装。构建原生应用程序(iOS 上的 IPA 和 Android 上的 APK)。可以参考文档Building, Testing, and Distributing Apps | Mendix Documentation

Picture8.png

打开安装的应用

Picture9.png

输入本地的IP地址,然后启动

Picture10.png

然后我们的移动应用就启动了,在测试移动原生应用的时候需要同步启动Studio Pro里的项目,上面生成的APK文件是用于测试开发移动原生应用功能的。测试离线功能的话,需要生成最终面向客户的APK安装文件。运行此文件时不需要如上图输入地址而会自动运行,在测试离线功能的时候,只需要在Studio pro里停止运行的项目,即可测试离线功能。

四、移动原生-离线应用

1 简介

Mendix平台支持构建完全脱机优先的应用程序,无论是移动原生应用程序还是PWA渐进式 Web 应用程序。

无论连接如何,离线优先的应用程序都能提供持续的体验。页面和逻辑与设备上的离线优先数据库交互,用户与服务器同步数据。针对本地数据库工作可获得更快速的UI、更高的可靠性和更长的设备电池寿命。请注意,离线优先应用程序需要网络连接才能进行多项操作,例如首次启动应用程序或用户尝试登录时。

Mendix支持为移动原生和渐进式网络应用程序构建离线优先应用程序。移动原生和渐进式 Web 应用程序 (PWA) 共享相同的核心,赋予它们相同的离线优先功能。移动原生应用程序始终离线优先,

2 同步

同步是将数据和文件从应用程序的服务器复制到设备并使用在本地设备上所做的更改更新服务器的过程。应用程序首次启动时会填充本地数据库。初始同步后,数据将在应用程序中保持可用,因此它可以在没有互联网连接的情况下工作。您可以对何时以及如何执行后续同步进行建模。在某些情况下, Mendix 用户可能会自动执行同步。设计高效的同步策略对于高性能应用程序和流畅的用户体验至关重要。

Mendix会自动分析您应用程序的数据模型,以根据您的离线优先导航配置文件中使用的页面和纳米流来确定应同步哪些实体。此外,该平台考虑了实体访问,因此仅同步允许用户访问的数据。

在以下情况下会自动触发同步:

  • 移动应用程序的初始启动
  • 当满足以下条件时,您的Mendix应用重新部署后首次启动您的移动应用:
    • 有网络连接
    • 您正在使用新的Mendix版本
    • 离线优先应用程序中使用的域模型已更改(请注意, Mendix 用户有时可以针对某些域模型更改优化流程,并将跳过此自动同步,从而加快启动时间)
  • App用户登录或退出后(注:退出后同步,不是同步退出用户的数据,而是同步匿名用户的数据)

同步也可以通过Mendix应用程序中的不同位置进行配置,例如:

  • 作为按钮上的操作
  • 作为纳流中的一个动作
  • 作为列表视图上的下拉操作(仅适用于本机移动设备)

同步在数据库级别执行。这意味着如果您在对对象进行一些未提交的更改时进行同步,则本地数据库中的属性值将被同步,而忽略未提交的更改。同步后未提交的更改仍然可用。

2.1 同步类型

可以从用户触发三种不同类型的同步:

  • 完全同步
  • 同步未同步的对象
  • 选择性同步

2.1.1 完全同步

此模式为离线优先应用程序中使用的所有实体执行上传和下载阶段。您可以使用可定制的同步来定制每个实体的行为。

2.1.2 同步未同步的对象

这种类型的同步只能通过纳流内的Synchronize操作来完成。在这种模式下,所有更改提交到离线优先数据库的对象都会同步。有关自上次同步以来删除的对象的信息也会发送到服务器。

Picture11.png

2.1.3 选择性同步

选择性同步能通过纳流内的Synchronize操作来完成。在这种模式下,一组特定的对象将被同步。 已删除的对象无法使用选择性同步进行同步。同时也可以通过微流里的Synchronize to device来把对应的数据从服务器同步到设备里。

Picture12.png

2.2 同步阶段

同步过程包括两个阶段。在上传阶段,您的应用程序使用提交的新对象或更改的对象更新服务器数据库。在下载阶段,您的应用使用服务器数据库中的数据更新其本地数据库。请注意,同步仅适用于数据库级别。这意味着新的未提交对象和属性更改不会同步。

2.2.1 上传阶段

上传阶段执行以下操作:

  1. 由于只能通过提交或删除对象来修改本地数据库,因此此类对象可以是离线优先时创建的新对象,也可以是先前从服务器同步的现有对象。上传阶段检测自上次同步以来哪些对象已提交到本地数据库。检测逻辑因同步类型而异。对于Synchronize all ,检查本地数据库中所有提交的对象。对于Synchronize objects ,检查所选对象列表中的所有已提交对象。
  2. 自上次同步以来,可能有从设备数据库中删除的对象。上传阶段检查哪些对象已被删除。
  3. 如果有任何更改或新的文件对象,它们的内容将上传到服务器并临时存储在那里。每个文件都在单独的网络请求中上传。如果文件上传失败,整个同步将中止,而不会对服务器或设备数据库造成任何更改。
  4. 所有更改的和新的对象都发送到服务器,文件的内容链接到对象。服务器执行对象的引用完整性验证。对象被提交到服务器数据库。有关已删除对象的信息也会发送到服务器,因此服务器也可以从其数据库中删除它们。此步骤在单个网络请求中执行。
  5. 任何在这些对象上配置的提交前或提交后或删除前或删除后事件处理程序都将照常在服务器上运行:在数据上传之后和设备数据库更新之前。这意味着您在事件处理程序中对同步对象所做的任何进一步更改都将在下载阶段应用到设备数据库。此规则有一个例外:当您尝试在事件处理程序中更改文件实体的内容时,不会应用更改文件实体的内容。新对象的提交前和提交后事件处理程序也将被执行。

2.2.2 下载阶段

如果上载阶段成功,则下载阶段开始,其中本地数据库使用来自服务器数据库的最新数据进行更新。下载阶段的行为因同步类型而异:

  • 完全同步– 每个实体向服务器发出网络请求,以从服务器数据库检索最新数据。您可以通过自定义应用程序的同步行为来管理将哪些实体同步到本地数据库。有关此过程的更多详细信息,请参阅下面的可自定义同步部分。下载过程还会下载文件实体的内容并将其保存到您的设备存储中。这个过程是渐进的。仅当文件之前未下载过,或者文件自上次下载后已更改时,应用程序才会下载文件对象的内容。文件实体的更改日期属性用于确定文件对象的内容是否已更改。
  • 选择性同步– 只有选择同步的对象才会同步到本地数据库。没有额外的网络请求来检索这些对象。对象在上传阶段发出的网络请求的响应中返回。如果选择文件实体进行同步,则其内容也会在设备存储上增量更新。完全同步的逻辑是一样的。

2.3 同步后

同步完成后,您应用当前页面上的小部件将被刷新以反映最新数据。如果同步是从纳流触发的,则会更新所有纳流对象/列表变量(未提交的更改仍会保留)。

请注意,如果对象在同步过程中从设备中移除,则纳流对象变量的值在同步后可能会变为empty 。在以下情况下可能会发生这种情况:

  • 对象在服务器上被删除
  • 当前用户对对象没有足够的访问权限(由安全访问规则定义)
  • 实体在可定制的同步屏幕上配置了 XPath 约束,并且对象不再匹配指定的 XPath 约束
  • 实体在可自定义的同步屏幕上配置为无(清除数据)选项
  • 对象的上传阶段失败 - 例如,当提交前事件处理程序返回 false 或由于违反唯一验证而提交失败时

2.4 可定制的同步

这些设置不适用于选择性同步。默认情况下, Mendix自动确定哪些对象需要同步,如同步中所述。

根据用例,可能需要更细粒度的同步控制。因此,可以更改实体的同步模式。您可以在以下选项中进行选择:

  • 所有对象- 下载应用常规安全约束的所有对象。
  • 通过 XPath – 除了常规安全约束之外,仅下载与XPath 约束匹配的对象。这意味着所有先前同步的与 XPath 约束不匹配的对象都将被删除。
  • 无(清除数据) - 不自动下载任何对象,但在执行同步时清除存储在该实体的数据库中的数据(这在只应上传对象的情况下很有用,例如Feedback实体) .
  • 无(保留数据) ——不自动下载任何对象,并且在执行同步时不清除存储在该实体的数据库中的数据(这在您想要完全控制同步的情况下很有用,应该使用结合同步到设备或与选定的特定对象同步活动)。
  • Never – 当实体设置为Never时,在 Startup Synchronization、 Synchronize all Objects或Synchronize Unsynchronized Objects期间,其对象将不会在运行时和离线优先数据库之间同步。或者,仍然可以使用同步到设备或同步所选对象来同步对象,但您将控制同步的时间和内容。

如果您的自定义小部件或 JavaScript 操作使用了Studio Pro在您的离线优先配置文件中无法检测到的实体(因为它仅在代码中使用),您可以使用可自定义的同步来包含此类实体。

Picture13.png

同时我们在最新版本10.2发布的内容中可以看到,新增了online同步模式,这样我们就可以更灵活地决定哪些实体可以用于离线,哪些实体必须在在线情况下才能使用。

Picture14.png

3 离线优先应用程序建模

您可以使用相同的概念(域模型、页面、微流等)和编辑器来为 Web 应用程序建模,从而为离线优先应用程序建模。然而,离线优先应用程序与网络应用程序有根本的不同。 Mendix Studio Pro执行验证以确保您的应用程序遵循离线优先方法并且即使在没有连接的情况下也能正常工作。

3.1 本地数据库

离线优先应用程序的主要区别在于它们使用本地数据库而不是服务器数据库。这意味着您需要将应用程序所需的对象同步到离线优先客户端的本地数据库。但是,同步太多对象可能会导致性能问题。

用户所做的变化也存储在这个离线优先的数据库中。这意味着在更改与服务器同步之前,其他用户不会存在此类更改。将应用程序中所做的更改同步到服务器数据库时,开发团队需要考虑几个方面。例如,同一对象可能已被不同用户编辑或删除,或者由于应用程序模型中定义的访问规则而无法再访问。在开发项目开始时就工作流程达成一致,以保持开发顺利进行。

3.2 向后兼容

开发离线优先应用程序的另一个重要方面是向后兼容性。通常,当您将新版本的 Web 应用程序部署到云端时,所有用户都可以立即访问最新模型。但是,离线优先应用程序并非如此。应用程序模型的某些部分作为本机移动应用程序包的一部分分发,例如页面、纳流和 JavaScript 操作。这意味着即使您更改和部署这些部分的新版本,您的用户也无法访问最新版本,直到他们通过 OTA 包或在线应用商店(如 Google Play 或 App Store)更新他们的本机移动应用程序。

想象一下,您已经部署了本机移动应用程序的第一个版本,您的用户已经下载了它,现在他们正在使用它。此时,您应该考虑对模型引入的更改。例如,假设您重命名一个实体并将其部署到Mendix公有云。用户设备中的本地数据库仍将使用旧的实体名称。如果您的用户尝试同步您重命名的实体的新对象,这可能会导致同步错误,因为服务器不再具有旧名称的实体。即使您的用户更新了设备上的应用程序,也可能存在使用旧模型域创建的数据需要与服务器同步。此类问题就是您需要确保应用程序的模型更改向后兼容的原因。

关于其他应用程序元素的更改可能会出现类似的问题,包括用户可用的微流和常量。例如,如果您的新部署重命名微流或修改其参数,则尚未更新其应用程序的用户将使用应用程序的先前模型,其中它引用具有旧名称的微流。

为确保Mendix应用程序的最佳用户体验,请遵循以下最佳实践:

  • 通过自定义同步配置或安全访问规则来限制将要同步的数据量
  • 由于网络连接可能很慢且不可靠,而且移动设备的存储空间通常有限,因此请避免同步大文件或图像(例如,通过限制照片的大小)
  • 尝试通过纳流而不是UI元素进行同步,以便您可以向同步活动添加错误处理,同步活动可以处理同步失败的情况(连接错误、模型和数据相关错误等)
  • 使用选择性同步同步大文件或图像
  • 为删除功能使用isDeleted布尔属性,以便可以在服务器上正确处理冲突
  • 使用提交前和提交后的微流来预处理或后处理数据
  • 在您的纳米流中使用微流调用来执行其他服务器端逻辑,例如从 REST 服务检索数据,或访问和使用复杂逻辑(例如 Java 操作)
  • 帮助您的用户记住同步他们的数据以便尽快处理:您可以检查连接并在提交对象的纳流中自动同步,或者提醒用户在使用通知时或注销前进行同步以确保不会数据丢失

4 分发移动应用程序

当您对 Web 应用程序进行建模并将其部署到生产环境时,所有用户都可以立即访问它。然而,对于离线优先的应用程序来说,情况通常并非如此。用户设备上安装的应用程序不会立即更新(对于本机移动应用程序尤其如此)。通常,您在 Google Play 商店和 Apple App Store 中创建并分发应用程序的新版本,这可能需要一些时间。或者, Mendix提供了一种无线 (OTA) 更新机制来更新您的应用程序,而无需完成发布过程。

有关安全更新离线优先应用程序的信息,请参阅构建、测试和分发应用程序。Building, Testing, and Distributing Apps | Mendix Documentation

最后,让我们断开Studio pro的项目,来测试离线应用吧。

Picture15.png

五、参考资料

  1. 离线功能介绍Offline-First Data | Mendix Documentation
  2. 构建测试发布原生应用Building, Testing, and Distributing Apps | Mendix Documentation

           

关于Mendix公司

在一个数字化先行的世界中,客户希望自己的每一项需求都得到满足,员工希望使用更好的工具来完成工作,而企业意识到自己只有通过全面数字化转型才能生存并取得成功。Mendix公司,a Siemens business正在迅速成为企业数字化转型的推动者。其业内领先的低代码平台和全方位的生态系统整合最先进的技术,帮助企业创造出提高互动性、简化操作和克服IT瓶颈的解决方案。Mendix公司以抽象化、自动化、云和协作为四大支柱,大幅提升开发者的生产力,并且依靠自己的工程协作能力和直观的可视化界面,帮助大量不熟悉技术的“公民”开发者在他们所擅长的领域创建应用程序。Mendix公司是权威行业分析师眼中的领导者和远见者,也是一个云原生、开放、可扩展、敏捷和饱经考验的平台。从人工智能和增强现实,到智能自动化和原生移动,Mendix公司已成为数字化先行企业的骨干。Mendix公司企业低代码平台已被全球4000多家领先的公司采用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/70507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python技巧】替换文件中的某几行

【python技巧】替换文件中的某几行 1. 背景描述2. 单行修改-操作步骤3. 多行修改-操作步骤 1. 背景描述 最近在写一个后端项目,主要的操作就是根据用户的前端数据,在后端打开项目中的代码文件,修改对应位置的参数,因为在目前的后…

浏览器安全-同源策略和CORS

同源策略 同源策略是浏览器的一个安全功能,浏览器禁止在当前域读写其他域的资源,如限制跨域发送ajax请求 不受同源策略限制的 1)页面中的链接,重定向表单以及表单提交 2)跨域资源引入 如script不受跨域限制&#xff0…

Elasticsearch:wildcard - 通配符搜索

Elasticsearch 是一个分布式、免费和开放的搜索和分析引擎,适用于所有类型的数据,例如文本、数字、地理空间、结构化和非结构化数据。 它基于 Apache Lucene 构建,Apache Lucene 是一个全文搜索引擎,可用于各种编程语言。 由于其速…

远程工作面试:特殊情况下的面试技巧

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

【Vue3 知识第四讲】数据双向绑定、事件绑定、事件修饰符详解

文章目录 一、数据双向绑定二、事件绑定详解2.1 **Vue中的事件绑定指令**2.2 **事件函数的调用方式**2.3 **事件函数参数传递** 三、事件修饰符3.1 **Vue中常用的事件修饰符**3.2 **按键修饰符** 四、属性绑定五、类与样式的绑定5.1 class 类的绑定5.2 style 样式绑定 一、数据…

一文了解Android App Bundle 格式文件

1. Android App Bundle 是什么? 从 2021 年 8 月起,新应用需要使用 Android App Bundle 才能在 Google Play 中发布。 Android App Bundle是一种发布格式,打包出来的格式为aab,而之前我们打包出来的格式为apk。编写完代码之后&a…

uni-app语音转文字功能demo(同声传译)

目录 首先去微信开发者官网申请一下同声传译的插件 微信公众平台 在文件中开始引用: 首先去微信开发者官网申请一下同声传译的插件 微信公众平台 后续使用的时候可以看详情里面的信息进行使用 在文件中开始引用: 注意!!在这个…

2023年了,java后端还有未来吗?

前言 Java当下确实是比较的内卷,但关键在于个人,可以看看不同地方(这里主要举例北上广深一线城市)对于Java开发工程师这个职位的具体要求: 在以下北上广深这些一线大城市的面试招聘当中不难看出,凡是工资…

二维码智慧门牌管理系统:让城市管理更智能、便捷

文章目录 前言一、二维码智慧门牌管理系统的特点二、数据集约化与规范化三、管理智能化与长效化四、标识规范化与易维护五、服务多元化与便捷化 前言 随着城市化进程的加速,城市管理面临着越来越多的挑战。为了解决地名地址管理交织错综、地名地址支撑政府管理成效…

自动驾驶中间件

自动驾驶中间件 1. 什么是中间件2. 中间件的分类3. 自动驾驶为什么需要中间件4. 通信中间件 Reference: 自动驾驶中间件:量产落地的关键技术通俗易懂的告诉你什么是中间件 对于初入自动驾驶行业的人来说,各色各样的新型传感器、线控系统、芯…

QT 初识多线程

1.QThread线程基础 QThread是Qt线程中有一个公共的抽象类,所有的线程类都是从QThread抽象类中派生的,需要实现QThread中的虚函数run(),通过start()函数来调用run函数。 void run()函数是线程体函数,用于定义线程的功能…

第 2 章 线性表 (线性表的单链表存储结构实现)

1. 背景说明 2. 示例代码 1) status.h /* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H #define STATUS_H/* 函数结果状态码 */ #define TRUE 1 /* 返回值为真 */ #define FALSE 0 /* 返回值为假 */ #define RET_OK 0 /* 返回值正确 */ #d…

计算机网络的故事——HTTP首部

HTTP首部 在HTTP协议通信交互中使用的首部字段。不限于RFC2616中定义的47种首部字段,还有Cookie、setCookie和Content-Disposition等 HTTP 首部字段将定义成缓存代理和非缓存代理的行为,分成 2 种类型。端到端首部和逐跳首部

关于vscode的GitLens插件里的FILE HISTORY理解

最近在用vscode的GitLens插件开发项目遇到这个疑问,先看图: 每当我点击FILE HISTORY 一个commit时,正常来说显示器会自动将点击的提交版本和它上一个提交版本进行比较,如果单纯这么理解的话就错了,因为GitLens的File …

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL源码分析

一、环境介绍 RK3588主板搭载Android12操作系统,内核是Linux5.10,使用ST的六轴传感器LSM6DSR芯片。 二、芯片介绍 LSM6DSR是一款加速度和角速度(陀螺仪)六轴传感器,还内置了一个温度传感器。该芯片可以选择I2C,SPI通讯,还有可编程终端,可以后置摄像头等设备,功能是很…

第二证券:为什么a股放开做空机制?

对于很多一般出资者来说,做空股票是一件十分复杂和困难的工作,可是对于专业的出资者和组织来说,这供给了一个愈加自由的商场买卖环境。那么,为什么A股放开做空机制呢?我们从多个视点来分析: 视点一&#x…

合宙Air724UG LuatOS-Air LVGL API控件--容器 (Container)

容器 (Container) 容器是 lvgl 相当重要的一个控件了,可以设置布局,容器的大小也会自动进行调整,利用容器可以创建出自适应成都很高的界面布局。 代码示例 – 创建容器 cont lvgl.cont_create(lvgl.scr_act(), nil) lvgl.obj_set_auto_re…

图文版:以太网二层接口类型(含配套习题)

常见的以太网二层接口类型包括以下三种: 一、Access接口 access链路类型端口,一种交换机的主干道模式,2台交换机的2个端口之间是否能够建立干道连接,取决于这2个端口模式的组合。 Access端口在收到以太网帧后打开VLAN标签&#…

前端(十七)——gitee上开源一个移动端礼盒商城项目(前端+后台)

🤗博主:小猫娃来啦 🤗文章核心:gitee上开源一个移动端礼盒商城项目 文章目录 前言开源地址项目运行命令项目基本展示前端效果细节展示视频前端代码细节展示视频后台效果展示后台代码展示经典优势思维导图实现思路 前言 项目样式老…