---
title: "移动应用中用户函数的开发与调试"
date: "2021-03-17"
categories: 
  - "apps"
  - "mobile-development"
  - "tools"
tags: 
  - "app-design"
  - "app-development"
  - "debugging"
  - "mobile-development-tools"
description: 探索用户函数在移动应用开发中的作用，重点关注如何在Altova MobileTogether的框架下进行本地化和调试，以实现高效的编码。
---
Status: #blog

Tags:  #app-design #app-development #debugging #mobile-development-tools

Categories: [low-code+no-code](/blog/zh/category/low-codeno-code.md) | [mobile-development](/blog/zh/category/mobile-development.md) 
# 移动应用中用户函数的开发与调试

最近，我在一位资深开发人员对同事代码的评审中看到这样一条注释：“对用户函数进行了轻微修改，使其在非英语语言环境下也能正常工作。” 这条评论让我感到惊讶——代码就是代码，开发者或最终用户使用的语言不应该产生任何影响！ 用户函数本质上只是一个表达式，它可以接受输入参数并返回结果。

Altova MobileTogether 支持在移动设备上实现各种用户功能 [跨平台移动应用开发框架](https://www.altova.com/zh/mobiletogether) 该系统结合了拖放式用户界面设计和标准化的函数式编程，用于数据选择和处理。 许多 MobileTogether 演示应用程序高度依赖于用户自定义函数，而 MobileTogether Designer 包含许多功能，可以极大地帮助用户创建和验证这些自定义函数。

让我们通过研究一个示例应用程序，来了解一下移动应用程序中的用户功能。

![](/blog/images/mt_darktheme_blog_3.jpg)

<!--more-->

在之前的文章中，我们曾以“包裹配送”应用程序为例，来说明移动应用开发中一些[高级编程技术](https://www.altova.com/blog/programming-techniques-for-mobile-development/)。 “包裹配送”是一个由经验丰富的开发者精心打造的应用，它高度依赖于用户自定义的功能。

“包裹配送”示例是一个真实世界包裹配送应用的完整模拟。用户扮演一家配送公司的司机，负责根据GPS导航，将包裹从新泽西州的仓库运送到纽约市的各个目的地。您可以在MobileTogether Designer的模拟器窗口中运行该应用，以观察逼真的移动轨迹，了解其向每个目的地的移动过程。如果您从MobileTogether演示服务器上在自己的手机上运行“包裹配送”应用，您的手机将使用其内置的GPS功能。

以下是两个驾驶员分配页面，分别展示了在iPhone的深色模式和Android手机的浅色模式下的显示效果：

[![](/blog/images/mobile-screens-1.png)](mobile-screens-1.png)

运行时执行的用户函数会生成送货任务列表以及地图上的标记。 我们可以通过 MobileTogether Designer 中的 XPath 表达式构建器窗口查看这些函数的定义：

[![移动应用程序中用户功能的定义](/blog/images/function-definitions.png)](function-definitions.png)

您在上文选择的“构建器”选项，提供了辅助功能，包括弹出式窗口显示与上下文相关的 XPath/XQuery 结构说明，以及在创建表达式时自动补全功能。而“评估器”选项则为您提供表达式结果的预览，以便您可以在需要时验证或修改表达式。

当应用程序在 MobileTogether 模拟器中运行时，XPath 评估器可以访问页面源代码的所有运行时值。 我们可以打开 XPath 评估器，在模拟器中评估移动应用程序中的用户函数：

[![在 MobileTogether 模拟器中执行用户函数](/blog/images/simulator-1-1.png)](simulator-1-1.png)

`RemainingDestinations()` 函数返回一个列表，其中包含了每个目的地的属性信息，这些信息会填充在待办事项页面下方的文本列表中。

`DestinationMarkerList()` 用户函数会调用 `RemainingDestinations()` 函数，并创建一个地图标记列表，用于在地图上标记每个目的地的位置

[![执行名为 "DestinationMarkerList" 的函数](/blog/images/simulator-2a.png)](simulator-2a.png)

当用户点击地图上的标记点时，该目的地的文字描述和标题就会显示出来

[![用户自定义函数生成的地图标记和标签文本](/blog/images/map1-1.png)](map1-1.png)

`DestinationMarkerList()` 函数是地图控件的一个属性

[![将用户自定义函数设置为地图的属性](/blog/images/properties-1-2.png)](properties-1-2.png)

项目菜单中包含一个选项，可以生成一个列表，列出应用程序中所有用户函数的使用情况

[![列出移动应用程序中用户函数的用法](/blog/images/listing-1.png)](listing-1.png)

为了更详细地了解用户函数的评估过程，您可以在模拟过程中进入调试模式，并逐步观察函数评估的每个步骤：

[![在 MobileTogether 调试器中，逐步骤执行用户自定义函数](/blog/images/debug-1-1.png)](debug-1-1.png)

在应用程序运行过程中，用户会模拟每一次配送，并记录每个包裹的收件人和损坏情况。一个“配送总结”页面会显示结果：

[![用于在送货报告中显示地图标记的用户功能](/blog/images/simuator-rpt.png)](simuator-rpt.png)

在这张地图上，标记点根据颜色进行区分，并且弹出窗口中的文字描述了每个订单的状态。对于上面高亮的订单，Joan Jones是替代收件人，因此标记点是橙色的，而不是绿色的。用户函数 ReportMarkerList() 从数据树中提取了订单摘要信息，并根据实际收件人与收件地址是否一致来改变标记点的颜色。

我们唯一能确定交付过程并非完全成功的方式，就是通过相关的文本信息。而正是通过这些信息，我们解开了代码审查评论的谜团！因为这段文本是英文，所以代码审查人员修改了一个用户函数，使其能够在任何语言环境下正常工作。

MobileTogether 提供了本地化功能，可以在运行时轻松解析各种语言的消息文本。

包裹配送应用程序支持英语、德语、西班牙语、日语或法语等多种语言版本，具体取决于操作系统所使用的语言。如图所示，本地化对话框的上方部分显示了一个表格，其中包含了页面标题、标签、按钮等固定文本的翻译。

[![本地化对话框会在运行时为确定的文本字符串分配名称](/blog/images/localization.png)](localization.png)

下部分定义了一个运行时翻译表，该表根据程序执行过程中出现的条件进行设置。MobileTogether 包含一个内置函数 mt-load-string('名称')，该函数可以通过指定的名称引用字符串，而与设备的语言设置无关。

以下图片展示了 `ReportMarkerList()` 函数的定义，该函数用于设置送货报告地图上标记的颜色和弹出文本。如果送货操作的文本与名为 "delivered_C" 的字符串匹配，则该标记将显示为绿色。英文中的 "delivered_C" 文本是“Personally accepted delivery”（亲自接受的送货）。如果使用西班牙语，则该文本将是“Entrega aceptada en persona”（亲自接受的送货）

[![确保移动应用中用户函数的语法正确，使其在所有语言环境下都能正常工作](/blog/images/simulator-rpt2.png)](simulator-rpt2.png)

如果开发者只是简单地将“DeliverySummary”与英文字符串“Personally accepted delivery”进行比较，那么在其他语言环境下，地图上的标记颜色就无法正确显示。

我们可以在 MobileTogether 模拟器中，针对 ReportMarkerText() 用户函数在各种语言下的行为进行验证。主项目菜单中提供了一个选项，用于在其他语言下运行应用程序：

[![选择一种仿真语言，用于验证本地化结果](/blog/images/language-menu-es.png)](language-menu-es.png)

我们可以用西班牙语运行该应用程序，并模拟一系列配送流程，从而生成一份西班牙语的配送报告。每个标记点的颜色会根据配送概要中每个条目的操作文本进行正确设置。

[![运行模拟器以查看用户函数的结果，结果以西班牙语显示](/blog/images/spanish-color-map-1.png)](spanish-color-map-1.png)

运用您所有的技能和工具，包括高级编程技术，例如在移动应用中使用用户自定义函数，以在极短时间内构建您自己的应用程序！ 了解更多关于我们的 MobileTogether 产品 [视频演示](https://www.altova.com/zh/mobiletogether/demos#video_Demos), 更多 [示例应用程序](https://www.altova.com/zh/mobiletogether/demos), 或者，甚至是…… [在线手册](https://www.altova.com/manual/MobileTogether/mobiletogetherdesigner/) 如果您想深入了解所有相关信息，当您准备好开始构建自己的跨平台移动应用程序时， [下载 MobileTogether 设计器](https://www.altova.com/zh/mobiletogether/download).
