使用 Visualforce 开发 Salesforce 应用程序

开发人员可以使用 Visualforce 向 Salesforce 扩展和添加新功能 移动应用程序。 使用 Visualforce 进行 Salesforce 开发,您可以访问 Salesforce 数据 并创建在 Lightning 平台上运行的集成体验。您可以创建 在桌面和移动设备之间共享的 Visualforce 页面,或 移动应用程序独有。

注意

Lightning 不支持 Visualforce 页面和自定义 iframe 在 iPad Safari 上体验。

通过针对 Salesforce 进行开发,您可以灵活地使用流程和工具 自定义您的应用程序。例如,您可以使用 Salesforce Lightning 设计系统来 创建符合以下原则、设计语言和最佳实践的应用 闪电体验。或者将 JavaScript 工具和第三方框架合并到 创建交互式用户体验。

在本节中,我们将介绍在 Salesforce 移动应用程序和最佳实践,用于创建功能强大、复杂的应用程序。

Salesforce 平台开发流程

用于在 Lightning Experience 和 Salesforce 移动应用程序中进行开发的流程 都是一样的。如果您习惯于针对 Salesforce Classic 进行开发,则 Lightning Experience 和 Salesforce 移动应用程序有一些差异,但其中大部分是 你很熟悉。

为 Salesforce 移动应用程序创建 Visualforce 页面时,请务必进行设置 正确的工具和测试环境。在本节中,我们将介绍最好的 Salesforce 移动平台开发流程的实践。

设置开发系统

Salesforce 提供了几种不同的工具和方法来编写、编辑和查看您的 法典。

选择编辑器

首先设置用于编写代码的工具。开发人员控制台、Salesforce Visual Studio Code 的扩展和安装程序编辑器在针对 Salesforce 应用程序、Lightning Experience 和 Salesforce Classic。唯一的例外是 Visualforce 开发模式页脚,仅在 Salesforce Classic 中可用。

查看 Visualforce 页面

在 Salesforce Classic 中,您可以使用 https:// yourInstance.salesforce.com/apex/PageName URL 查看页面 模式。此方法不适用于在 Lightning Experience 中查看 Salesforce 应用程序页面。 因为您使用直接 URL 访问查看的页面始终显示在 Salesforce Classic 中。

要在 Lightning Experience 中查看您的页面,请转到 https:// yourInstance.salesforce.com/lightning。这 访问特定 Visualforce 页面的最简单方法是为其创建一个选项卡,然后导航 通过应用程序启动器中的“所有项目”部分添加到该选项卡。

对于更长期的方法,请创建一个“开发中”应用,并添加和删除您的 Visualforce 在您工作时会切换到它。

  1. 在“设置”中,在“快速查找”框中输入, ,然后选择应用程序管理器Apps
  2. 单击“新建 Lightning 应用程序”,然后为您的页面创建自定义应用程序 正在开发中。注意请考虑将应用限制为仅系统管理员或配置文件 您已为组织中的开发人员创建。
  3. 在“设置”中,输入“快速查找”框,然后选择“应用菜单”。App Menu
  4. 确保“开发中”应用设置为“在应用中可见” 发射。
  5. 在“设置”中,在“快速查找”框中输入, ,然后选择选项卡Tabs
  6. 单击“Visualforce 选项卡”部分中的“新建”,然后创建自定义 选项卡,以获取当前正在开发的页面。使选项卡仅对开发用户可见 配置文件,然后仅将选项卡添加到“开发中”应用。
  7. 对要添加到“开发中”应用的每个页面重复上述步骤。

您还可以将以下书签添加到浏览器的菜单或工具栏以进行导航 直接进入您的页面。此 JavaScript 触发 Lightning Experience 事件,相当于在 经典 /apex/PageName URL。navigateToURL

javascript:(function(){ 
  var pageName = prompt('Visualforce page name:'); 
  $A.get("e.force:navigateToURL").setParams(
    {"url": "/apex/" + pageName}).fire();})();

开发过程和测试的重要性

在将 Visualforce 页面部署到生产环境之前,对其进行测试非常重要。测试 跨不同环境、设备和用户的页面。

如果您正在开发需要支持各种可能性的功能, 测试计划应考虑在以下方面进行测试的需要:

  • 每个不同的受支持设备。
  • 每个不同的受支持操作系统。
  • 每个不同的受支持浏览器,包括 Salesforce 移动应用程序,它嵌入了 有。
  • 每个不同的受支持用户界面上下文(Lightning Experience、Salesforce Classic、 和 Salesforce 移动应用程序)。

正常使用不支持在模拟器中运行 Salesforce 移动应用程序。我们了解 设备仿真器很方便。但它们不能替代对你的全面测试 组织支持的移动设备上的自定义应用和页面。在开发过程中, 定期在要部署的每个设备和平台上测试应用。

在 Salesforce 移动应用程序中测试 Visualforce 页面

如果您要创建将在 Lightning Experience、Salesforce Classic 中使用的页面、 和 Salesforce 移动应用程序,在您处理页面时查看所有环境中的页面。 要进行全面测试,请使用多个浏览器甚至多个设备来查看您的页面。你会 还希望能够访问至少一个额外的测试用户。

下面是如何设置开发环境的示例。

主要开发环境

在此环境中,您可以在安装程序中对组织进行更改,例如添加 自定义对象和字段,以及编写实际代码的位置(如果您使用 Developer) 安慰。在此环境中,查看页面在 Salesforce Classic 中的设计和行为。

  • 浏览器:
  • 用户:开发人员用户
  • 用户界面设置:Salesforce 经典

Lightning Experience 审查环境

在此环境中,您可以在 Lightning 中检查页面的设计和行为 经验。

  • 浏览器:Safari 或 Firefox
  • 用户:测试用户Your test user
  • 用户界面设置:闪电体验

Salesforce App Review 环境

此环境用于在 Salesforce 移动版中检查页面的设计和行为 应用程序。

  • 设备:iOS 或 Android 手机或平板电脑
  • 浏览器:Salesforce 应用程序
  • 用户:测试用户Your test user
  • 用户界面设置:Lightning Experience 或 Salesforce Classic

了解 Salesforce 移动应用程序容器

在 Salesforce Classic 中,Visualforce “拥有”页面, 请求和环境。Visualforce 是应用程序容器。但是在Salesforce中 移动应用程序和 Lightning Experience,Visualforce 在较大的 /lightning 容器内的 iframe 内运行。

注意

Salesforce 移动应用程序和 Lightning Experience 容器是否相同?是的,也不是。双 Salesforce 移动应用程序和 Lightning Experience 容器是 /lightning 容器的分支,为一个容器编写的代码可在另一个容器中使用。 但是容器的幕后工作方式略有不同。Salesforce 移动版 应用程序在移动设备的移动浏览器中运行,而 Lightning Experience 应用程序在 标准桌面浏览器中的桌面计算机。我们优化了发送到每个上下文的 /lightning 版本,以及 它运行的也足够不同,足以引起注意。简而言之,将它们视为不同的容器 具有几乎相似的功能。

外部容器和内部 iframe

外部 Salesforce 应用程序容器是通过 /lightning URL 访问的单页应用程序。加载 /lightning 页面,启动其代码,然后 应用程序代码接管环境。

Visualforce 页面在 HTML iframe 中运行,这实质上是一个单独的浏览器 主 /lightning 浏览内容中的窗口。

Salesforce 应用程序是父上下文,Visualforce 页面是子上下文。那 意味着 Visualforce 页面在 /lightning 外部容器的约束下工作,同时仍与 iframe。

Visualforce for Salesforce 应用程序代码注意事项

如果可能,请创建无论用户界面如何都能正常运行的 Visualforce 页面 上下文。通常,您为 Salesforce Classic 编写的 Visualforce 代码在 Salesforce 移动应用程序。但是,在某些情况下,需要对 由于容器,适用于移动设备的 Visualforce 页面。

安全注意事项

可能受影响的安全元素包括:

  • 会话维护和续订
  • 认证
  • 跨域请求
  • 嵌入限制

特别是,请注意会话维护,或管理浏览器使用的令牌 为每个请求输入用户名和密码的位置。您经常需要访问 当前会话使用全局变量 $Api.Session_ID。$Api.Session_ID 返回不同的值,具体取决于 请求,并且 Salesforce 移动应用程序和 Visualforce 页面从不同的域提供。 由于 Visualforce iframe 内部的会话 ID 与外部的会话 ID 不同, 在 Salesforce 移动应用程序容器中,这可能会更改您管理会话 ID 的方式。

范围注意事项

以下范围元素可能需要调整:

  • DOM 访问和修改
  • JavaScript 范围、可见性和访问权限
  • JavaScript 全局变量,例如window.location

简而言之,Visualforce 页面中的 JavaScript 代码只能影响 iframe 的浏览器上下文,而不是父上下文。

Salesforce 移动应用程序容器中要避免的功能

Salesforce 移动应用程序容器可防止选定数量的 Visualforce 组件 在 Salesforce 移动应用程序中按预期运行。

  • 避免在 Visualforce 页面上使用 在 Salesforce 移动应用程序容器中。仅当您真正了解 iframe 时才使用此标记 以及它们如何影响 DOM 和 JavaScript。<apex:iframe>
  • 避免使用 或 等元素来访问父浏览器上下文,因为 Visualforce 和 Salesforce 移动应用程序由不同的域提供服务。contentWindowwindow.parent
  • 避免直接设置,因为 Visualforce iframe 无法直接访问 .window.locationwindow.location
  • 避免使用硬编码的 URL 来访问使用静态模式构建的 Salesforce 资源,例如 link = ‘/’ + accountId + ‘/e’。相反,在 Visualforce 标记中,请使用 ,在 JavaScript 中,请使用 .{!URLFOR($Action.Contact.Edit, recordId)}navigateToSObject(recordId)

告诉我更多:Visualforce 页面可以在哪些方面发挥作用 显示在 Salesforce 移动应用程序中

创建 Visualforce 页面时,可以从以下几个位置访问该页面 在用户界面中的位置。

  • 默认导航菜单,称为“仅限移动设备”,在以下情况下可用 您点击Salesforce 移动应用程序导航菜单图标屏幕底部的导航栏
  • 操作栏和操作菜单 – 可从任何页面的顶部使用 支持操作

您还可以引用并链接到 Visualforce 标记使用带有 sforce.one 对象的导航中列出的导航调用。请务必 选择可用于 Lightning Experience、Experience Builder 站点和 多页面流程中所有页面的移动应用程序。

如果引用的页面没有“可用于 Lightning” 体验、Experience Builder 站点和所选的移动应用程序,它不会阻止显示引用页面或父页面。 但是,当用户尝试访问未启用移动设备的页面时,他们会收到一个 “不支持的页面”错误消息。

准则和最佳实践

在 Salesforce 移动应用程序中,Visualforce 页面不会自动适合移动设备。这 标准 Salesforce 标题和侧边栏被禁用,取而代之的是移动控件,并且 JavaScript API 可用于使 Visualforce 页面能够与移动设备连接 导航管理。在其他方面,页面保持原样,尽管可以在 应用程序,以桌面为中心的 Visualforce 页面将感觉以桌面为中心。

幸运的是,让您的应用程序在 Salesforce 移动应用程序中看起来很棒很简单。你 可以修改您的代码,以便您的页面在完整的 Salesforce 站点和 移动应用程序,或者您可以创建特定于移动设备的页面。

注意

Lightning 不支持 Visualforce 页面和自定义 iframe 在 iPad Safari 上体验。在本章中,你将了解如何执行以下操作的最佳实践:

  • 在移动设备和桌面设备之间共享 Visualforce 页面。
  • 从移动设备或桌面设备中排除 Visualforce。
  • 为您的 Visualforce 页面选择最佳架构。
  • 为您的页面选择有效的页面布局。
  • 管理用户输入和导航。
  • 使用 Visualforce 页面作为自定义操作。
  • 调整页面以获得最佳性能。
  • 在移动版和桌面
    版之间共享 Visualforce 页面 修订显示在 Salesforce 移动应用程序和完整 Salesforce 站点中的 Visualforce 页面,以支持这两种环境。这包括用作自定义操作的 Visualforce 页面和添加到标准页面布局的 Visualforce 页面。
  • 从移动版或桌面
    版中排除 Visualforce 页面 要将 Visualforce 页面添加到 Salesforce 移动应用程序或整个 Salesforce 站点,请使用选项卡和导航设置。
  • 创建在移动和桌面
    上工作的 Visualforce 页面 通过编写适应其运行环境的代码,创建在 Salesforce 移动应用程序和整个 Salesforce 站点中都能正常运行的 Visualforce 页面。
  • 在 Salesforce 移动应用程序
    中为 Visualforce 页面选择架构 有几种方法可以设计和构建 Visualforce 页面,每种方法在开发时间、所需的开发人员技能以及您希望自定义功能与 Salesforce 移动应用程序匹配的程度方面都有不同的权衡。
  • 在 Salesforce 移动应用程序
    中优化 Visualforce 页面的性能 Visualforce 旨在为开发人员提供与标准 Salesforce 页面的功能、行为和性能相匹配的能力。如果您的用户遇到延迟、意外行为或其他专门围绕 Visualforce 的问题,您可以采取一些措施来改善他们的体验,还可以改进编码。在 Salesforce 移动应用程序中,遵循优化的最佳实践非常重要。移动设备的计算资源更加有限,用户希望应用程序速度更快、响应迅速。
  • Salesforce 移动应用程序中应避免的 Visualforce 组件和功能
    大多数核心 Visualforce 组件(命名空间中的组件)在 Salesforce 移动应用程序中正常运行。不幸的是,这并不意味着它们针对移动设备进行了优化,或者每个功能都适用于该应用程序。您可以通过遵循一些简单的规则来改善 Visualforce 页面的移动用户体验。apex
  • 已知的 Visualforce Mobile 问题 Salesforce 发布已知问题
    以增强信任并支持客户成功。
  • 在 Salesforce 移动应用程序中使用 Visualforce 的注意事项和限制 Visualforce 允许开发人员构建复杂的自定义用户界面,这些用户界面可以本地托管在 Lightning 平台上。
    Visualforce 是 Salesforce 久经考验的模型,使开发人员能够访问数据以及强大的工具和功能。在 Salesforce 移动应用程序中使用 Visualforce 有很多好处,但也有一些限制。
  • 针对 Salesforce 应用程序中的 Visualforce 页面问题准备支持请求 Salesforce 提供资源来帮助开发人员找到问题的答案并解决问题。
    我们建议您首先查看开发人员论坛、Salesforce Stack Exchange 和已知问题页面,看看您是否可以立即找到问题的解决方案。如果您的问题仍未得到解答,您可以向 Salesforce 的支持团队提交案例,该团队会将您的问题发送给最合适的人来回答。
  • 选择有效的页面布局 通过使用适合页面使用上下文的页面布局
    ,设计在 Salesforce 移动应用程序中看起来不错且运行良好的 Visualforce 页面。添加为主导航选项卡或操作栏中的自定义操作的页面几乎可以使用设备的全屏,并且可以垂直滚动,而添加到对象页面布局的 Visusalforce 必须适合特定的有限空间。
  • 用户输入和交互
    使用 、 属性和传递 HTML 属性创建适合移动设备的表单和用户界面,这些表单和用户界面高效且利用本机移动浏览器功能。<apex:input>type
  • 管理导航
    Salesforce 移动应用程序使用事件管理导航。导航事件框架以 JavaScript 对象的形式提供,该对象提供了许多实用函数,使创建“正常工作”的编程导航变得轻而易举。其优点是导航体验对于移动环境来说更自然。它还使 Salesforce 开发人员可以更轻松地创建完成后导航,例如在成功提交订单后重定向到订单页面。
  • Salesforce Lightning Design System 简介 Salesforce Lightning Design System
    (SLDS) 可帮助您构建具有 Lightning Experience 外观的应用程序,而无需编写任何一行 CSS。SLDS 是一个 CSS 框架,可让您访问我们的开发人员用于创建 Lightning Experience 的图标、调色板和字体。
  • 将 Visualforce 页面用作自定义操作 如果您的 Visualforce 页面用作自定义操作,请将其设计为对标准控制器提供的单个记录执行操作
    ,或查找并执行记录,或记录检索到的自定义控制器代码。
  • Visualforce 页面的性能调整 性能是移动 Visualforce 页面
    的一个重要方面。Visualforce 具有缓存机制,可帮助您调整页面的性能。

在移动设备和桌面设备之间共享 Visualforce 页面

修改 Salesforce 移动应用程序中显示的 Visualforce 页面和完整版 Salesforce 站点支持这两种环境。这包括用作自定义的 Visualforce 页面 操作和 Visualforce 页面已添加到标准页面布局中。

需要在两种环境中工作的 Visualforce 页面包括:

  • 用作自定义操作的页面。自定义操作显示在 Salesforce 的操作栏中 移动应用程序,以及完整 Salesforce 站点的发布者菜单中。
  • 当可用于 Lightning Experience 时,添加到正常页面布局的页面, Experience Builder 站点,并且已为页面启用移动应用程序。
  • 添加到正常页面布局的自定义 Visualforce 按钮或链接。
  • 标准按钮覆盖 Visualforce 页面,用于新建、编辑、查看、删除和 克隆操作。应用中不支持重写标准列表和选项卡控件。按钮 覆盖不会出现在应用程序中,除非可用于 Lightning Experience, Experience Builder 站点,并且已为页面启用移动应用程序。注意被 Visualforce 页面覆盖的标准按钮将从记录中消失 应用程序中的详细信息页面和记录列表(如果可用于 Lightning) 未选择体验、Experience Builder 站点和移动应用程序 覆盖相应按钮的 Visualforce 页面。

注意

Lightning 不支持 Visualforce 页面和自定义 iframe 在 iPad Safari 上体验。

从移动设备或桌面设备中排除 Visualforce 页面

将 Visualforce 页面添加到 Salesforce 移动应用程序或整个 Salesforce 站点,使用选项卡和导航设置。

可配置为仅限桌面或仅限移动设备的 Visualforce 页面包括:

  • 当可用于 Lightning Experience 时,添加到正常页面布局的页面, Experience Builder 站点,并且该页面的移动应用程序已禁用。仅这些 显示在完整的 Salesforce 站点中。
  • Visualforce 选项卡中使用的页面。将选项卡添加到移动导航中与添加选项卡是分开的 到完整的 Salesforce 站点导航。

创建适用于移动设备和 桌面

创建在 Salesforce 移动应用程序和 通过编写适应其运行环境的代码来完整 Salesforce 站点。

Salesforce 移动应用程序提供了一个用于处理各种导航控件的框架 和事件。当 Visualforce 页面在 完整的 Salesforce 站点,因为对象 仅注入到应用程序内的页面上。这意味着,对于共享的页面 Salesforce 移动应用程序和完整的 Salesforce 站点,您需要编写以下代码: 在对象可用时使用它,并且 标准 Visualforce 导航,如果不是。sforcesforce例如,下面是在 JavaScript 远程处理请求之后运行的一些 JavaScript 从创建快速订单的方法成功返回。此代码来自用作 自定义操作,将其添加到 Salesforce 移动应用程序中的操作栏,然后 完整 Salesforce 站点中的发布者菜单。它需要在这两个地方工作。意图 的代码是导航到订单所在帐户的详细信息页面 放置:

@RemoteAction

// Go back to the Account detail page
if( (typeof sforce != 'undefined') && sforce && (!!sforce.one) ) {
    // Salesforce app navigation
    sforce.one.navigateToSObject(aId);
}
else {
    // Set the window's URL using a Visualforce expression
    window.location.href = 
        '{!URLFOR($Action.Account.View, account.Id)}';
}

该语句检查对象是否可用和可用。这只是 如果页面在应用内运行,则为 true。如果可用,则使用移动导航管理系统进行 到帐户的详细信息页面。ifsforcesforce

如果对象不可用,请尝试 使用它导航到任何地方会导致 JavaScript 错误,并且没有导航。所以 相反,该代码使用 Visualforce 表达式设置窗口的 URL,该表达式返回 帐户详细信息页面的 URL。您不想在应用程序中执行此操作,因为 框架将丢失导航事件,但在正常情况下是必需的 视觉力。sforce

注意

最佳做法是将此类常见测试分解到他们自己的帮助程序中 功能。您可以向 JavaScript 静态资源添加如下内容: 然后直接打电话 您的 if 条件。然后,如果检测逻辑发生变化,只需在 一 地方。ForceUI.isSalesforce1()

(function(myContext){
    myContext.ForceUI = myContext.ForceUI || {};

    myContext.ForceUI.isSalesforce1 = function() {
        return((typeof sforce != 'undefined') && sforce && (!!sforce.one));
    }
})(this);

在 Salesforce Mobile 中为 Visualforce 页面选择架构 应用程序

有几种方法可以设计和构建 Visualforce 页面,每种方法都有不同的 在开发时间、所需的开发人员技能以及您的彻底程度方面进行权衡 希望您的自定义功能与 Salesforce 移动应用程序相匹配。对页面结构使用以下方法之一:

  • 标准 Visualforce 页面
  • 混合 Visualforce 和 HTML
  • JavaScript 远程处理和静态 HTML
  • 标准 Visualforce 页面 普通 Visualforce 页面
    在移动浏览器上呈现良好,可以按原样使用,与移动优化的网页相比,用户体验略有降低。页面的显示方式与在完整 Salesforce 站点上的显示方式相同,在视觉上与其他 Salesforce 应用程序功能不匹配。
  • 混合 Visualforce 和 HTML 将表单元素和输出文本的 Visualforce 标记与页面结构的静态 HTML
    相结合,以创建更适合移动设备的页面,使其更接近 Salesforce 移动应用程序的视觉设计。对于仅限移动设备的页面,您可以快速转换现有的 Visualforce 页面,但这不适用于同时在 Salesforce 移动应用程序和整个 Salesforce 站点中使用的页面。
  • JavaScript 远程处理和静态 HTML 将 JavaScript 远程处理和静态 HTML
    相结合,以提供最佳的用户体验,并提供与 Salesforce 移动应用程序匹配的最佳性能和用户界面。此体系结构避免了大多数 Visualforce 标记,而是在 JavaScript 中呈现页面元素。此选项需要最多的开发人员专业知识,并且设置时间可能比标准 Visualforce 或混合 Visualforce 和 HTML 要长一些。使用 Salesforce Mobile Pack 快速入门,并使用最新的移动 Web 应用程序技术。

标准 Visualforce 页面

普通的 Visualforce 页面在移动浏览器上呈现良好,可以按原样使用,使用 与移动优化网页相比,用户体验略有降低。页面显示为 它们将出现在完整的 Salesforce 站点上,并且在视觉上与其他 Salesforce 应用程序不匹配 特征。

局限性

用户体验的局限性包括:

  • 点击目标(按钮、链接、表单域等)针对鼠标进行了优化 光标,并且很难用指尖准确击中。
  • 视觉设计保持不变,可能不适合针对移动设备优化的现代视觉效果 Salesforce 移动应用程序的设计。

如果开发时间线过于紧迫,可能会发现这些限制 可以接受。

标准 Visualforce 页面示例

以下代码提供了标准 Visualforce 页面的示例,该页面允许用户 编辑仓库记录。编辑功能由标准控制器提供,用于 对象。

<apex:page standardController="Warehouse__c">

<apex:form>

  <apex:pageBlock title="{! warehouse__c.Name }">

    <apex:pageBlockSection title="Warehouse Details" columns="1">
      <apex:inputField value="{! warehouse__c.Street_Address__c }"/>
      <apex:inputField value="{! warehouse__c.City__c }"/>
      <apex:inputField value="{! warehouse__c.Phone__c }"/>
    </apex:pageBlockSection>
        
    <apex:pageBlockButtons location="bottom">
      <apex:commandButton action="{! quickSave }" value="Save"/>
    </apex:pageBlockButtons>
    
  </apex:pageBlock>

</apex:form>

</apex:page>

这 页面可以在 Salesforce 移动应用程序和完整的 Salesforce 站点中使用。它显示 作为两种上下文中的标准桌面 Visualforce 页面。

混合 Visualforce 和 HTML

将表单元素的 Visualforce 标签和输出文本与页面的静态 HTML 相结合 结构来创建更适合移动设备的页面,这些页面更接近 Salesforce 移动应用程序。对于仅限移动设备的页面,您可以快速转换现有的 Visualforce 页面,但这不适用于同时用于 Salesforce 移动应用程序和完整的 Salesforce 站点。

以这种方式设计的 Visualforce 页面仍然是“标准”的 Visualforce,在 他们使用标准请求-响应周期,标准控制器功能,用于表单字段, POSTBACK 和视图状态等。与创作页面的主要区别 完整的 Salesforce 站点是减少或消除对 Visualforce 标签的使用添加 结构,以支持静态 HTML。也就是说,用 、 、 等替换 、 、 等。<apex:inputField><apex:pageBlock><apex:pageBlockSection><div><p><span>

这种方法还需要创建 CSS 样式表来管理 页面元素,而不是使用内置的、自动应用的样式,当 您使用 Visualforce 组件。虽然这可能需要一些时间,但它可以让您做很多事情 更接近 Salesforce 移动应用程序的视觉设计。这也意味着 以这种方式设计的页面在视觉上与整个 Salesforce 站点匹配。

将此方法应用于 Visualforce 页面

要使用此方法创建要在 Salesforce 移动应用程序中使用的页面,请按照 一般规则很少。

  • 请勿使用以下 Visualforce 标记:
    • <apex:pageBlock>
    • <apex:pageBlockButtons>
    • <apex:pageBlockSection>
    • <apex:pageBlockSectionItem>
    • <apex:pageBlockTable>
  • 将 、 或 和 用于表单。<apex:form><apex:inputField><apex:input><apex:outputLabel>
  • 使用或 Visualforce 对于不可编辑的文本。<apex:outputText>
  • 使用首选的 HTML 来构造页面的结构:、、、、等。<div><span><h1><p>
  • 使用 CSS 样式来应用您喜欢的视觉设计。

优点和局限性

这种方法的优点包括:

  • 相当快的开发时间,并且您使用普通的 Visualforce 开发工具和流程。
  • 重新利用现有页面相当容易。
  • 您可以更紧密地匹配 Salesforce 移动应用程序的外观。

要记住的一些限制:

  • 这种方法使通常的 Visualforce 请求往返,具有更大的 数据有效负载,与使用 JavaScript 远程处理的完全移动优化方法相比。
  • 添加自动替换样式的 CSS 样式是一项额外的工作 添加者 和 相关组件。<apex:pageBlock>

混合 Visualforce 和 HTML 页面的示例

以下代码示例显示了一个混合的 HTML 和 Visualforce 页面,该页面允许用户 编辑仓库记录。编辑功能由标准控制器提供 对于 对象。

<apex:page standardController="Warehouse__c">

<style>
    html, body, p { font-family: sans-serif; }
</style>

<apex:form >

    <h1>{!Warehouse__c.Name}</h1>

    <h2>Warehouse Details</h2>

    <div id="theForm">
        <div>
            <apex:outputLabel for="address" value="Street Address"/>
            <apex:inputField id="address" 
                value="{! warehouse__c.Street_Address__c}"/>
        </div>
        <div>
            <apex:outputLabel for="city" value="City"/>
            <apex:inputField id="city" 
                value="{! warehouse__c.City__c}"/>
        </div>
        <div>
            <apex:outputLabel for="phone" value="Phone"/>
            <apex:inputField id="phone" 
                value="{! warehouse__c.Phone__c}"/>
        </div>
    </div>

    <div id="formControls">
        <apex:commandButton action="{!quickSave}" value="Save"/>
    </div>

</apex:form>

</apex:page>

这 页面可以在 Salesforce 移动应用程序和完整的 Salesforce 站点中使用。它 在整个 Salesforce 站点上显示为标准页面,但没有完整的 表单的 Salesforce 样式。在 Salesforce 移动应用程序中,它大致显示 与 Salesforce 移动应用程序的视觉风格相匹配。使用其他样式,页面 可以近似两个版本的视觉样式。

JavaScript 远程处理和静态 HTML

将 JavaScript 远程处理和静态 HTML 相结合,以提供最佳的用户体验,同时 与 Salesforce 移动应用程序相匹配的最佳性能和用户界面。这 架构避免了大多数 Visualforce 标记,而是在 JavaScript 中呈现页面元素。 此选项需要最多的开发人员专业知识,并且可能需要更长的时间来设置。 比标准 Visualforce 或混合 Visualforce 和 HTML。将 Salesforce Mobile Pack 用于 快速起步,并使用最新的移动 Web 应用程序技术。

重要

在可能的情况下,我们更改了非包容性条款,以符合我们的 平等的公司价值观。我们保留了某些条款,以避免对 客户实施。

以这种方式设计的 Visualforce 页面避开了许多自动、简化的功能 标准 Visualforce,有利于对请求-响应周期进行更多控制, 并使用 JavaScript 而不是页面重新加载来执行页面更新。这可以 大幅提高页面的性能,尤其是在较低的带宽上, 更高延迟的无线网络连接,使移动设备变得如此移动。 缺点是要编写的代码更多,并且您需要 JavaScript 方面的专业知识, JavaScript 远程处理、HTML5、您的移动工具包和 CSS,以及 Apex 和 视觉力。缺点的优点是,您正在使用最新、最 用于移动开发的高级工具,以及您可以构建的页面是最好的,大多数 “管理单元”自定义功能的完整方式,该功能与 应用程序。

您可以使用此方法构建桌面 Visualforce 页面以及 Salesforce 移动应用程序。甚至可以在两者之间共享此类页面 环境,尽管要紧密匹配 完整的 Salesforce 网站外观。最重要的是,你设计的页面可以完全 响应迅速,适应各种设备和外形规格。

将此方法应用于 Visualforce 页面

要使用此方法为 Salesforce 移动应用程序创建页面,请按照以下步骤操作 一般流程:

  1. 将您首选的 Salesforce Mobile Pack(在 Salesforce 上提供)作为静态资源安装到您的组织中。
  2. 将页面的 docType 设置为 。 强烈建议禁用标准样式表和标头。例如:html-5.0<apex:page standardController="Warehouse__c" extensions="WarehouseEditor" showHeader="false" standardStylesheets="false" docType="html-5.0">
  3. 将所选移动工具包中的脚本和样式添加到页面中 Visualforce 资源标记。为 例:<apex:includeScript value="{!URLFOR( $Resource.Mobile_Design_Templates, 'Mobile-Design-Templates-master/common/js/ jQuery2.0.2.min.js' )}"/>
  4. 使用 HTML5 和移动工具包的标签和属性创建页面 骨架。
  5. 将 JavaScript 函数作为处理程序添加到页面以响应用户交互。 使用 JavaScript 远程处理可以 调用 Apex 方法 检索记录、执行 DML 等。@RemoteAction
  6. 添加其他 JavaScript 函数以处理用户操作和页面更新。 通过在 JavaScript 中构造 HTML 元素来执行页面更新,然后 将它们添加或附加到页面骨架中。

JavaScript 远程处理和静态 HTML 页面的示例

以下代码示例显示了一个远程处理 + HTML Visualforce 页面,该页面允许用户 编辑仓库记录。编辑功能由控制器扩展提供 使用响应 JavaScript 远程处理 请求。

@RemoteAction

<apex:page standardController="Warehouse__c" extensions="WarehouseEditor"
    showHeader="false" standardStylesheets="false"
    docType="html-5.0" applyHtmlTag="false" applyBodyTag="false">

    <!-- Include Mobile Toolkit styles and JavaScript -->
    <apex:stylesheet 
      value="{!URLFOR($Resource.Mobile_Design_Templates,
      'Mobile-Design-Templates-master/common/css/app.min.css')}"/>
    <apex:includeScript 
      value="{!URLFOR($Resource.Mobile_Design_Templates,
      'Mobile-Design-Templates-master/common/js/jQuery2.0.2.min.js')}"/>
    <apex:includeScript 
      value="{!URLFOR($Resource.Mobile_Design_Templates,
      'Mobile-Design-Templates-master/common/js/jquery.touchwipe.min.js')}"/>
    <apex:includeScript 
      value="{!URLFOR($Resource.Mobile_Design_Templates,
      'Mobile-Design-Templates-master/common/js/main.min.js')}"/>

<head>
<style>
    html, body, p { font-family: sans-serif; }
    input { display: block; }
</style>

<script>
    $(document).ready(function(){
        // Load the record
        loadWarehouse();
    });

    // Utility; parse out parameter by name from URL query string
    $.urlParam = function(name){
        var results = new RegExp('[\\?&]' + name + '=([^&#]*)')
            .exec(window.location.href);
        return results[1] || 0;
    }

    function loadWarehouse() {
        // Get the record Id from the GET query string
        warehouseId = $.urlParam('id');

        // Call the remote action to retrieve the record data
        Visualforce.remoting.Manager.invokeAction(
            '{!$RemoteAction.WarehouseEditor.getWarehouse}',
            warehouseId,
            function(result, event){;
                if(event.status){
                    console.log(warehouseId);
                    $('#warehouse_name').text(result.Name);
                    $('#warehouse_address').val(
                      result.Street_Address__c);
                    $('#warehouse_city').val(result.City__c);
                    $('#warehouse_phone').val(result.Phone__c);
                } else if (event.type === 'exception'){
                    console.log(result);
                } else {
                    // unexpected problem...
                }
        });
    }

    function updateWarehouse() {
        // Get the record Id from the GET query string
        warehouseId = $.urlParam('id');

        // Call the remote action to save the record data
        Visualforce.remoting.Manager.invokeAction(
            '{!$RemoteAction.WarehouseEditor.setWarehouse}',
            warehouseId, $('#warehouse_address').val(),
                $('#warehouse_city').val(), 
                $('#warehouse_phone').val(),
            function(result, event){;
                if(event.status){
                    console.log(warehouseId);
                    $('#action_status').text('Record updated.');
                } else if (event.type === 'exception'){
                    console.log(result);
                    $('#action_status').text(
                      'Problem saving record.');
                } else {
                    // unexpected problem...
                }
        });
    }

</script>
</head>

<body>

<div id="detailPage">
    <div class="list-view-header" id="warehouse_name"></div>
    <div id="action_status"></div>

    <section>
        <div class="content">
            <h3>Warehouse Details</h3>
            <div class="form-control-group">
                <div class="form-control form-control-text">
                    <label for="warehouse_address">
                        Street Address</label>
                    <input type="text" id="warehouse_address" />
                </div>
                <div class="form-control form-control-text">
                    <label for="warehouse_city">City</label>
                    <input type="text" id="warehouse_city" />
                </div>
                <div class="form-control form-control-text">
                    <label for="warehouse_phone">Phone</label>
                    <input type="text" id="warehouse_phone" />
                </div>
            </div>
        </div>
    </section>

    <section class="data-capture-buttons one-buttons">
        <div class="content">
            <section class="data-capture-buttons one-buttons">
                <a href="#" id="updateWarehouse"
                    onClick="updateWarehouse();">save</a>
            </section>
        </div>
    </section>
</div> <!-- end detail page -->

</body>

</apex:page>

这 静态 HTML 提供页面的 shell,包括空表单字段。JavaScript的 函数加载记录,填写表单字段,并发送回更新的表单数据 到 Salesforce。

虽然此页面可以在完整的 Salesforce 站点中使用,但它被设计为 Salesforce 应用程序页面,看起来与普通的 Visualforce 页面有很大不同。

JavaScript 远程处理和静态 HTML 控制器的示例

与创建移动页面的其他两种方法不同,远程处理 + HTML 方法不使用标准控制器功能从中检索数据 并将数据保存到 Salesforce。相反,您可以创建控制器扩展或自定义 控制器,用于添加任何方法 您的页面需要。下面是一个简化的控制器扩展,支持 以上 页。

@RemoteAction

global with sharing class WarehouseEditor {

    // Stub controller
    // We're only using RemoteActions, so this never runs
    public WarehouseEditor(ApexPages.StandardController ctl){ }

    @RemoteAction
    global static Warehouse__c getWarehouse(String warehouseId) {

        // Clean up the Id parameter, in case there are spaces
        warehouseId = warehouseId.trim();

        // Simple SOQL query to get the warehouse data we need
        Warehouse__c wh = [
            SELECT Id, Name, Street_Address__c, City__c, Phone__c
            FROM Warehouse__c
            WHERE Id = :warehouseId];

        return(wh);
    }

    @RemoteAction
    global static Boolean setWarehouse(
        String whId, String street, String city, String phone) {

        // Get the warehouse record for the Id
        Warehouse__c wh = WarehouseEditor.getWarehouse(whId);

        // Update fields
        // Note that we're not validating / sanitizing, for simplicity
        wh.Street_Address__c = street.trim();
        wh.City__c = city.trim();
        wh.Phone__c = phone.trim();

        // Save the updated record
        // This should be wrapped in an exception handler
        update wh;

        return true;
    }
}

在 Salesforce 中优化 Visualforce 页面的性能 移动应用

Visualforce 旨在为开发人员提供匹配 标准 Salesforce 页面的功能、行为和性能。如果您的用户体验 延迟、意外行为或其他专门围绕 Visualforce 的问题,有几个 您可以采取的措施不仅可以改善他们的体验,还可以改进编码。 在 Salesforce 移动应用程序中,遵循优化的最佳实践非常重要。移动 设备的计算资源更加有限,用户期望快速、响应迅速 应用。

有关更多指南,请参阅 Visualforce 性能:最佳实践指南。

视觉力

  • 请勿使用 或 ,这会增加页面的视图状态 大小。视图状态是维护 Visualforce 页面状态的加密数据。它已发送 在每个页面请求中来回切换,从而增加请求和响应的大小。大 视图状态会减慢页面的响应时间。<apex:form><apex:inputField>
  • 用于将必要的数据发送到 呈现页面时的浏览器。此过程可缩短页面加载时间。<apex:repeat>
  • 设置为 为 Visualforce 页面启用缓存。<apex:page cache=”true” expires=”600″>

CSS 和 JavaScript

  • 创建单页应用程序 (SPA) 而不是多页应用程序。考虑使用 用于构建 SPA 的 JavaScript 和第三方框架。
  • 使用压缩器缩小 CSS 和 JavaScript 代码。
  • 避免使用影响页面性能的 CSS 技术,例如投影或渐变。
  • 将语句移到 Visualforce 页面。通过在结束标记之前加载脚本,页面可以先下载其他组件并呈现页面 逐步。<script></body>

图像

  • 使用更少和更小的图像。
  • 压缩所有图像。
  • 使用 PNG 或 JPG 图像,而不是 GIF。
  • 使用 CSS 精灵而不是图像。

一般最佳实践

  • 使用延迟加载。延迟加载是一种首先加载页面关键功能的技术,并且 稍后或用户需要信息时剩余数据。
  • 使用无限滚动。无限滚动是一种加载其他页面内容的技术 仅当用户接近内容末尾时。

Salesforce 中应避免的 Visualforce 组件和功能 移动应用

大多数核心 Visualforce 组件(命名空间中的组件)在 Salesforce 中正常运行 移动应用程序。不幸的是,这并不意味着它们针对移动设备进行了优化,或者每个 功能适用于应用程序。您可以改善 Visualforce 的移动用户体验 页面遵循一些简单的规则。

apex

通常,避免使用结构组件(如子组件)以及其他模仿 Salesforce 外观,例如 .如果必须使用这些组件,请将它们设置为 一列,使用 ,而不是默认的两列。<apex:pageBlock><apex:pageBlockTable><apex:pageBlockSection columns=”1″>

避免使用较宽的非包装组件,尤其是 、 、 和 ,它们都不受支持。保持设备宽度 使用 创建表时要注意。<apex:detail><apex:enhancedList><apex:listViews><apex:relatedList><apex:dataTable>

避免使用 .内嵌 编辑是一种用户界面模式,适用于基于鼠标的桌面应用,但 在基于触摸的设备上很难使用,尤其是在屏幕所在的手机上 小。<apex:inlineEditSupport>

对字段使用是可以的 显示为基本输入字段,如文本、电子邮件和电话号码,但避免 将其用于使用输入小组件的字段类型,例如日期和查阅表格字段。<apex:inputField>

不要使用 . Salesforce 移动应用程序中的任何位置都不支持 sControls。<apex:scontrol>

通过设置 on 的 PDF 呈现不支持 中的页面 Salesforce 移动应用程序。renderAs=”PDF”<apex:page>

  • 不支持的 Visualforce 组件 以下是 Salesforce 移动应用程序不支持的 Visualforce 组件列表,这些组件
    不应在与 Salesforce 移动应用程序一起使用的 Visualforce 页面中使用。

不支持的 Visualforce 组件

以下是 Salesforce 移动版不支持的 Visualforce 组件列表 应用程序,并且不应用于将与 Salesforce 移动版一起使用的 Visualforce 页面 应用程序。

  • <analytics:reportChart>
  • <apex:detail>
  • <apex:emailPublisher>
  • <apex:enhancedList>
  • <apex:flash>
  • <apex:inputField>对于使用 用于输入的小部件,而不是基本的表单字段
  • <apex:listViews>
  • <apex:logCallPublisher>
  • <apex:relatedList>
  • <apex:scontrol>
  • <apex:sectionHeader>
  • <apex:selectList>对于选择列表字段
  • <apex:tabPanel>(因此,<apex:tab>)
  • <apex:vote>

警告

嵌入的 Visualforce 页面,即添加到页面的页面 布局 – 包含组件可能会导致 Salesforce 移动应用程序在 iOS 上崩溃。<apex:enhancedList>

命名空间外的标准组件,用于 示例、 、 等在应用中不受支持。apex<liveagent:*><chatter:*>

自定义组件可以在应用程序中的 Visualforce 中使用,只要它们本身不使用 不支持的组件。