一、前言
不同行业的企业会有特殊的业务场景,比如某些制造业的企业的工厂是物理隔离的,但工程师需要拿着平板输入很多生产数据;某些煤炭和矿业企业,在实际的工作区都是比较偏远,信号比较差,但是又需要用手机打开应用输入信息,等等这些业务场景需要都需要一个离线的应用来支持。
二、需求分析
首先,我们来看一下有哪些类型的离线应用。
从上图我们可以看出,支持离线应用的有PWA,Hybrid,Native共三种。
其中Hybrid套壳移动应用,支持原生功能+复用Web资源,但是开发比较复杂,本次将不会介绍。PWA开发的应用无需依赖应用市场,体积小、加载快,提供部分独立应用能力的网页应用,但是离线功能基于所使用的浏览器,比如苹果的Safari不支持离线缓存能力,Chrome支持离线缓存,但是基于PWA的应用能力受限于浏览器,比如无法获得手机上每天运动的步数,心率等数据。所以本文会重点介绍通过移动原生开发的离线应用。移动原生应用具有更好更快用户体验,更好集成移动设备的各种功能。
三、安装安卓Studio测试
下载路径:
Download Android Studio & App Tools - Android Developers
首先下载Android studio安装包,如果只是测试移动原生的基本功能和调试,可以使用推荐的APP-Make it Native,但是如果需要测试离线功能和自定义移动原生组件则需要安装此工具来测试。Make it Native只支持标准原生组件的测试,且无法测试离线功能。
基本是一直点Next直到安装完成,网上有很多安装教程,这里就不介绍具体的安装细节了。安装成功点击finish,等待启动。
继续点击Next安装,直到打开如下界面。
点击More Actions,然后选择Virtual Device Manager。
运行设备
把开发出的离线应用生成APK文件,然后拖入到打开的手机端安装。构建原生应用程序(iOS 上的 IPA 和 Android 上的 APK)。可以参考文档Building, Testing, and Distributing Apps | Mendix Documentation
打开安装的应用
输入本地的IP地址,然后启动
然后我们的移动应用就启动了,在测试移动原生应用的时候需要同步启动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操作来完成。在这种模式下,所有更改提交到离线优先数据库的对象都会同步。有关自上次同步以来删除的对象的信息也会发送到服务器。
2.1.3 选择性同步
选择性同步能通过纳流内的Synchronize操作来完成。在这种模式下,一组特定的对象将被同步。 已删除的对象无法使用选择性同步进行同步。同时也可以通过微流里的Synchronize to device来把对应的数据从服务器同步到设备里。
2.2 同步阶段
同步过程包括两个阶段。在上传阶段,您的应用程序使用提交的新对象或更改的对象更新服务器数据库。在下载阶段,您的应用使用服务器数据库中的数据更新其本地数据库。请注意,同步仅适用于数据库级别。这意味着新的未提交对象和属性更改不会同步。
2.2.1 上传阶段
上传阶段执行以下操作:
- 由于只能通过提交或删除对象来修改本地数据库,因此此类对象可以是离线优先时创建的新对象,也可以是先前从服务器同步的现有对象。上传阶段检测自上次同步以来哪些对象已提交到本地数据库。检测逻辑因同步类型而异。对于Synchronize all ,检查本地数据库中所有提交的对象。对于Synchronize objects ,检查所选对象列表中的所有已提交对象。
- 自上次同步以来,可能有从设备数据库中删除的对象。上传阶段检查哪些对象已被删除。
- 如果有任何更改或新的文件对象,它们的内容将上传到服务器并临时存储在那里。每个文件都在单独的网络请求中上传。如果文件上传失败,整个同步将中止,而不会对服务器或设备数据库造成任何更改。
- 所有更改的和新的对象都发送到服务器,文件的内容链接到对象。服务器执行对象的引用完整性验证。对象被提交到服务器数据库。有关已删除对象的信息也会发送到服务器,因此服务器也可以从其数据库中删除它们。此步骤在单个网络请求中执行。
- 任何在这些对象上配置的提交前或提交后或删除前或删除后事件处理程序都将照常在服务器上运行:在数据上传之后和设备数据库更新之前。这意味着您在事件处理程序中对同步对象所做的任何进一步更改都将在下载阶段应用到设备数据库。此规则有一个例外:当您尝试在事件处理程序中更改文件实体的内容时,不会应用更改文件实体的内容。新对象的提交前和提交后事件处理程序也将被执行。
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在您的离线优先配置文件中无法检测到的实体(因为它仅在代码中使用),您可以使用可自定义的同步来包含此类实体。
同时我们在最新版本10.2发布的内容中可以看到,新增了online同步模式,这样我们就可以更灵活地决定哪些实体可以用于离线,哪些实体必须在在线情况下才能使用。
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的项目,来测试离线应用吧。
五、参考资料
- 离线功能介绍Offline-First Data | Mendix Documentation
- 构建测试发布原生应用Building, Testing, and Distributing Apps | Mendix Documentation
关于Mendix公司
在一个数字化先行的世界中,客户希望自己的每一项需求都得到满足,员工希望使用更好的工具来完成工作,而企业意识到自己只有通过全面数字化转型才能生存并取得成功。Mendix公司,a Siemens business正在迅速成为企业数字化转型的推动者。其业内领先的低代码平台和全方位的生态系统整合最先进的技术,帮助企业创造出提高互动性、简化操作和克服IT瓶颈的解决方案。Mendix公司以抽象化、自动化、云和协作为四大支柱,大幅提升开发者的生产力,并且依靠自己的工程协作能力和直观的可视化界面,帮助大量不熟悉技术的“公民”开发者在他们所擅长的领域创建应用程序。Mendix公司是权威行业分析师眼中的领导者和远见者,也是一个云原生、开放、可扩展、敏捷和饱经考验的平台。从人工智能和增强现实,到智能自动化和原生移动,Mendix公司已成为数字化先行企业的骨干。Mendix公司企业低代码平台已被全球4000多家领先的公司采用。