画布开发(9)Salesforce App中的Canvas

学习目标

完成本单元后,您将能够了解到:

  • 设置Canvas应用程序位置并将其添加到导航菜单
  • Salesforce App上下文注意事项
  • Salesforce App Access注意事项
  • Salesforce App自定义图标
  • 适用于Canvas应用程序的Salesforce App导航方法

Canvas使您可以在Salesforce应用程序中公开您的画布应用程序。 Salesforce应用程序是随时随地的Salesforce。这款企业级移动应用程序可让您实时访问在办公室中看到的相同信息,但它可以帮助您在离开办公桌时完成工作。就像在完整的Salesforce站点中一样,用户可以访问发布者和Chatter订阅源项,包括Canvas应用。

开发人员可以在Salesforce应用中使用画布应用来:

  • 将画布应用程序公开为动作。图标表示画布应用程序。您可以使用默认拼图图标或上传相关操作的自定义图标。
  • 从Salesforce中的画布应用程序或Chatter API发布到Feed。
  • 在Salesforce应用程序内的Feed项目中显示画布应用程序。图标表示画布应用程序。您可以使用默认拼图图标或在Feed项中提供缩略图URL来显示自定义图标。
  • 在导航菜单中添加画布应用程序作为选项。图标表示画布应用程序。您可以使用默认拼图图标或在画布应用程序的连接应用程序设置中提供自定义图标URL。

注意:Canvas应用程序不会出现在Salesforce for Android的应用程序导航菜单中。要在导航菜单中查看画布应用程序,请登录Salesforce移动Web。

例如,您可能拥有仓库员工用于处理移动设备上的订单的画布应用程序。您可以创建一个从设备图标访问应用程序的操作,允许员工提取客户订单列表。处理订单后,应用程序会在Salesforce中设置订单状态,并将Feed项目发布到关联的客户帐户。

用户仍然可以在台式机上的Salesforce中访问您的画布应用程序。 Salesforce提供的移动设备的附加功能不会影响或限制现有功能。

设置Canvas应用程序位置并将其添加到导航菜单

要添加要在Salesforce应用程序导航菜单中显示的画布应用程序,您必须设置位置并将其添加到移动导航。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“应用”,然后选择“Apps”。
  2. 在“已连接的应用程序”相关列表中,单击导航窗格中要提供的应用程序,然后单击“Edit”。
  3. 在“Canvas应用程序设置”部分中,选择“Canvas”。
  4. 在“位置”字段中,选择“Mobile Nav”,然后单击“Add”。
  5. 单击“Save”。
  6. 要使画布应用程序显示在导航菜单中,您必须将其添加到移动导航中。从设置中,输入导航在“快速查找”框中,选择“Salesforce Navigation”。
  7. 从可用的菜单项中,选择您的应用,然后单击“Add”。
  8. 单击“Save”。

Salesforce App上下文注意事项

在Salesforce应用程序内显示画布应用程序时,请记住这些注意事项。

在Feed或发布者中显示画布应用程序时,您收到的画布上下文(来自签名请求或来自getContext调用)包含特定于Salesforce应用程序发布者的信息。

  • 您可以通过查看环境部分中的displayLocation值来验证您是在Feed还是发布者上。对于发布者,displayLocation设置为Publisher。对于Feed,displayLocation设置为ChatterFeed。
  • 创建Canvas订阅源项时,可以将JSON字符串指定为参数的值。发送上下文时,feed项的参数字段中的任何值都将在上下文的environment部分的参数中发送。
  • 与任何画布应用程序一样,上下文包含有关应用程序维度的信息。由于Salesforce是专为移动设备设计的,因此我们为其提供的尺寸与我们为完整Salesforce网站提供的尺寸不同。
  • 要创建单指触摸滚动体验:
    1. 确保最外面的div元素包含以下属性。
      • 最小高度:250px;
      • 溢出:滚动;
      • 宽度:100%;
      • -webkit-overflow-scrolling:touch;
      • -webkit-transform:translated(0%,0px,0px);
    2. 将height属性设置为签名请求中提供的clientHeight值。例如:
      // Where sr is a parsed signed request object.
      var h = parseInt(sr.context.environment.dimensions.clientHeight, 10);
      Sfdc.canvas.byId(‘divElementId’).style.height = h;
    3. clientHeight值可能非常小,特别是在手机的横向模式下,用户可能无法看到任何内容。将min-height设置为所需的高度(以像素为单位),以确保良好的用户体验。
    4. 在导航菜单中,默认拼图图标大小为60像素乘60像素。

Salesforce App Access注意事项

修改Salesforce应用程序中显示的画布应用程序时,请记住这些注意事项。

必要时,Salesforce应用程序布局与您习惯使用的完整Salesforce站点布局不同。在创建用于Salesforce应用程序的画布应用程序时,请记住以下内容。

  • 由于画布应用程序旨在在Salesforce中显示第三方应用程序,因此设备必须能够访问画布应用程序URL。如果您的应用只能在防火墙后面访问,那么移动设备也必须位于防火墙后面。如果用户无权访问画布URL,则会收到错误 – 可能是404或500错误。
  • 当您将画布应用程序作为操作访问时,如果画布应用程序使用“您在做什么”标题,则标题将固定在页面顶部,并且画布应用程序滚动区域将位于标题文本框下方。
  • Feed中的画布应用程序链接和说明可能显示的字符数少于完整Salesforce站点中显示的字符数。
  • 根据您使用的设备,如果旋转设备,进纸屏幕可能会发生变化。如果可能,您的画布应用应支持旋转。使用orientation事件处理设备方向的更改。
  • Salesforce应用程序和完整Salesforce站点中使用的高度不同。使用签名请求中的Dimensions对象在发布者中正确呈现您的操作。
  • 在操作菜单中,可能会截断长动作标签。
  • Feed布局与完整Salesforce站点的布局不同。而不是在Feed中打开应用程序,将打开一个页面,在整个屏幕上显示画布应用程序。要返回Salesforce应用,请点按。
  • 当您查看操作栏或Feed时,将显示画布应用程序的默认Canvas拼图图标。您可以使用您提供的图像覆盖此默认操作图标。
  • 当画布应用程序在导航菜单中显示为选项时,将使用默认的Canvas拼图图标。您可以在画布应用程序的连接应用程序设置中自定义图标。
  • 当用户脱机访问Salesforce时,Canvas应用程序不可用。

Salesforce应用程序自定义图标

自定义图标有助于区分Salesforce应用中的应用。如果您没有自定义应用程序的图标,您将获得默认的拼图图标。

您可以自定义Salesforce导航菜单中使用的图标。您可以在画布应用程序的连接应用程序设置的“基本信息”部分的“图标URL”条目中设置此图标。在“设置”中,在“快速查找”框中输入“应用”,然后选择“应用”并单击“编辑”以连接应用。图标URL必须是指向图标图像文件的安全HTTPS URL。图像文件必须是GIF,JPG或PNG文件格式。对于Salesforce导航菜单,图标不能大于60像素高,60像素宽。

Salesforce导航菜单中使用的自定义图标也用于Chatter选项卡和Canvas App Previewer。如果您的画布应用程序将显示在导航菜单中,我们建议您使用60×60像素大小的图标,让Salesforce自动将图标调整为Chatter选项卡和Canvas App Previewer所需的较小尺寸。

您还可以自定义画布应用程序的Salesforce操作栏和操作菜单中使用的图标。操作栏使用为访问画布应用程序的操作设置的自定义图标,而不是与连接的应用程序关联的自定义图标。您可以通过上载自定义图标的静态资源文件然后使用此静态资源作为全局操作的图标来设置操作图标。静态资源图标文件应为PNG格式,大小为120像素高,120像素宽。有关自定义操作图标的更多指南,请参阅“Salesforce App开发人员指南”中的“自定义图标指南和最佳实践”。

用于Canvas应用程序的Salesforce App导航方法

Canvas框架包含可用于在canvas应用程序和Salesforce应用程序之间平滑集成导航的方法,而无需使用Visualforce。

以前,绕过包含画布应用程序的iframe的导航限制的唯一方法是使用Visualforce页面。这些Canvas方法提供了一种更简单的替代方法,用于控制Salesforce应用程序中的画布应用程序的导航。

例如,您的画布应用程序代码可以调用Salesforce“创建记录”逻辑以导航到“Create Account”按钮所在的页面。单击该按钮会触发导航方法以转到创建页面,该页面位于画布应用程序之外。

Canvas框架中的这些方法是驻留在JavaScript库中的事件。从画布代码调用其中一种导航方法时,会向Salesforce发送一个事件,该事件将读取有效内容并将用户定向到指定的目标。

从画布应用程序调用方法与从Visualforce页面调用函数略有不同,因为这些方法通过Canvas跨域API代理到Salesforce容器。

将导航方法引用为具有名称和有效负载的事件变量。例如:

var event = {name:”s1.createRecord”, payload: {entityName: “Account”, recordTypeId: “00h300000001234”}};

下表显示了Salesforce中导航方法的名称,有效负载和用途。

FunctionDescription
back([refresh])导航到sforce.one历史记录中保存的先前状态。它相当于单击浏览器的“后退”按钮。
刷新是可选的。默认情况下,页面不刷新。如果可能,传递true以刷新页面。
navigateToSObject(recordId [, view])导航到由recordId指定的sObject记录。此记录“主页”有多个视图,Salesforce应用程序中的视图可用作用户可以在其间滑动的幻灯片。
view是可选的,默认为detail。 view指定记录主页中最初显示的幻灯片。
注意:不支持与ContentNote SObject对应的记录ID。可能的值如下。
•detail:记录详细信息幻灯片
•chatter:Chatter幻灯片
•related:相关幻灯片的视图
navigateToURL(url[, isredirect])导航到指定的URL。
支持相对和绝对URL。相对URL相对于Lightning域,并保留导航历史记录。外部URL – 即Lightning域外的URL – 在单独的浏览器窗口中打开。
注意:根据用户的设备平台,设备设置,Salesforce版本以及要打开的外部URL的身份验证要求,单独的浏览器窗口可能需要身份验证或重新身份验证。
使用相对网址导航到应用内的不同屏幕。使用外部URL允许用户访问其他站点或应用程序,他们可以在其中执行不需要在应用程序中保留的操作。要返回到您的应用,必须在用户完成其他应用时关闭由外部URL打开的单独窗口。新窗口与您的应用程序具有单独的历史记录,并且在关闭窗口时将丢弃此历史记录。这也意味着用户无法单击“后退”按钮返回到您的应用程序;用户必须关闭新窗口。
mailto:, tel:, geo:, 和其他URL方案支持启动外部应用程序并尝试“做正确的事情。”但是,支持因移动平台和设备而异。 mailto:和tel:是可靠的,但我们建议您测试一系列预期设备上的任何其他URL。
isredirect 是可选的,默认为false。将其设置为true以指示新URL应替换导航历史记录中的当前URL。
注意:在 <apex:commandButton>或任何 <button type=”submit”> or<input type=”submit”>的onClick处理程序中使用navigateToURL时要小心. 即使isredirect = true,命令按钮的默认单击操作也是表单帖子。 在此方案中,命令按钮执行表单发布和navigateToURL操作,要求用户单击后退按钮两次以导航到上一页。 要阻止默认单击操作,请将onClick处理程序配置为调用
event.preventDefault()或返回false。
注意:不支持与ContentNote SObject对应的URL。
navigateToFeed(subjectId, type)导航到指定类型的Feed,作用域为subjectId。对于某些Feed类型,subjectId是必需的但是被忽略。对于这些Feed类型,将当前用户的ID作为subjectId传递。
type是Feed类型。可能的值如下。
•BOOKMARKS:包含上下文用户保存为书签的所有Feed项。将当前用户的ID作为subjectId传递。
•COMPANY:包含除TrackedChange类型的Feed项目之外的所有Feed项目。要查看订阅源项,用户必须具有对其父项的共享访问权限。将当前用户的ID作为subjectId传递。
•文件:包含所有包含上下文用户遵循的人员或组发布的文件的源项目。将当前用户的ID作为subjectId传递。
•GROUPS:包含上下文用户拥有或属于其成员的所有组中的所有Feed项。将当前用户的ID作为subjectId传递。
•新闻:包含上下文用户遵循的所有更新,用户所属的组以及用户所关注的文件和记录。包含父级为上下文用户的记录的所有更新。包含提及上下文用户或提及上下文用户所属的组的每个提要项和注释。将当前用户的ID作为subjectId传递。
•PEOPLE:包含上下文用户遵循的所有人发布的所有Feed项。将当前用户的ID作为subjectId传递。
•RECORD:包含父级为指定记录的所有订阅源项,可以是组,用户,对象,文件或任何其他标准或自定义对象。当记录是一个组时,该提要还包含提及该组的提要项。当记录是用户时,该Feed仅包含该用户的Feed项。您可以获取其他用户的记录Feed。将记录的ID作为subjectId传递。
•TO:包含上下文用户提及的所有Feed项。包含上下文用户注释的订阅源项以及由评论的上下文用户创建的订阅源项。将当前用户的ID作为subjectId传递。
•TOPICS:包含包含指定主题的所有Feed项。将主题的ID作为subjectId传递。仅Salesforce for Mobile Web支持此值。 Salesforce for iOS或Salesforce for Android中不提供主题
navigateToFeedItemDetail( feedItemId)导航到特定的源项,feedItemId和任何关联的注释。
navigateToRelatedList( relatedListId, parentRecordId)导航到parentRecordId的相关列表。 例如,要显示Warehouse对象的相关列表,parentRecordId是Warehouse c.Id.
relatedListId是要显示的相关列表的API名称或ID。
navigateToList(listViewId
, listViewName, scope)
导航到listViewId指定的列表视图,该列表视图是要显示的列表视图的ID。
listViewName设置列表视图的标题。 它不需要匹配为列表视图保存的实际名称。 要使用保存的名称,请将listViewName设置为null。
将范围设置为视图中sObject的名称,例如“Account”或“MyObject c”。
createRecord(entityName[, recordTypeId][, defaultFieldValues])打开页面以为指定的entityName创建记录,例如“Account”或“MyObject c”。
recordTypeId是可选的,它指定创建的对象的记录类型。调用
createRecord而不提供recordTypeId可能会导致错误。
defaultFieldValues是可选的,如果提供,则预填充记录创建面板上的字段,包括面板上未显示的字段。 用户必须具有对具有预填充值的字段的创建访问权限。 保存期间由字段访问限制引起的错误不会显示错误消息。
editRecord(recordId)打开页面以编辑recordId指定的记录。

有关与Visualforce一起使用的导航方法的信息,请参阅Salesforce App Developer’s Guide。

画布开发(8)Chatter Feed中的Canvas应用程序

学习目标

完成本单元后,您将能够了解到:

  • Chatter Feed上下文注意事项
  • Chatter Feed Canvas应用访问注意事项

Canvas使您可以将画布应用程序公开为Feed项。该Feed为用户提供有关Salesforce内部发生的信息以及他们所关注的记录和组的信息。

开发人员可以在Feed中使用画布应用来:

  • 从发布者的画布应用程序或Chatter API发布到Chatter摘要。
  • 在Chatter摘要项目中显示画布应用程序。

创建画布应用程序Chatter订阅源项时,它包含缩略图图像,链接标题和说明。在Salesforce Classic中,当用户单击链接或说明时,画布应用会在Feed中打开。如果用户再次点击该链接,则内容会折叠,从而为用户提供在其Feed中工作的无缝体验。在Lightning Experience中,当用户单击链接或描述时,用户将被重定向到专用的画布应用页面。

例如,您可能有一个画布应用程序,允许用户记录他们的工作时间。您现在可以以编程方式创建一个显示画布应用程序的供稿项,该应用程序向用户显示当前记录的小时数。

此外,Feed项可以显示取决于当前用户的操作。因此,画布应用程序可以将供稿项目发布给用户的经理,经理可以批准或拒绝记录的小时数。由于内容是从canvas应用程序提供的,因此开发人员可以完全控制该行为。

Chatter Feed上下文注意事项

当您在Feed项目中显示画布应用程序时,您从签名请求或getContext()调用中收到的上下文信息包含特定于Feed的信息:

  • 位置 – 如果画布应用程序位于Feed中,则Environment.displayLocation字段包含该值ChatterFeed。
  • 参数 – 创建包含画布应用程序的订阅源项时,可以指定JSON字符串作为参数值。当canvas应用程序接收上下文时,feed项中的参数将包含在Environment.Parameters对象中。
  • Size-Environment.Dimensions对象包含有关canvas应用程序大小的信息。
    1. 画布应用高度默认为100像素。
    2. 画布应用程序宽度默认为420像素,这与Feed中画布应用程序的最大宽度相同。
    3. Feed中画布应用的最大高度为400像素。
    4. Feed中画布应用的最大宽度为420像素。
    5. 此代码段显示Feed中画布应用的默认大小值:
      “dimensions”:
      {
      “width”: “420px”,
      “height”: “100px”, “maxHeight”: “400px”, “maxWidth”: “420px”
      }
    6. Feed的固定宽度为420像素。例如,如果将画布应用的大小调整为200像素,则Feed宽度仍为420像素。
    7. 您可以使用Canvas SDK中的resize()方法将画布应用程序的值更改为maxHeight和maxWidth。

Chatter Feed Canvas应用访问注意事项

修改Feed中显示的画布应用时,请记住以下注意事项:

  • 如果删除了画布应用程序且该应用程序位于Feed项目中,则这些Feed项目将保留。如果用户访问其中一个Feed项,则会收到canvas应用程序不存在的错误。
  • 如果删除用户对画布应用程序的访问权限且该应用程序位于Feed项目中,则这些Feed项目将保留。如果用户访问其中一个Feed项,他们将收到一条错误消息,表明他们无权访问画布应用。
  • 通过发布者操作或Chatter API创建画布应用程序源项时,Salesforce会检查画布应用程序是否存在以及用户是否具有该权限。
    1. 如果画布应用程序不存在,则无法创建订阅源项并返回错误。
    2. 如果画布应用程序存在,但尝试创建订阅源项的用户无权访问画布应用程序,则会创建订阅源项。但是,用户将无法查看订阅源项并返回错误。
  • 如果画布应用程序尝试执行用户没有权限的操作,则该操作将失败,并且画布应用程序将收到错误。例如,如果应用尝试创建商品记录但用户没有商品的创建权限,则该应用将收到错误。然后,画布应用程序应将错误转发给用户。

画布开发(7)Publisher中的Canvas应用程序

学习目标

完成本单元后,您将能够了解到:

  • 设置Canvas应用程序位置并创建操作
  • 手动创建操作
  • Canvas SDK Publisher事件
  • 发布者上下文注意事项
  • Publisher Canvas App Access注意事项

Canvas使您可以将画布应用程序公开为快速操作。 发布者允许用户访问组织中最常见的操作。 您可以将发布者扩展为包含画布应用程序,以便用户可以利用画布应用程序的常见自定义操作。 然后,这些操作可以与Feed集成,并创建特定于已执行操作的Feed帖子。

开发人员可以使用发布商中的画布应用来:

  • 将Web应用程序中的内容添加到Chatter发布者中。
  • 创建一个公开画布应用程序的自定义操作。
  • 将画布应用程序直接集成到发布者生命周期中:从画布应用程序发布到Chatter摘要中,使用“共享”按钮功能,并指定发布消息的位置。

例如,您可能拥有一个用户用来记录工作时间的画布应用程序。 您可以创建一个快速操作,允许用户在发布者中打开该画布应用程序,以便他们可以在发布者中快速提交时间记录。

用户仍然可以以标准方式访问画布应用程序以获得完整功能; 但是,发布者中的画布应用程序可以快速访问应用程序的最常见功能。 用户可以选择快速操作并创建Chatter订阅源项,该项可以是文本帖子,链接帖子,甚至是画布帖子。

设置Canvas应用程序位置并创建操作

要将画布应用程序添加到发布者或操作栏,您必须设置位置并在创建画布应用程序时创建操作。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“应用”,然后选择“应用”。
  2. 在Connected Apps相关列表中,单击New。填写画布应用的基本字段。请参阅创建画布应用程序。
  3. 在Canvas App设置中,选择Canvas,然后在Locations字段中选择Publisher。您必须为画布应用选择此位置,以使其显示在完整Salesforce站点中的发布者和Salesforce应用程序的操作栏中。
  4. 选择“自动创建操作”字段。这为画布应用程序创建了一个快速操作。
  5. 隐藏发布商标题,其中包含“您在做什么?”文本,选择隐藏Publisher标题。这会在完整的Salesforce站点和Salesforce应用程序中隐藏标题。
  6. 要在完整Salesforce站点和Salesforce应用程序中隐藏用户的发布者“共享”按钮,请选择“隐藏发布者共享按钮”。仅当选择了“隐藏发布者标题”时,才会启用此复选框。

要使画布应用程序显示为操作,您必须将操作添加到全局发布者布局。请参阅Salesforce帮助中的“自定义全局发布者布局”。

手动创建操作

如果在创建画布应用程序时未选择“自动创建操作”字段,则需要手动创建操作。

  1. 从“设置”中,在“快速查找”框中输入“Actions”,然后选择“Global Actions”
  2. 单击“New Action”。
  3. 在“操作类型”字段中,选择“自定义画布”。
  4. 在“画布应用程序”字段中,选择要作为操作显示的画布应用程序。只有具有Publisher位置的画布应用才会显示在此字段中。
  5. 在“高度”字段中,输入画布应用程序的高度(以像素为单位)。
    这是画布应用在出版商中出现时的初始高度。您可以使用Canvas SDK resize()方法将高度更改为最大500像素。
  6. 在“标签”字段中,输入一个值。
    此值在用户界面中显示为快速操作标题。
  7. 在“名称”字段中,输入不带空格的唯一值。
  8. 或者,在“图标”字段中,您可以通过单击“ Change Icon”上载图标。您必须先将图标作为静态资源上传,然后才能在此处进行更改。
  9. 单击“Save”。

要使画布应用程序显示为快速操作,您必须将操作添加到全局布局。请参阅Salesforce帮助中的“自定义全局发布者布局”。

Canvas SDK Publisher事件

在发布者中公开画布应用程序时,可以使用定义良好的事件来启用画布应用程序和发布者之间的通信。

您的画布应用程序可以订阅和发布这些事件,以便与发布者框架更紧密地集成。例如,您可以激活标准Chatter共享按钮以发布Chatter摘要项。您还可以访问用户在“您在做什么”中输入的帖子文本?发布商中的字段,并将其与您应用中的内容相结合。

FieldDescription
publisher.clearPanelState在停用或隐藏画布应用程序时由发布者触发。当用户在发布者中选择其他应用程序或单击“共享”按钮后,可能会发生这种情况。 Visualforce页面也可以侦听此事件。
publisher.failure遇到错误情况时由发布者触发,例如提交无效数据时。例如:
•Feed中的文字太长
•您尝试发布到Feed的画布应用程序不存在
•画布应用程序URL无效
画布应用程序应该侦听此事件并提醒用户发生了错误并且未创建帖子。
publisher.getPayload单击“共享”按钮时由发布者触发。有效负载包含诸如输入到您正在使用的内容中的文本等信息。字段以及与之共享订阅源项的人员。
publisher.setupPanel最初加载Chatter摘要页时由发布者触发。
publisher.setPayload由画布应用程序触发,以向发布者表明发送给发布者的内容应该在订阅源项目中共享。此事件是对publisher.getPayload的响应,包含有关您尝试创建的Feed项的信息。您可以创建三种Feed项类型:
•TextPost
•LinkPost
•CanvasPost
publisher.setValidForSubmit由画布应用程序触发,向发布者表明画布应用程序已准备好提交有效负载。触发此事件后,“共享”按钮将变为活动状态。
此代码段启用“共享”按钮:
$$.client.publish(sr.client,
{name : ‘publisher.setValidForSubmit’, payload : true});
publisher.showPanel当用户在发布者中选择画布应用时,由发布者触发。此事件表示正在显示画布应用程序。 Visualforce页面也可以侦听此事件。
publisher.success单击“共享”按钮并成功提交数据后,由发布者触发。

发布者事件的顺序

以下是从画布应用程序角度看发布者事件的顺序:

  1. 画布应用程序侦听pu​​blisher.setupPanel。
  2. 画布应用程序侦听pu​​blisher.showPanel。
  3. 用户与画布应用程序交互,例如,单击按钮或输入一些文本。 canvas应用程序执行所需的任何验证,然后触发publisher.setValidForSubmit。结果,发布者然后启用“共享”按钮。
  4. 画布应用程序侦听pu​​blisher.getPayload。
  5. canvas应用程序触发publisher.setPayload。
  6. 画布应用程序侦听pu​​blisher.success。
  7. canvas应用程序侦听pu​​blisher.failure。
  8. 画布应用程序侦听pu​​blisher.clearPanelState。

发布者上下文注意事项

当您在发布者中显示画布应用程序时,您从签名请求或从
getContext()调用包含特定于发布者的信息:

  • Location – 如果画布应用程序位于发布者中,则Environment.displayLocation字段包含值Publisher。
  • Size-Environment.Dimensions对象包含有关canvas应用程序大小的信息。
    1. 画布应用高度将是您在创建的快速操作中指定的高度。
    2. 如果在创建画布应用程序时选择了“自动创建操作”,则画布应用程序高度默认为200像素。
    3. 画布应用程序宽度默认为521像素,这与发布者中画布应用程序的最大宽度相同。
    4. 发布者中画布应用的最大高度为500像素。
    5. 发布者中画布应用的最大宽度为521像素。
    6. 此代码段显示发布商中画布应用的默认大小值:
      “dimensions”:{“width”:“521px”,“height”:“200px”,“maxHeight”:“500px”,“maxWidth”:“521px”}
    7. 发布商的固定宽度为521像素。例如,如果将画布应用程序的大小调整为400像素,则发布者宽度仍为521像素。
    8. 您可以使用Canvas SDK中的resize()方法将画布应用程序的值更改为maxHeight和maxWidth。

Publisher Canvas App Access注意事项

修改发布者中显示的画布应用时,请记住以下注意事项:

  • 如果画布应用程序具有与之关联的快速操作,则无法删除画布应用程序或删除Publisher位置。 您必须先删除快速操作。
  • 如果用户无法通过配置文件或权限集访问画布应用程序,并且他们在发布者中选择了应用程序,则会收到错误消息。
  • 如果画布应用程序尝试执行用户没有权限的操作,则该操作将失败,并且画布应用程序将收到错误。 例如,如果应用尝试创建商品记录但用户没有商品的创建权限,则该应用将收到错误。 然后,画布应用程序应将错误转发给用户。

画布开发(6)页面布局或移动卡中的画布应用程序

学习目标

完成本单元后,您将能够了解到:

  • Canvas应用程序出现在页面布局中的位置
  • 将Canvas应用程序添加到页面布局

您可以将画布应用程序添加到任何标准或自定义对象的页面布局。 要在编辑页面布局时显示在选项板中的“画布应用程序”类别,必须在Salesforce应用程序中创建画布应用程序时将画布应用程序位置设置为“布局”和“移动卡”。

Canvas应用程序出现在页面布局中的位置

根据您将画布应用程序放置在页面布局上的位置,画布应用程序可能会显示在完整的Salesforce站点或Salesforce应用程序中。

此表描述了将画布应用程序添加到页面布局时显示的位置。

如果画布应用程序已添加到页面布局中…画布应用程序是否出现在完整的Salesforce站点中?画布应用程序出现在Salesforce应用程序中?画布应用程序出现在Salesforce应用程序中的位置
任何部分(移动卡部分除外)YesYesRecord detail page
Mobile Cards sectionNoYesMobile card

将Canvas应用程序添加到页面布局

按照以下步骤将画布应用程序添加到帐户的页面布局中。

  1. 按照创建应用程序中的步骤,使用Heroku快速入门创建画布应用程序。
  2. 在Salesforce应用程序中,从“设置”中,在“快速查找”框中输入应用程序,然后选择“Apps”。
  3. 在“Connected Apps”相关列表中,单击刚刚创建的应用程序旁边的“Edit ”。
  4. 在“Canvas应用程序设置”部分的“位置”字段中,选择“布局”和“移动卡”。
  5. 单击“Save”。
  6. 从帐户的对象管理设置中,转到“页面布局”。
  7. 单击“帐户布局”旁边的“Edit”
    您将在调色板和画布应用程序中看到Canvas应用程序类别,因为您将画布应用程序的位置设置为布局和移动卡。
  8. 将画布应用程序元素拖动到页面布局中显示的位置,然后单击“ Save”。
    • 如果将画布应用程序添加到“移动卡”部分以外的任何部分,则画布应用程序将显示在完整Salesforce站点的页面布局中或Salesforce应用程序的记录详细信息页面中。
    • 如果将画布应用程序添加到“移动卡”部分,则画布应用程序仅显示在移动卡中。
  9. 要查看更改,请单击“Accounts ”选项卡,然后单击一个帐户。您将在页面布局上看到添加它的画布应用程序。

您可以通过单击扳手图标来修改页面布局中画布应用的其他属性。

  • Width (in pixels or %) – 画布应用程序的宽度;默认为100%。对画布应用程序宽度的更改将显示在完整的Salesforce站点和Salesforce应用程序中。但是,画布应用程序以单列布局显示,因此我们建议您将宽度保留为100%。
  • Height (in pixels) – 画布应用的高度;默认为200像素。对于出现在完整Salesforce站点和Salesforce应用程序中的画布应用程序,用户将看到对此字段的更改。
  • Show scrollbars – 滚动条是否显示在画布应用程序iFrame上。对此字段的更改将呈现出现在完整Salesforce站点中的画布应用,但不会显示出现在Salesforce应用中的画布应用。
  • Show label – 是否显示页面布局部分标签。对于出现在完整Salesforce站点和Salesforce应用程序中的画布应用程序,用户将看到对此字段的更改。

画布开发(5)Canvas SDK

学习目标

完成本单元后,您将能够了解到:

  • Visualforce页面代码示例
  • Visualforce注意事项
  • apex:canvasApp组件
  • 在Visualforce页面和Canvas应用程序之间使用事件

除了标准的画布应用程序,Canvas还允许您在Visualforce页面上公开画布应用程序。 这意味着您可以在任何可以显示Visualforce页面的地方显示画布应用程序。

开发人员可以使用Visualforce页面:

  • 覆盖标准按钮,例如帐户的“新建”按钮或联系人的“保存”按钮
  • 覆盖选项卡概述页面,例如“帐户”选项卡主页
  • 定义自定义选项卡
  • 在详细的页面布局中嵌入组件
  • 创建仪表板组件或自定义帮助页面
  • 自定义,扩展或集成Salesforce控制台中的侧边栏(自定义控制台组件)

要在Visualforce页面上托管画布应用程序,请使用 <apex:canvasApp> 组件。

注意:Canvas框架包含的方法可用于规避包含画布应用程序的iframe的导航限制,而无需使用Visualforce页面。这些方法提供了一种简化的替代方法,用于控制Salesforce应用程序中的画布应用程序的导航。有关详细信息,请参阅第75页的“与Canvas应用程序一起使用的Salesforce App导航方法”。

Visualforce页面代码示例

您可以通过多种方式在Visualforce页面上显示画布应用程序。这些示例显示了使用applicationName,developerName和namespacePrefix引用canvas应用程序的不同方法。

对象细节页面

以下代码段是如何在“帐户”页面上显示画布应用程序的示例。该代码指定画布应用程序的大小为400像素高和750像素宽。此示例使用applicationName和namespacePrefix指定画布应用程序。

<apex:page standardController=”Account”>
<apex:canvasApp applicationName=”Test Inline Visualforce” namespacePrefix=”testorg”
height=”400px” width=”750px”/>
</apex:page>

Standard Page

以下代码段是如何在Visualforce页面上显示画布应用程序的示例。该代码指定画布应用程序的大小为1,000像素高和800像素宽。此外,代码将三个自定义参数传递给画布应用程序。此示例使用developerName和namespacePrefix指定canvas应用程序。

<apex:page>
<apex:canvasApp developerName=”Test_Standard_Visualforce” namespacePrefix=”testorg” height=”1000px” width=”800px” parameters=”{p1:’value1′,p2:’value2′,p3:’value3′}”/>
</apex:page>

带边框和滚动的标准页面

以下代码段是如何在Visualforce页面上显示具有一些其他UI增强功能的画布应用程序的示例。该代码指定画布应用程序的大小为100像素高和500像素宽。此外,代码指定画布应用程序周围应该有2个像素的边框,并且应该启用滚动。此示例仅使用applicationName指定画布应用程序(这仅在创建画布应用程序的组织中有效,并且该组织没有namespacePrefix。

<apex:page>
<apex:canvasApp applicationName=”Test Scrolling Visualforce” height=”100px” width=”500px”
border=”2″ scrolling=”yes”/>
</apex:page>

Visualforce注意事项

使用 <apex:canvasApp> component:组件时,请记住以下注意事项:

  • <apex:canvasApp> 组件仅在启用了Canvas且在版本为27.0或更高版本的Visualforce页面中可用。
  • 如果在对象详细信息布局上包含画布应用程序,则必须在页面布局中以及 <apex:canvasApp>组件中提供画布应用程序的高度。
  • Location—如果画布应用程序位于Visualforce页面中,则Environment.displayLocation字段包含该值Visualforce

apex:canvasApp Component

Use this component to display a canvas app on a Visualforce page. The table below lists the component attributes.

使用此组件在Visualforce页面上显示画布应用程序。下表列出了组件属性。
将包含非字母数字字符(如引号,撇号等)的参数作为JavaScript安全对象传递。为此,编写一个Apex类,该类使用Apex JSONGenerator类的方法来构建JSON字符串。从参数值调用Apex类:

<apex:page controller=”JSONGeneratorSample”>
<apex:canvasApp developerName=”mycanvas” parameters=”{!generateJSON}” />
</apex:page>

或者,您也可以使用JSENCODE函数来转义字符串:

<apex:page standardController=”Account”>
<apex:canvasApp developerName=”mycanvas” parameters=”{!JSENCODE(Account.Description)}”/>
</apex:page>

AttributeTypeDescription
applicationNameString画布应用程序的名称。 applicationName或
developerName是必需的。
borderString画布应用程序边框的宽度(以像素为单位)。如果未指定,则默认为0像素。
canvasIdString画布应用程序窗口的唯一ID。将事件定位到画布应用程序时使用此属性。
containerIdString呈现画布应用程序的HTML元素的ID。如果未指定,则默认为null。此属性指定的容器不能出现在 <apex:canvasApp> 组件之后。这些代码示例显示了 <div> 容器和containerId属性的有效用法:
<apex:page>
<div id=”container1″></div>
<apex:canvasApp applicationName=”myApp” containerId=”container1″/>
</apex:page>
<apex:page>
<div id=”container1″>
<apex:canvasApp applicationName=”myApp” containerId=”container1″/>
</div>
</apex:page>
此代码示例显示 <div>容器和containerId属性的无效用法:
<apex:page>
<apex:canvasApp applicationName=”myApp” containerId=”container1″/>
<div id=”container1″>
</div>
</apex:page>
developerNameString画布应用程序的内部名称。 通过创建连接的应用程序公开画布应用程序时,可以在“API名称”字段中指定此值。 developerName或applicationName都是必需的。
entityFieldsString当组件出现在放置在对象上的Visualforce页面上时,指定签名请求Record对象中返回的字段。 如果未指定此属性或为空,则仅返回Id字段。 有效的属性值包括:
•以逗号分隔的字段名称列表。 例如,要返回“帐户电话”和“传真”字段,该属性将如下所示:entityFields =“Phone,Fax”
•星号“*”返回关联对象的所有字段。
heightStringCanvas应用程序窗口高度,以像素为单位。 如果未指定,则默认为900像素。
idString允许<apex:canvasApp>的唯一标识符
要由页面上的其他组件引用的组件。
maxHeightStringCanvas应用程序窗口的最大高度(以像素为单位)。默认为2000 px; ‘无限’也是一个有效的值。
maxWidthStringCanvas应用程序窗口的最大宽度(以像素为单位)。默认为1000 px; ‘无限’也是一个有效的值。
namespacePrefixString创建画布应用程序的Developer Edition组织的名称空间值。您只能在Developer Edition组织中设置命名空间,因此如果画布应用程序是在不同类型的组织中创建的,则这是可选的。如果未指定,则默认为null。
onCanvasAppErrorString如果画布应用程序无法呈现,则要调用的JavaScript函数的名称。
onCanvasAppLoadString加载画布应用程序后要调用的JavaScript函数的名称。
parametersString传递给画布应用程序的参数的对象表示。 以JSON格式或JavaScript对象文字提供。 以下是JavaScript对象文字中的参数示例:
{参数1:’VALUE1’,参数2: ‘值2’}。 如果未指定,则默认为null。
renderedBoolean指定是否在页面上呈现组件。 如果未指定,则默认为true。
scrollingString指定画布应用程序窗口是否使用滚动条。 有效值为:
auto
no
yes
如果未指定,则默认为no。 如果此属性包含无效值,则将其视为“否”以防止浏览器错误。
widthStringCanvas应用程序窗口宽度,以像素为单位。 如果未指定,则默认为800像素。

返回记录对象中的字段

当您使用 <apex:canvasApp> 组件在Visualforce页面上显示画布应用程序,并且该页面与对象关联(例如放置在页面布局上)时,您可以指定要从相关对象返回的字段。为此,请使用entityFields属性。您可以通过以下方式之一使用此属性。

返回特定对象字段

通过将entityFields属性设置为以逗号分隔的字段名称列表,可以返回Record对象中的特定对象字段。如果列表中的字段名称无效,则忽略该字段名称,并在Record对象中返回有效字段。

<apex:canvasApp applicationName=”MyApp” entityFields=”Phone,Fax,BillingCity” containerId=”canvasAppDiv”/>

返回一个如下所示的Record对象:

“record”:{
“attributes”:{ “type”:”Account”,
“url”:”/services/data/v44.0/sobjects/Account/001xx000003DGWiAAO”
}, “Id”:”001xx000003DGWiAAO”, “Phone”:”(555) 555-5555″,
“Fax”:”(555) 555-5555″,
“BillingCity”:”Seattle”
}

返回所有对象字段

您可以通过将entityFields属性设置为通配符“*”来返回Record对象中的所有对象字段。

<apex:canvasApp applicationName=”MyApp” entityFields=”*” containerId=”canvasAppDiv”/>

返回一个如下所示的Record对象:

“record”:{
“attributes”:{ “type”:”Account”,
“url”:”/services/data/v44.0/sobjects/Account/001xx000003DGWiAAO”
}, “Id”:”001xx000003DGWiAAO”,
“IsDeleted”:false, “MasterRecordId”:null, “Name”:”Edge Communications”, “Type”:”Customer – Channel”, “ParentId”:null, “BillingStreet”:”123 Main Street”, “BillingCity”:”Seattle”, “BillingState”:”WA”, “BillingPostalCode”:”98121″, “BillingCountry”:”USA”,

}

返回Id字段

如果<apex:canvasApp> 组件没有entityFields属性,或者该属性为空,则只在Record对象中返回Id字段。

<apex:canvasApp applicationName=”MyApp” containerId=”canvasAppDiv”/>

返回一个如下所示的Record对象:

“record”:{
“attributes”:{ “type”:”Account”,
“url”:”/services/data/v44.0/sobjects/Account/001xx000003DGWiAAO”
}, “Id”:”001xx000003DGWiAAO”
}

在Visualforce页面和Canvas应用程序之间使用事件

Canvas提供了一些方法,可用于在画布应用程序和父Visualforce页面之间发布和订阅事件。此过程包括从Visualforce页面发布事件,在Visualforce页面上侦听事件,从Visualforce页面上的事件取消订阅以及调整包含画布应用程序的Visualforce页面的大小。调整画布应用程序大小的过程与画布应用程序自身调整大小的过程不同,这在“调整画布应用程序大小”中有所描述。可以在SDK和此处找到这些方法的完整参考文档。

  • publish – 从画布应用程序可以订阅的Visualforce页面发布事件。请参阅从Visualforce页面发布Canvas事件。
  • resize – 由Visualforce页面用于调整画布应用程序iFrame的大小。请参阅在Visualforce页面中调整画布应用程序的大小。
  • subscribe – 由Visualforce页面用于订阅画布应用程序可能发布的事件。请参阅订阅事件。
  • unsubscribe – 由Visualforce页面用于取消订阅画布应用程序可能发布的父事件。请参阅从Visualforce页面中的事件取消订阅。

Visualforce页面需要Controller.js对象才能使用这些方法。 Visualforce页面中的脚本可能如下所示:

<script type=”text/javascript”src=”https://yourDomain.my.salesforce.com/canvas/sdk/js/30.0/controller.js”>

注意:您可以使用Lightning Platform方法在画布应用程序和Salesforce应用程序之间平滑地集成导航,而无需使用Visualforce。这些方法是驻留在Canvas框架内的JavaScript库中的事件。从画布代码调用其中一种导航方法时,会向Salesforce发送一个事件,该事件将读取有效内容并将用户定向到指定的目标。有关更多信息,请参阅“与Canvas应用程序一起使用的Salesforce App导航方法”。

从Visualforce页面发布Canvas事件

以下代码示例演示如何调用publish方法以从Visualforce页面发布myevent事件。订阅此活动的任何画布应用程序都将收到该活动。

// Target all canvas apps.
Sfdc.canvas.controller.publish({name : ‘mynamespace.myevent’,
payload : {}});

以下代码示例演示如何调用publish方法以从Visualforce页面将事件发布到指定的画布应用程序。

如果将事件发布到特定画布应用程序,即使Visualforce页面上的其他画布应用程序订阅了它,也只有指定的画布应用程序才会收到该事件。使用此代码示例,如果Visualforce页面包含画布应用程序app1,app2和app3,并且它们都订阅了myevent,则只有app1会收到该事件。

// Target a specific canvas app
// where “app1” is the canvasId specified in the canvas component.
// For example:
Sfdc.canvas.controller.publish({name : ‘mynamespace.myevent’,
payload : {},
target : {canvas : ‘app1’}});

在target参数中,您可以通过传入一组画布应用程序来指定多个画布应用程序:target:[{canvas:’app1′},{canvas:’app2′}]。

在Visualforce页面中调整Canvas应用程序的大小

以下代码示例演示如何调用resize方法以在Visualforce页面中的特定画布应用程序上显式设置高度和宽度。

// Set the height and width explicitly and target a canvas app
// Where ‘mycanvas0’ is the canvasId on the canvas component
// <apex:canvasApp canvasId=”mycanvas0″/>
var target = {canvas : “mycanvas0”};
Sfdc.canvas.controller.resize( {height : “1000px”, width : “900px”}, target);

下面的代码示例演示如何调用resize方法来设置Visualforce页面中所有画布应用程序的高度。

//Set only the height on all canvas apps
Sfdc.canvas.controller.resize( {height : “1000px”});

订阅活动

以下代码示例演示如何在Visualforce页面中调用subscribe方法以订阅从画布应用程序发布的指定事件。

// Subscribe to a single event.
Sfdc.canvas.controller.subscribe({name : ‘mynamespace.myevent0’,
onData : function (e) {}});
// Subscribe to multiple events in a single call.
Sfdc.canvas.controller.subscribe([
{name : ‘mynamespace.myevent1’, onData : function(e) {}},
{name : ‘mynamespace.myevent2’, onData : function(e) {}}
]);

取消订阅Visualforce中的事件

以下代码示例演示如何在Visualforce页面中调用unsubscribe方法以取消订阅两个事件。

画布开发(4)Canvas SDK

学习目标

完成本单元后,您将能够了解到:

  • 引用Canvas SDK
  • 验证
  • 在您的画布应用程序中获取上下文
  • 跨域XHR
  • 调整画布应用程序的大小
  • 实施Canvas应用程序事件
  • 在Canvas应用程序中使用Streaming API
  • 在Canvas应用程序中进行调试
  • 在Canvas App中使用标签

Canvas是一组工具,使您可以在Salesforce中集成您的应用程序。 此框架包含一个SDK,您可以使用该SDK对应用程序进行身份验证并从Salesforce检索数据。 Canvas SDK和代码示例可在GitHub上获得,网址为https://github.com/forcedotcom/salesforcecanvasframeworksdk。

Canvas SDK已经过版本化,并且与每个版本中的API版本相匹配。 目前的版本是44.0。
您可以通过调用version方法找到您拥有的SDK版本。 可以在以下位置找到此开发人员指南的早期版本
https://developer.salesforce.com/page/Earlier_Reference_Documentation。

引用Canvas SDK

Canvas SDK可以在GitHub上使用,您可以通过两个选项从画布应用程序中引用它。

  • 在您自己的Web服务器上托管SDK并在那里访问它
  • 访问Salesforce服务器上托管的SDK

例如,如果您在自己的Web服务器上托管SDK,那么这就是include语句的样子:

以下是引用托管SDK时include语句的外观:

如果要在Web应用程序或Visualforce页面中包含其中一个SDK文件,则在Salesforce服务器上引用SDK的功能非常有用。

Authentication

创建画布应用程序时,可以使用以下身份验证方法之一:

  • 签名请求 – 画布应用程序的默认身份验证方法。签名请求授权流程取决于您是否配置画布应用程序,以便管理员为用户提供对画布应用程序的访问权限,或者用户是否可以自行授权。如果管理员允许用户访问画布应用程序,或者用户通过批准/拒绝OAuth流程批准了画布应用程序,则会向画布应用程序提供包含使用者密钥,访问令牌和其他上下文信息的签名请求。 。
  • OAuth 2.0-Canvas应用程序可以使用OAuth 2.0协议来验证和获取访问令牌。有关OAuth和Lightning平台的更多信息,请参阅在Salesforce中深入挖掘OAuth 2.0。

签名请求身份验证

This is the default authorization method for canvas apps. The signed request authorization flow varies depending on whether the canvas app’s Permitted Users field is set to “Admin approved users are pre-authorized” or “All users may self-authorize.”

Permitted Users ValueCanvas App Accessibility当用户需要批准画布应用程序时POST or GET Behavior
管理员批准的用户已获得预授权一旦管理员在组织中安装该应用程序并配置哪些用户可以看到该应用程序,该应用程序就可供用户访问。用户无需批准或拒绝访问。NeverSalesforce对画布应用程序执行POST,其中包含签名请求正文中包含的所有授权信息,包括刷新令牌。
所有用户都可以自我授权所有用户都可以访问该应用,但会提示用户批准或拒绝访问该应用。• 用户第一次打开应用程序
• 如果管理员撤消了访问令牌
• 如果管理员为令牌设置了时间限制并且超出了时间限制
如果用户之前已批准该应用程序并且访问权限尚未被撤销或过期,则Salesforce会使用已签名的请求有效内容对画布应用程序执行POST。
如果用户尚未批准该应用程序,或者该访问权限已被撤销或过期,则Salesforce会对画布应用程序URL执行GET。画布应用程序必须通过接受调用并查找URL参数来处理GET
_sfdc_canvas_authvalue。如果画布应用程序收到此参数值,则画布应用程序应启动批准或拒绝OAuth流程。
_sfdc_canvas_authvalue = user_approval_required
启动OAuth流并且用户批准应用程序后,画布应用程序应使用参数true调用repost()方法以检索已签名的请求。

签名的请求信息可以使用客户端密钥进行验证,并用于自定义应用程序,并随后调用Salesforce。

签名请求是以下连接的元素的字符串:

  • 使用HMAC SHA-256算法加密的画布应用程序使用者密钥
  • A period (”。”)
  • Base64中编码的上下文和授权令牌JSON

签名的请求看起来与此类似,但会更长:

9Rpl6rE7R2bSNjoSfYdERk8nffmgtKQNhr5U/5eSJPI=.eyJjb250ZXh0Ijp7InVzZXIiOnsibGFuZ3V…. 签名请求注意事项:

  • Salesforce在调用画布应用程序URL时执行HTTP POST或GET,具体取决于“允许的用户”值以及是否返回刷新令牌。
  • 需要服务器端代码来验证和解码请求。
  • 您可以在调用应用程序后,使用SDK按需请求已签名的请求。

Canvas App用户流程签名请求

此图显示了使用签名请求身份验证的画布应用程序的用户流。

验证和解码签名请求

使用签名请求时,Salesforce会将用户上下文和身份验证信息传递到画布应用程序URL。要确保签名的请求有效,您必须使用特定的画布应用程序使用者密钥验证签名的请求是否已签名。如果使用了正确的消费者秘密,那么您可以信任上下文;否则,您可以假设该请求不是由Salesforce发起的。要验证和解码已签名的请求,您的应用程序应:

1.接收包含Salesforce初始签名请求的POST消息。
2.在第一个期间拆分已签名的请求。结果是两个字符串:使用使用者机密签名的散列的Based64上下文和Base64编码的上下文本身。
3.使用HMAC SHA-256算法对Base64编码的上下文进行哈希处理,并使用您的使用者密钥对其进行签名。

  1. 接收包含Salesforce初始签名请求的POST消息。
  2. 在第一个期间拆分已签名的请求。结果是两个字符串:使用使用者机密签名的散列的Based64上下文和Base64编码的上下文本身。
  3. 使用HMAC SHA-256算法对Base64编码的上下文进行哈希处理,并使用您的使用者密钥对其进行签名。
  4. Base64编码在上一步中创建的字符串。
  5. 将Base64编码的字符串与使用您在步骤2中收到的使用者密钥签名的散列Base64上下文进行比较。

如果这两个值相同,那么您就知道已签名的请求是使用您的使用者密钥签名的,并且可以信任。从那里,您可以Base64解码编码的上下文并解析出您需要的任何值。有关这些值的更多信息,请参阅CanvasRequest。如果两个字符串不同,则请求未使用您的使用者密钥进行散列和签名,您应该将相应的消息返回给用户。

验证和解码的功能

要验证已签名的请求,您可以调用Canvas SDK中的以下函数(在
SalesforceCanvasFrameworkSDK的\ src \主\ java的\帆布\ SignedRequest.java):

  • verifyAndDecode – 将已签名请求的已验证和已解码版本作为Java对象返回。
  • verifyAndDecodeAsJson – 将已签名请求的经过验证和解码的版本作为JSON格式的字符串返回。

以下代码示例演示如何使用SDK中的函数验证和解码签名请求。此代码在此期间拆分签名的请求字符串,以解析签名的秘密和Base64 JSON字符串。然后,它会加密使用HMAC SHA-256算法签名的画布应用程序使用者密钥,并将加密值与Salesforce发送给您的加密值进行比较。

如果这两个值相同,则表示上下文有效且来自Salesforce。如果这两个值不同,则请求不是来自Salesforce。

/**
*The utility method can be used to validate/verify the signed request.
*In this case, the signed request is verified that it’s from Salesforce and that
*it has not been tampered with.
*This utility class has two methods. One verifies and decodes the request
*as a Java object, the other as a JSON String.
*/
public class SignedRequest {
public static CanvasRequest verifyAndDecode(String input, String secret)
throws SecurityException {
String[] split = getParts(input);
String encodedSig = split[0];
String encodedEnvelope = split[1];
// Deserialize the JSON body.
String json_envelope = new String(new Base64(true).decode(encodedEnvelope));
ObjectMapper mapper = new ObjectMapper();
ObjectReader reader = mapper.reader(CanvasRequest.class);
CanvasRequest canvasRequest;
String algorithm;
try {
canvasRequest = reader.readValue(json_envelope); algorithm = canvasRequest.getAlgorithm() == null ?
“HMACSHA256” : canvasRequest.getAlgorithm();
} catch (IOException e) {
throw new SecurityException(String.format(“Error [%s] deserializing JSON to Object [%s]”, e.getMessage(), CanvasRequest.class.getName()), e);
}
verify(secret, algorithm, encodedEnvelope, encodedSig);
// If we got this far, then the request was not tampered with.
// Return the request as a Java object.
return canvasRequest;
}
public static String verifyAndDecodeAsJson(String input, String secret) throws SecurityException {
String[] split = getParts(input);
String encodedSig = split[0];
String encodedEnvelope = split[1];
String json_envelope = new String(new Base64(true).decode(encodedEnvelope));
ObjectMapper mapper = new ObjectMapper();
String algorithm; StringWriter writer;
TypeReference<HashMap<String,Object>> typeRef
= new TypeReference<HashMap<String, Object>>() { };
try {
HashMap<String,Object> o = mapper.readValue(json_envelope, typeRef);
writer = new StringWriter();
mapper.writeValue(writer, o);
algorithm = (String)o.get(“algorithm”);
} catch (IOException e) {
throw new SecurityException(String.format(“Error [%s] deserializing JSON to Object [%s]”, e.getMessage(),
typeRef.getClass().getName()), e);
}
verify(secret, algorithm, encodedEnvelope, encodedSig);
// If we got this far, then the request was not tampered with.
// Return the request as a JSON string.
return writer.toString();
}
private static String[] getParts(String input) {
if (input == null || input.indexOf(“.”) <= 0) {
throw new SecurityException(String.format(“Input [%s] doesn’t look like a signed request”, input));
}
String[] split = input.split(“[.]”, 2); return split;
}
private static void verify(String secret, String algorithm, String encodedEnvelope, String encodedSig )
throws SecurityException
{
if (secret == null || secret.trim().length() == 0) {
throw new IllegalArgumentException(“secret is null, did you set your environment variable CANVAS_CONSUMER_SECRET?”);
}
SecretKey hmacKey = null;
try {
byte[] key = secret.getBytes();
hmacKey = new SecretKeySpec(key, algorithm);
Mac mac = Mac.getInstance(algorithm); mac.init(hmacKey);
// Check to see if the body was tampered with.
byte[] digest = mac.doFinal(encodedEnvelope.getBytes());
byte[] decode_sig = new Base64(true).decode(encodedSig);
if (! Arrays.equals(digest, decode_sig)) {
String label = “Warning: Request was tampered with”; throw new SecurityException(label);
}
} catch (NoSuchAlgorithmException e) {
throw new SecurityException(String.format(“Problem with algorithm [%s] Error [%s]”, algorithm, e.getMessage()), e);
} catch (InvalidKeyException e) {
throw new SecurityException(String.format(“Problem with key [%s] Error [%s]”, hmacKey, e.getMessage()), e);
}
// If we got here and didn’t throw a SecurityException then all is good.
}
}

调用verifyAndDecode函数

以下代码显示了获取签名请求,然后使用verifyAndDecode函数验证和解码请求的示例。

// From a JSP or servlet.
<%@ page import=”canvas.SignedRequest” %>
<%@ page import=”java.util.Map” %>
<%
// Pull the signed request out of the request body and verify/decode it. Map<String, String[]> parameters = request.getParameterMap();
String[] signedRequest = parameters.get(“signed_request”); if (signedRequest == null) {%>
This app must be invoked via a signed request!<% return;
}
String yourConsumerSecret=System.getenv(“CANVAS_CONSUMER_SECRET”); String signedRequest = SignedRequest.verifyAndDecode(signedRequest[0],
yourConsumerSecret);
%>

// From JavaScript, you can handle the signed request as needed. var signedRequest = ‘<%=signedRequestJson%>’;

调用verifyAndDecodeAsJson函数

以下代码显示了获取签名请求,使用verifyAndDecodeAsJson函数验证和解码请求以及解析返回的JSON结果的示例。

// From a JSP or servlet.
<%@ page import=”canvas.SignedRequest” %>
<%@ page import=”java.util.Map” %>
<%
// Pull the signed request out of the request body and verify/decode it. Map<String, String[]> parameters = request.getParameterMap();
String[] signedRequest = parameters.get(“signed_request”); if (signedRequest == null) {%>
This App must be invoked via a signed request!<% return;
}
String yourConsumerSecret=System.getenv(“CANVAS_CONSUMER_SECRET”);
String signedRequestJson = SignedRequest.verifyAndDecodeAsJson(signedRequest[0], yourConsumerSecret);
%>

// From JavaScript, you can parse with your favorite JSON library. var signedRequest = JSON.parse(‘<%=signedRequestJson%>’);

请求签名请求

如果您的画布应用程序设置为使用已签名的身份验证请求,则可以使用SDK按需请求已签名的请求。您的应用可以要求Salesforce重新发送加载应用时使用的已签名请求或发送新的已签名请求。在重定向应用程序后刷新过期的会话或获取身份验证信息时,请求已签名的请求非常有用。

您可以使用SDK中的refreshSignedRequest()或repost()JavaScript方法按需请求签名请求。 refreshSignedRequest()通过回调返回一个新签名的请求,而repost()要求父窗口向您的画布应用程序发起一个新的POST,并使用刷新的签名请求重新加载应用页面。

无论何时需要刷新应用程序的签名请求,请使用这些方法。以下是一些示例方案,您可能需要刷新已签名的请求信息。

  • 签名请求中的OAuth令牌通常在两小时后过期。如果OAuth令牌已过期,并且您需要发出其他API请求,则可以调用refreshSignedRequest()以获取新的OAuth令牌,而不会中断用户。
  • Canvas应用程序可能需要使用重定向,尤其是在尝试跨多个系统提供单点登录功能时。如果您的画布应用程序使用重定向,则重定向URL将不会收到包含初始签名请求信息的原始请求正文。您可以使用新方法再次请求已签名的请求。
  • 在2014年夏季及之后,画布应用程序可以是用户认可的应用程序。如果用户未批准您的用户批准的应用,则您的应用将不会获得初始签名请求POST。相反,您的应用需要通过OAuth批准,然后您可以调用repost()来获取已签名的请求。

必须将您的画布应用程序配置为使用签名的身份验证请求才能使用这些方法。 您还需要在JavaScript代码中引用canvas-all.js,如引用Canvas SDK中所述。

请求成功后,您的画布应用程序必须验证返回的SignedRequest信息。 有关验证从Salesforce接收的已签名请求信息的详细信息,请参阅验证和解码签名请求。

Using refreshSignedRequest() to Obtain a Signed Request

使用refreshSignedRequest()通过您提供的回调请求新签名的请求。 在此示例中,使用回调调用refreshSignedRequest(),该回调检查响应代码,然后将签名的请求解析为使用使用者密钥和Base64编码的上下文本身签名的散列的Based64上下文。

// Gets a signed request on demand. Sfdc.canvas.client.refreshSignedRequest(function(data) {
if (data.status === 200) {
var signedRequest = data.payload.response; var part = signedRequest.split(‘.’)[1];
var obj = JSON.parse(Sfdc.canvas.decode(part));
}
}

Using repost() to Obtain a Signed Request

使用repost()指示父窗口向画布应用程序URL发送新的POST。 POST包含加载应用程序时使用的签名请求或新签名的请求。 与refreshSignedRequest()不同,使用repost()重新加载画布应用页面。 以下示例调用repost(),询问原始签名请求。

// Gets a signed request on demand, without refreshing the signed request. Sfdc.canvas.client.repost();

The following example calls repost(), asking for a new signed request.

// Gets a signed request on demand, first by refreshing the signed request. Sfdc.canvas.client.repost({refresh : true});

OAuth身份验证

Canvas支持OAuth 2.0进行授权。使用OAuth时,您有两种选择:

  • Web服务器OAuth身份验证流程 – 当用户运行您的画布应用程序时,他们可以授权应用程序访问其数据。这要求每个用户允许画布应用访问其信息。有关详细信息,请参阅如何使用Web服务器OAuth身份验证流程对身份验证进行身份验证?在REST API开发人员指南中。
  • 用户代理OAuth身份验证流程 – 当用户运行您的画布应用程序时,他们可以通过仅使用浏览器进行身份验证来授权应用程序访问其数据。与Web Server OAuth身份验证一样,此选项要求每个用户允许画布应用访问其信息。
    建议您在开发期间而不是在生产中使用此授权方法,因为使用此类授权不需要服务器端代码,也无需将开发计算机公开到Internet。有关详细信息,请参阅“REST API开发人员指南”中的了解用户代理OAuth身份验证流程。

无论您实施哪种OAuth流,canvas应用程序都必须提供用于启动基于标准的OAuth流的代码。 OAuth注意事项包括:

  • Salesforce在调用画布应用程序URL时执行HTTP GET。
  • 使用用户代理OAuth,可以在浏览器中执行所有授权(不需要服务器端代码)。

如果您有一个使用OAuth身份验证的现有连接应用,并且您希望将该应用作为画布应用公开,那么您有两个选择。首先,您可以编辑现有应用程序(创建新版本)并向其添加画布应用程序信息。这意味着您的应用可以继续使用相同的客户端ID和消费者密钥。第二个选项是创建一个新的画布应用程序。如果您这样做,您将获得新的客户端ID和消费者保密信息,并且您需要使用该信息更新您的应用。

Canvas App用户流 – OAuth

如果您的画布应用程序使用OAuth身份验证,则用户体验会因画布应用程序在用户界面中的位置以及如何设置用户访问权限而异。此图显示了使用OAuth身份验证的画布应用程序的用户流。

启动OAuth流程

以下代码示例显示如何使用OAuth在画布应用程序中启动授权过程。

<html>
<head>
<script type=”text/javascript” src=”/sdk/js/canvas-all.js”></script>
</head>
<body>
<script>
function loginHandler(e) { var uri;
if (! Sfdc.canvas.oauth.loggedin()) { uri = Sfdc.canvas.oauth.loginUrl(); Sfdc.canvas.oauth.login(
{uri : uri,
params: {
response_type : “token”,
client_id : “3MVG9lKcPoNINVBLigmW.8dAn4L5HwY VBzxbW5FFdzvU0re2f7o9aHJNUpY9ACdh.3SUgw5rF2nSsC9_cRqzD”, redirect_uri : encodeURIComponent(
“https://demoapp1234.herokuapp.com/sdk/callback.html”)
}});
}
else {
Sfdc.canvas.oauth.logout(); login.innerHTML = “Login”; Sfdc.canvas.byId(“oauth”).innerHTML = “”;
}
return false;
}
// Bootstrap the page once the DOM is ready. Sfdc.canvas(function() {
// On Ready…
var login = Sfdc.canvas.byId(“login”), loggedIn = Sfdc.canvas.oauth.loggedin(), token = Sfdc.canvas.oauth.token()
login.innerHTML = (loggedIn) ? “Logout” : “Login”; if (loggedIn) {
// Only displaying part of the OAuth token for better formatting. Sfdc.canvas.byId(“oauth”).innerHTML = Sfdc.canvas.oauth.token()
.substring(1,40) + “…”;
});
}
login.onclick=loginHandler;
</script>
<h1 id=”header”>Canvas OAuth App</h1>
<div>
access_token = <span id=”oauth”></span>
</div>
<div>
<a id=”login” href=”#”>Login</a><br/>
</div>
</body>
</html>

适用于Canvas应用程序的SAML单点登录

无论您是使用签名请求还是OAuth授权,都可以使用基于SAML的单点登录(SSO)为您的用户提供无缝的身份验证流程。您可以将Salesforce用作身份提供者或服务提供者。 SAML SSO使您能够通过SAML为您的用户提供自动身份验证,并通过签名请求对Salesforce进行身份验证。

SAML(安全断言标记语言)是一种基于XML的Web标准,用于在Web上进行用户身份验证,允许在两个域之间交换授权数据。使用此功能,您可以创建一个画布应用程序,该应用程序在用户打开时开始标准SAML身份验证流程。此过程完成后,用户将在Web应用程序中进行身份验证。

对于使用签名请求身份验证的画布应用程序,Canvas SDK中包含的两种方法使您的画布应用程序可以调用Salesforce以直接接收新的已签名请求,或使Salesforce能够将已签名的请求重新发布到Web应用程序端点。这导致完整的端到端身份验证流程。

refreshSignedRequest Method

通过回调返回新签名的请求。 SAML SSO流程完成后,您的应用可以调用此方法并接收新签名的请求。此方法适用于需要使用更多客户端JavaScript方法检索签名请求的开发人员。 (Canvas SDK将签名的请求发送到您的应用。)

repost Method

请求父窗口向您的画布应用程序启动POST,并使用刷新的签名请求重新加载应用程序页面。 SAML SSO流程完成后,您的应用可以调用此方法,并通过POST将新签名的请求发送到您的应用。此方法适用于希望使用更多服务器端方法检索已签名请求的开发人员。 (Salesforce将已签名的请求POST到您的服务器。)

注意:Lightning Platform社区上的画布应用程序不支持启动的SAML启动方法标识提供程序。

在您的画布应用程序中获取上下文

使用签名请求验证画布应用程序时,您将获得CanvasRequest对象(其中包含Context对象)作为画布应用程序URL的POST的一部分。如果您使用OAuth进行身份验证,或者想要调用获取上下文信息,则可以通过进行JavaScript调用来执行此操作。

以下代码示例是获取上下文的JavaScript调用示例。此代码创建一个带有文本“Get Context”的链接,然后调用Sfdc.canvas.client.ctx函数。

<script>
function callback(msg) {
if (msg.status !== 200) { alert(“Error: ” + msg.status); return;
}
alert(“Payload: “, msg.payload);
}
var ctxlink = Sfdc.canvas.byId(“ctxlink”); var client = Sfdc.canvas.oauth.client(); ctxlink.onclick=function() {
Sfdc.canvas.client.ctx(callback, client)};
}
</script>
<a id=”ctxlink” href=”#”>Get Context</a>

跨域XHR

Canvas应用程序加载在iFrame中的Salesforce页面上。因此,canvas应用程序(在其自己的域中)无法将XHR(XML HTTP请求)调用回到* .salesforce.com域。您可以开发和部署自己的代理作为SDK的一部分,但是,Canvas提供了用JavaScript编写的客户端代理。此代理使客户端XHR调用回Salesforce。

如果您使用客户端的此代理发出XHR请求,则API会将请求转发给外部iFrame,并代表您提交请求。请求完成后,SDK会使用结果调用客户端的回调函数。以下是一些如何进行XHR调用的示例:

  • 获取Chatter用户列表
  • 发布到Chatter Feed

注意:SDK支持跨域XHR调用,但不应将其用于进行同域调用。

获取Chatter用户列表

以下代码示例显示了一个返回Chatter用户列表的调用。

// Paste the signed request string into a JavaScript object for easy access. var sr = JSON.parse(‘<%=signedRequestJson%>’);
// Reference the Chatter user’s URL from Context.Links object. var chatterUsersUrl = sr.context.links.chatterUsersUrl;
// Make an XHR call back to salesforce through the supplied browser proxy. Sfdc.canvas.client.ajax(chatterUsersUrl,
{client : sr.client, success : function(data){
// Make sure the status code is OK. if (data.status === 200) {
// Alert with how many Chatter users were returned. alert(“Got back ” + data.payload.users.length +
” users”); // Returned 2 users
}
}});

发布到Chatter Feed

以下代码示例显示了将项目发布到上下文用户的Chatter摘要的调用。

var sr = JSON.parse(‘<%=signedRequestJson%>’);
// Reference the Chatter user’s URL from Context.Links object.
var url = sr.context.links.chatterFeedsUrl+”/news/”+sr.context.user.userId+”/feed-items”;
var body = {body : {messageSegments : [{type: “Text”, text: “Some Chatter Post”}]}};
Sfdc.canvas.client.ajax(url,
{client : sr.client, method: ‘POST’,
contentType: “application/json”, data: JSON.stringify(body), success : function(data) {
if (201 === data.status) { alert(“Success”);
}
}
});

调整画布应用程序的大小

Canvas提供了调整画布应用程序大小的方法。可以在SDK和此处找到这些方法的完整参考文档。

  • autogrow – 启动或停止计时器,该计时器检查画布iFrame的内容大小并调整帧。请参阅自动调整画布应用程序大小。
  • resize-通知父窗口调整画布iFrame的大小。请参阅显式调整画布应用程序大小。
  • size – 返回画布iFrame的当前大小。请参阅获取画布应用程序的大小。
  • subscribe – 订阅父事件。目前,canvas.scroll(父级)是canvas命名空间中唯一受支持的父事件。请参阅订阅父事件。

注意:要使调整大小函数与canvas应用程序一起使用,必须在与该应用程序关联的任何HTML页面的顶部声明DOCTYPE。 例如:<!DOCTYPE html>。

自动调整画布应用程序的大小

以下代码示例演示如何调用autogrow方法来调整画布应用程序的大小。 当您的内容更改大小时使用此方法,但您不确定何时。

注意:在Mozilla®Firefox®和Microsoft®InternetExplorer®中,如果内容大小减小,自动增长方法可能无法调整帧大小。 在这种情况下,您可以使用resize方法指定要将帧更改为的确切大小。

// Turn on auto grow with default settings. Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.autogrow(sr.client);
});
// Turn on auto grow with polling interval of 100ms (milliseconds). Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.autogrow(sr.client, true, 100);
});
// Turn off auto grow. Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.autogrow(sr.client, false);
});

显式调整画布应用程序的大小

以下代码示例演示如何调用resize方法来调整画布应用程序的大小。如果未指定高度和宽度参数,父窗口将尝试根据其内容确定画布应用程序的高度,然后相应地设置iFrame宽度和高度。

// Automatically determine the size. Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.resize(sr.client);
});
// Set the height and width explicitly.
Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.resize(sr.client, {height : “1000px”, width : “900px”});
});
// Set only the height. Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.resize(sr.client, {height : “1000px”});
});

获取画布应用程序的大小

以下代码示例演示如何调用size方法以获取画布应用程序的大小。 console.log函数输出帧大小,以便您在调整画布应用程序大小时可以看到大小更改。

// Get the canvas app sizes in the sizes object. var sizes = Sfdc.canvas.client.size();
console.log(“contentHeight; ” + sizes.heights.contentHeight);
console.log(“pageHeight; ” + sizes.heights.pageHeight);
console.log(“scrollTop; ” + sizes.heights.scrollTop);
console.log(“contentWidth; ” + sizes.widths.contentWidth);
console.log(“pageWidth; ” + sizes.widths.pageWidth);
console.log(“scrollLeft; ” + sizes.widths.scrollLeft);
// Resize the canvas app. Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’); Sfdc.canvas.client.autogrow(sr.client);
});

订阅父活动

以下代码示例演示如何调用subscribe方法,以便canvas应用程序可以订阅父事件。此示例处理用户在父窗口中滚动时触发的onscroll事件。

//Subscribe to the parent window onscroll event.
Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
// Capture the onScrolling event of the parent window
Sfdc.canvas.client.subscribe(sr.client,
{name : ‘canvas.scroll’, onData : function (event) {
console.log(“Parent’s contentHeight; ” + event.heights.contentHeight);
console.log(“Parent’s pageHeight; ” + event.heights.pageHeight);
console.log(“Parent’s scrollTop; ” + event.heights.scrollTop);
console.log(“Parent’s contentWidth; ” + event.widths.contentWidth);
console.log(“Parent’s pageWidth; ” + event.widths.pageWidth);
console.log(“Parent’s scrollLeft; ” + event.widths.scrollLeft);
}}
);
});

处理画布应用程序中的方向更改

通过方向事件,您可以在画布应用程序显示在移动设备上时处理方向更改。在您的画布应用程序订阅该事件后,只要父窗口触发window.orientation事件,就会触发该事件。该事件返回包含这些值的有效内容。

ValueDescription
clientHeight应用程序的高度(以像素为单位),特定于画布应用程序呈现的设备
clientWidth画布应用程序的宽度(以像素为单位),特定于画布应用程序渲染的设备
orientation包含其中一个值。
•0:横向到纵向
•90:纵向到横向
•-90:逆时针转动纵向到横向

以下代码示例显示如何订阅orientation事件。

// Capture the orientation event of the parent window.
Sfdc.canvas.client.subscribe(sr.client,
{name : ‘canvas.orientation’,
onData : function (event) {
console.log(“Parent’s orientation: ” + event.orientation + “Canvas app height: ” + event.clientHeight + “Canvas app width: ” + event. clientWidth);
}} );
});

注意:Windows手机不支持方向事件。

实现Canvas应用程序事件

事件提供了一种基于JavaScript的方式来在画布应用程序之间发送和接收事件。使用事件可在单个页面上启用多个画布应用程序之间的通信。

一种情况可能是您将两个自定义应用程序公开为画布应用程序的页面:旅行和费用应用程序以及批准应用程序。您可以创建一个事件,以便在费用报表的状态发生更改时,该事件会被引发并包含有关该费用报表的数据(采用JSON格式)。审批画布应用程序订阅该事件,并指定在引发事件时调用的函数。状态更改后,批准应用程序将接收事件并运行指定的功能。

Canvas提供了在canvas应用程序中实现自定义事件的方法。可以在SDK和此处找到这些方法的完整参考文档。

  • publish – 创建其他画布应用程序或Visualforce页面可以订阅的自定义事件。请参阅创建画布应用程序事件。
  • subscribe – 订阅父事件或自定义事件。此方法可用于订阅多个事件。请参阅订阅Canvas应用程序事件。
  • unsubscribe – 取消订阅父事件或自定义事件。此方法可用于取消订阅多个事件。请参阅取消订阅Canvas应用程序事件。

注意:subscribe和unsubscribe方法也可用于订阅单个Streaming API事件。

Canvas应用程序事件注意事项

在实现画布应用事件时,请记住以下注意事项:

  • 我们建议您在命名事件时使用命名空间,但这不是必需的。
  • 事件命名空间与Salesforce中的组织命名空间不同。但是,如果使用名称空间,我们建议您将事件名称空间与组织名称空间相同。
  • 命名空间必须是不包含句点的字符串。例如,my.name.space.statusChanged无效。具有命名空间的有效事件名称的示例是mynamespace.statusChanged。
  • 这些名称是保留的,不能用作命名空间:
    – canvas
    – chatter
    – force
    – publisher
    – salesforce
    – sfdc
  • 事件仅在同一页面上的画布应用程序之间起作用。如果Chatter选项卡上有画布应用程序,则该应用程序无法订阅Visualforce页面上画布应用程序发布的事件。
  • 您可以在订阅呼叫中订阅多个自定义事件。
  • 您可以在订阅呼叫中仅订阅一个Streaming API事件。
  • 您无法使用相同的订阅调用订阅自定义事件和Streaming API事件。
  • 如果在数组中定义具有相同名称的多个事件,则只有最后定义的事件可用。在此示例中,状态为协商的最后一个事件是使用的事件。
    对于Streaming API事件也是如此。

Sfdc.canvas.client.subscribe(sr.client, [
{
name :”mynamespace.statusChanged”, payload : {status : ‘Closed’}
},
{
name:”mynamespace.statusChanged”, payload : {status : ‘Negotiating’}
]);

创建Canvas应用程序事件

以下代码示例演示如何调用publish方法来创建画布应用程序事件。如果您正在使用命名空间,则事件名称必须以命名空间开头。例如,namespace.eventName。

Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.publish(sr.client,
{name : “mynamespace.statusChanged”, payload : {status : ‘Completed’}});
});

订阅Canvas应用程序事件

订阅自定义事件

以下代码示例演示如何调用subscribe方法来订阅画布应用程序事件。

// Subscribe to a custom event.
Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’); Sfdc.canvas.client.subscribe(sr.client,
{name : ‘mynamespace.statusChanged’, onData : function (event) { console.log(“Subscribed to custom event “, event);
}}
);
});

订阅多个自定义事件

以下代码示例演示如何调用subscribe方法以订阅多个画布应用程序事件。您订阅的事件可以位于不同的命名空间中,也可能没有命名空间。当画布应用程序订阅某个事件时,它会在事件(在另一个画布应用程序中)和一个函数(在订阅画布应用程序中)之间创建关联。

// Subscribe to multiple events.
Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.subscribe(sr.client, [
{name : ‘mynamespace.statusChanged’, onData : handler1},
{name : ‘anothernamespace.tripCancelled’, onData : handler2},
]);
});

使用旅行和费用以及审批画布应用示例,您的审批画布应用程序有两个功能:handler1和handler2。该画布应用程序然后订阅旅行和费用画布应用程序中的两个事件:mynamespace.statusChanged和mynamespace.tripCancelled。当批准应用程序收到mynamespace.statusChanged事件时,将调用函数handler1。当批准应用程序收到anothernamespace.tripCancelled事件时,将调用函数handler2。

取消订阅Canvas应用程序事件

取消订阅自定义事件

以下代码示例演示如何调用unsubscribe方法取消订阅画布应用程序事件。

// Unsubscribe from a custom event.
Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.unsubscribe(sr.client, {name : “mynamespace.statusChanged”});
});

取消订阅多个自定义事件

以下代码示例演示如何调用unsubscribe方法取消订阅多个canvas应用程序事件。您订阅的事件可以位于不同的命名空间中,也可能没有命名空间。

// Unsubscribe from multiple events.
Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
Sfdc.canvas.client.unsubscribe(sr.client, [‘mynamespace.statusChanged’,
“anothernamespace.tripCancelled”]);
});

在Canvas应用程序中使用Streaming API

Canvas提供了一个事件和方法,使画布应用程序能够侦听Streaming API通知。

  • sfdc.streamingapi-JavaScript事件,您创建并与PushTopic定义的Streaming API通道关联。请参阅使用Streaming API事件。
  • subscribe – 订阅您定义的sfdc.streamingapi事件。请参阅订阅流式API事件。
  • unsubscribe – 取消订阅sfdc.streamingapi事件。请参阅从Streaming API事件中取消订阅。

使用Streaming API事件

Canvas SDK包含一个名为sfdc.streamingapi的事件,它允许您在画布应用程序中定义事件并将该事件与Streaming API通道相关联。然后,您使用subscribe方法订阅该事件并接收Streaming API通知。

例如,在Salesforce中,您可以创建一个Streaming API通道,该通道在更新InvoiceStatement并且Status更改为Closed时接收通知。在您的画布应用程序中,您可以创建与该频道关联的事件并订阅它。在Salesforce中,只要关闭发票声明,激活的画布应用程序就会收到通知,并可以执行操作,例如向用户显示消息。

以下是定义Streaming API事件时的一些注意事项:

  • 事件采用包含PushTopic名称的单个参数。
  • PushTopic名称必须以“/ topic /”开头。

{name:”sfdc.streamingapi”, params:{topic:”/topic/myPushTopicName”}}

订阅Streaming API事件

此代码示例演示如何调用subscribe方法,以便canvas应用程序可以订阅Streaming API事件。订阅事件时,可以调用用于订阅画布应用事件的标准sfdc.canvas.client.subscribe方法。调用subscribe方法时,必须传入客户端和Streaming API事件。只有打开并订阅该事件的画布应用才能接收流式API通知。

在此示例中,onComplete方法指定在代码成功订阅事件后运行的函数。该
onData方法指定事件收到Streaming API通知时运行的函数。

// Subscribe to Streaming API events.
// The PushTopic to subscribe to must be passed in.
// The ‘onComplete’ method may be defined,
// and will fire when the subscription is complete.
Sfdc.canvas(function() {
sr = JSON.parse(‘<%=signedRequestJson%>’);
var handler1 = function(){ console.log(“onData done”);},
handler2 = function(){ console.log(“onComplete done”);};
Sfdc.canvas.client.subscribe(sr.client,
{name : ‘sfdc.streamingapi’, params:{topic:”/topic/InvoiceStatements”}}, onData : handler1, onComplete : handler2}
);
});

调用subscribe方法时,会进行REST调用以确保画布应用程序具有连接到Streaming API所需的OAuth范围。因此,每次画布应用程序订阅Streaming API事件时,都会使用一个API调用,并根据组织的API请求总限制进行计数。 canvas应用程序至少需要“访问和管理您的数据(API)”OAuth范围才能连接到Streaming API。

如果对subscribe方法的调用成功,则调用onComplete方法,其有效负载为
{成功:真的,拉手:拉手}。句柄是一个数组,其中包含要订阅的Streaming API通道的名称,而subscriptionId是一个包含唯一ID的整数。例如,[“/ topics / InvoiceStatements”,subscriptionId]。如果对subscribe方法的调用失败,则调用onComplete方法,其有效负载为{success:false,errorMessage:msg}。 msg是一个包含错误原因的字符串。
要接收Streaming API通知,您必须创建PushTopic定义的通道。有关更多信息,请参阅Streaming API开发人员指南中的“步骤2:创建PushTopic”。

取消订阅Streaming API事件

此代码示例演示如何调用unsubscribe方法,以便画布应用程序可以取消订阅Streaming API事件。

在Canvas应用程序中调试

您必须使用Chrome,Firefox或Safari才能执行这些步骤。
使用Canvas SDK时,您可以启用调试模式以简化故障排除。

  1. 在浏览器中打开画布应用程序,打开控制台。
  2. 键入Sfdc.canvas.console.enable();并按回车键。
  3. 刷新浏览器。

Use data from this screen to debug canvas-related problems.

使用此屏幕中的数据来调试与画布相关的问题。

在Canvas App中使用e <select> 标签

如果您在画布Web应用程序中使用HTML <select>标签并打算在Salesforce应用程序中使用画布应用程序,请记住,某些设备上的行为可能无法预测。 考虑使用jQuery或CSS替代方法来使用<select>。

画布开发(3)快速入门高级篇

学习目标

完成本单元后,您将能够了解到:

  • 先决条件
  • 从GitHub克隆项目
  • 在本地运行Web应用程序
  • 创建Canvas应用程序
  • 配置谁可以访问Canvas应用程序
  • 将Web App部署到Heroku
  • 更新Canvas应用程序
  • 打包Canvas应用程序
  • 上传Canvas App Package
  • 安装Canvas应用程序
  • 配置谁可以访问已安装的Canvas应用程序

这个高级快速入门向您展示了如何开始使用更多Canvas功能。 它将逐步介绍创建,打包,上载,安装和运行画布应用程序的过程。 示例画布应用程序是一个“hello world”Web页面,它调用Canvas SDK以显示当前用户的名称。
在这个例子中,你将:

  • 从GitHub克隆“hello world”应用程序
  • 在本地Web服务器上运行应用程序
  • 将Web应用程序公开为Salesforce开发组织中的画布应用程序,并在Canvas App Previewer中对其进行测试
  • 将Web应用程序部署到Heroku
  • 打包并上传画布应用程序
  • 将canvas应用程序安装在另一个Salesforce组织中,并以用户身份运行它

本快速入门中的步骤假设您使用的是Windows。 您可以使用其他操作系统,但步骤可能会有一些细微差别。

先决条件

您需要适当的访问和工具来完成快速启动步骤。

  • 访问Developer Edition组织以开发canvas应用程序。要安装画布应用程序,您需要一个除用于创建画布应用程序之外的Developer Edition组织。
    如果您还不是Lightning Platform开发人员社区的成员,请访问developer.salesforce.com/signup并按照注册Developer Edition组织的说明进行操作。即使您已经拥有Enterprise Edition,Unlimited Edition或Performance Edition,也可以使用Developer Edition根据示例数据开发,暂存和测试您的解决方案,以保护您组织的实时数据。对于插入,更新或删除数据的应用程序(与简单地读取数据相反)尤其如此。
    如果您有现有的Developer Edition组织,并且从安装程序中看不到菜单项Canvas App Previewer,请联系Salesforce。
  • “自定义应用程序”和“修改所有数据”用户权限。如果您是管理员,则很可能已拥有这些权限。否则,您需要添加它们,以便您可以看到Canvas应用程序预览器并创建画布应用程序。
  • 安装了Git。到这里安装和配置Git:https://help.github.com/articles/set-up-git。
    安装Git后,您可能需要使用keygen工具配置SSH。有关更多信息,请参阅https://help.github.com/articles/generating-ssh-keys。如果您使用的是Windows,则此工具位于Git \ bin目录中,在安装Git后,该目录未添加到路径中。使用“控制面板”将\ bin目录添加到路径中。根据您的安装目录,路径可能类似于C:\ Program Files(x86)\ Git \ bin。
  • 克隆代码示例的GitHub帐户。转到此处设置GitHub帐户:https://github.com/plans。
  • 安装Maven 3.0或更高版本以打包示例应用程序。到这里下载并安装Maven:
    http://maven.apache.org/download.html。
  • 如果您想从Heroku运行应用程序,可以使用Heroku帐户。转到此处创建一个Heroku帐户:
    https://api.heroku.com/signup。
  • Heroku Toolbelt如果要从命令行管理Heroku应用程序。到这里下载并安装Heroku Toolbelt:
    https://toolbelt.heroku.com。

从GitHub克隆项目

“hello world”示例项目是位于GitHub上的Canvas SDK的一部分。在此步骤中,我们将克隆项目以在本地计算机上制作它的副本。

  1. 登录https://github.com。
  2. 通过转到:找到包含Canvas SDK和代码示例的项目:
    https://github.com/forcedotcom/SalesforceCanvasFrameworkSDK。
  3. 单击Zip并下载.zip文件克隆项目。
  4. 将zip文件中的所有文件本地解压缩到名为c:\ SalesforceCanvasFrameworkSDK的目录中。或者,您可以使用Git命令行下载项目并发出以下命令:git clone git@github.com:forcedotcom / SalesforceCanvasFrameworkSDK.git。
  5. 打开命令窗口并导航到c:\ SalesforceCanvasFrameworkSDK。
  6. 输入命令git submodule init。
  7. 输入命令git submodule update。这会将其他项目添加到当前项目中。文件
    c:\ SalesforceCanvasFrameworkSDK \ .gitmodules显示哪些项目作为子模块包含在内。

克隆项目后,c:\ SalesforceCanvasFrameworkSDK目录应包含名为src的子目录,以及pom.xml和README.md等文件。

在本地运行Web应用程序

在此步骤中,您将使用Maven打包Web应用程序,然后使用Jetty在本地运行它。打包Web应用程序时,该过程会下载运行Web应用程序所需的所有组件,包括Jetty。

  1. 打开命令窗口并导航到c:\ SalesforceCanvasFrameworkSDK。
  2. 输入命令mvn package。当Maven打包应用程序及其相关组件时,您将在命令窗口中看到输出。如果该过程成功完成,您将看到如下内容:
    [INFO] ———————————————
    [INFO] BUILD SUCCESS
    [INFO] ———————————————
    [INFO] Total time: 28.016s
    [INFO] Finished at: Tue Jul 03 08:00:42 PDT 2012
    [INFO] Final Memory: 8M/59M
    [INFO] ———————————————
  3. 要使用Jetty运行应用程序,您需要启用本地SSL支持。此步骤只需要为每个应用程序执行一次,因此如果您已经完成此操作,请跳过此步骤。确保命令窗口已打开,并且您位于目录c:\ SalesforceCanvasFrameworkSDK中。
  4. 运行以下命令:keytool -keystore keystore -alias jetty -genkey -keyalg RSA。
    运行此命令后,系统将提示您输入以下信息。输入123456作为密钥库密码,输入是以在最后确认。出现提示时,“输入的密钥密码”,按Enter键以使用密钥库密码。对于其他信息,您可以输入值或将其留空。
    Enter keystore password: 《Choose Your Password》
    Re-enter new password: 《Choose Your Password》
    What is your first and last name?
    [Unknown]: 《Enter First and Last Name》
    What is the name of your organizational unit?
    [Unknown]: 《Enter an Org Unit》
    What is the name of your organization?
    [Unknown]: 《Enter an Org》
    What is the name of your City or Locality?
    [Unknown]: 《Enter a City》
    What is the name of your State or Province?
    [Unknown]: 《Enter a State》
    What is the two-letter country code for this unit?
    [Unknown]: 《Enter a Country》
    Is CN=XXXX, OU=XXXX, O=XXXX, L=XXXX, ST=XX, C=XX correct?
    [no]: yes
    Enter key password for 《jetty》
    (RETURN if same as keystore password):
    这将在目录c:\ SalesforceCanvasFrameworkSDK中创建名为keystore的文件。 Jetty使用密钥库来支持SSL。
  5. 输入以下命令运行Web服务器:target \ bin \ webapp.bat(Windows)或sh target / bin / webapp
    (Unix / OS X)。
    如果您使用的是Unix / OS X,则可能需要先向webapp添加执行权限,然后才能运行它。使用此命令执行此操作:chmod + x target / bin / webapp。
  6. 通过打开浏览器并导航到以下URL来验证应用程序是否正在运行:
    https://开头本地主机:8443 /例子/您好世界/ index.jsp的。
    根据您的浏览器和安全设置,您可能需要添加安全例外,因为您正在运行具有未签名SSL证书的站点。
    您应该看到一条消息,上面写着“必须通过已签名的请求调用此应用程序!”这表明Web应用程序在本地运行。出现此消息是因为该应用程序旨在从Salesforce接收已签名的请求,因此,该应用程序不会在Salesforce画布环境之外运行。

创建Canvas应用程序

在此步骤中,您将在Salesforce组织中创建画布应用程序。您将需要用户权限“自定义应用程序”和“修改所有数据”来创建画布应用程序。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“应用”,然后选择“应用”。
  2. 在Connected Apps相关列表中,单击New。
  3. 在Connected App Name字段中,输入Hello World。
  4. 接受Hello_World的默认API名称。这是画布应用程序的内部名称,保存后无法更改。
  5. 在联系电子邮件字段中,输入您的电子邮件地址。
  6. 在徽标图像URL字段中,输入https:// localhost:8443 / images / salesforce.png。这是默认的Salesforce“无软件”映像。此图像显示在安装屏幕和应用程序的详细信息屏幕上。
  7. 在Icon URL字段中,输入https:// localhost:8443 / examples / hello-world / logo.png。这是默认的Salesforce“无软件”映像。
    这是用户界面中应用名称旁边显示的图像。如果将此字段留空,则应用程序名称旁会显示默认云图像。
  8. 在API(启用OAuth设置)部分中,选择“启用OAuth设置”字段。
  9. 在Callback URL字段中,输入https:// localhost:8443 / sdk / callback.html。
  10. 在“选定的OAuth范围”字段中,选择“访问基本信息”。
  11. 在Canvas App Settings部分中,选择Canvas。
  12. 在Canvas App URL字段中,输入https:// localhost:8443 / examples / hello-world / index.jsp。
  13. 在“访问方法”字段中,选择“签名请求(发布)”。
  14. 在“位置”字段中,选择“Chatter”选项卡。
  15. 单击“保存”。保存画布应用程序后,将显示详细信息页面。
  16. 在画布应用程序的详细信息页面上,在“使用者密钥”字段旁边,单击“单击以显示”链接。在应用程序中使用消费者密钥进行身份验证。
  17. 选择使用者密钥值,然后输入CTRL + C进行复制。
  18. 进入命令窗口,输入CTRL + C停止Jetty Web服务器。在提示符下,输入Y.
  19. 创建一个名为CANVAS_CONSUMER_SECRET的环境变量,并将该值设置为刚复制的使用者密钥。要在Windows中执行此操作,请在命令窗口中输入set CANVAS_CONSUMER_SECRET = value_you_just_copied
    如果您使用的是Unix / OS X,请使用命令export CANVAS_CONSUMER_SECRET = value_you_just_copied设置环境变量。
    “你好世界”页面
    (c:\ SalesforceCanvasFrameworkSDK \ src \ main \ webapp \ examples \ hello-world \ index.jsp)使用使用者密钥,
  20. 输入以下命令重新启动Web服务器:target \ bin \ webapp.bat(Windows)或sh target / bin / webapp
    (Unix / OS X)。

如以下代码所示:

<%@ page import=”canvas.SignedRequest” %>
<%@ page import=”java.util.Map” %>
<%
// Pull the signed request out of the request body and verify and decode it. Map<String, String[]> parameters = request.getParameterMap();
String[] signedRequest = parameters.get(“signed_request”); if (signedRequest == null) {%>
This app must be invoked via a signed request!<% return;
}
String yourConsumerSecret=System.getenv(“CANVAS_CONSUMER_SECRET”);
String signedRequestJson = SignedRequest.verifyAndDecodeAsJson(signedRequest[0], yourConsumerSecret);
%>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” lang=”en”>
<head>
<title>Hello World Canvas Example</title>
<link rel=”stylesheet” type=”text/css” href=”/sdk/css/connect.css” />
<script type=”text/javascript” src=”/sdk/js/canvas-all.js”></script>
<!– Third part libraries, substitute with your own –>
<script type=”text/javascript” src=”/scripts/json2.js”></script>
<script>
if (self === top) {
// Not in an iFrame.
alert(“This canvas app must be included within an iFrame”);
}
Sfdc.canvas(function() {
var sr = JSON.parse(‘<%=signedRequestJson%>’); Sfdc.canvas.byId(‘username’).innerHTML = sr.context.user.fullName;
});
</script>
</head>
<body>
<br/>
<h1>Hello <span id=’username’></span></h1>
</body>
</html>

配置谁可以访问Canvas应用程序

您已在Salesforce中创建了画布应用程序,现在让我们为特定用户配置访问权限。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“已连接的应用程序”,然后选择用于管理已连接应用程序的选项。
  2. 单击Hello World应用程序,然后单击编辑。
  3. 在“允许的用户”字段中,选择“管理员批准的用户已预先授权”。在出现的弹出消息上单击“确定”。我们选择了“管理员批准的用户已预先授权”,因此在我们授予他们权限之前,用户不会看到画布应用。如果我们选择“所有用户可以自我授权”,则用户会看到画布应用,但需要批准或拒绝访问它。
  4. 单击“保存”。
    您可以在此处定义谁可以查看您的画布应用程序。这可以使用配置文件和权限集来完成。在此示例中,我们假设您的配置文件是系统管理员。
  5. 在“配置文件”相关列表中,单击“管理配置文件”。
  6. 选择System Administrator配置文件,然后单击Save。
  7. 在Salesforce中,从“设置”中,在“快速查找”框中输入Canvas App Previewer,然后选择“Canvas App Previewer”。您可以使用Canvas应用程序预览器在发布之前测试您的画布应用程序。
  8. 单击左侧的Hello World链接。
    该应用程序出现,您将看到消息Hello User.FullName。画布应用程序在此上下文中工作,因为当您在预览器中单击应用程序名称时,已签名的请求将发送到端点https:// localhost:8443 / examples / hello-world / index.jsp。

配置访问权限后,您可以在Canvas App Previewer和开发组织的Chatter选项卡上查看canvas应用程序。

将Web App部署到Heroku

在本演练中,您之前在本地运行了“hello world”Web应用程序,然后将其添加为画布应用程序并对其进行测试。现在您的画布应用程序在本地运行,您已准备好将“hello world”Web应用程序部署到Heroku并从那里运行它。这是你如何做到的。

  1. 如果您还没有,请登录Heroku并按照先决条件中的链接安装Heroku Toolbelt。
  2. 打开命令窗口,导航到c:\ SalesforceCanvasFrameworkSDK,然后输入以下命令:git init。这会将目录重新初始化为Git存储库。
  3. 在命令窗口中,输入以下命令:heroku create。这在Heroku上创建了一个新的“shell”应用程序。确认应用程序已创建如下:
    Creating deep-samurai-7923… done, stack is cedar
    http://deep-samurai-7923.herokuapp.com/ | git@heroku.com:deep-samurai-7923.git
    Git remote heroku added
  4. 要重命名此Heroku应用程序,请在命令窗口中输入以下命令:heroku rename newAppName –app
    oldAppName。
    在此示例中,oldAppName是deep-samurai-7923。您创建的newAppName必须以字母开头,并且只能包含小写字母,数字和短划线。您将看到重命名的确认,看起来与此类似:
    http://newappName.herokuapp.com/ | git@heroku.com:newappName.git
    所有Heroku应用程序中的newappName必须是唯一的。此名称将成为应用程序URL的一部分,例如,
    newappName.herokuapp.com。
  5. 在命令窗口中运行以下命令:git add -A。这会将整个SalesforceCanvasFrameworkSDK项目添加到Git存储库。如果您在Windows环境中工作,您可能会看到有关LF(换行符)的一些消息被CRLF(回车换行符)替换。
  6. 在命令窗口中输入以下命令以提交更改以及注释:git commit -m“MyChangeComments”。
  7. 在命令窗口中输入以下命令,将更改部署到Heroku:git push heroku master。如果该过程成功完成,您将看到如下内容:
    [INFO] ——————————————
    [INFO] BUILD SUCCESS
    [INFO] ——————————————
    [INFO] Total time: 13.188s
    [INFO] Finished at: Sat Feb 09 21:14:23 UTC 2013
    [INFO] Final Memory: 11M/490M
    [INFO] ——————————————
    如果收到“权限被拒绝”错误消息,则可能需要设置SSH密钥并将其添加到Heroku。看到
    https://devcenter.heroku.com/articles/keys。
  8. 打开命令窗口,并通过输入此命令并将consumer_secret_value替换为刚刚复制的值来设置包含使用者密钥的Heroku环境变量:heroku config:add CANVAS_CONSUMER_SECRET = consumer_secret_value。
    要获取画布应用程序的消费者机密,请在“设置”中的“快速查找”框中输入应用程序,然后选择“应用程序”并单击“Hello World”应用程序。您将在OAuth设置部分中看到“使用者密钥”字段。
  9. 通过打开浏览器并导航到以下URL,验证应用程序是否在Heroku中运行:
    https://newappName.herokuapp.com/examples/hello-world/index.jsp。
    您应该看到一条消息,上面写着“必须通过已签名的请求调用此应用程序!”这表明该应用程序正在Heroku中运行。出现此消息是因为该应用程序旨在从Salesforce画布环境接收签名请求。

更新Canvas应用程序

在此步骤中,您将更新画布应用程序以运行现在在Heroku上运行的“hello world”应用程序。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“应用”,然后选择“应用”。
  2. 在Connected Apps相关列表中,单击Hello World。
  3. 单击“编辑”。
  4. 在徽标图像URL字段中,输入https://appName.herokuapp.com/images/salesforce.png。这是默认的Salesforce“无软件”映像。此图像显示在安装屏幕和应用程序的详细信息屏幕上。 appName是您刚刚创建的Heroku应用程序的名称。
  5. 在图标URL字段中,输入https://appName.herokuapp.com/examples/hello-world/logo.png。这是默认的Salesforce“无软件”映像。
    这是Chatter选项卡或Canvas App Previewer中应用程序名称旁边显示的图像。如果将此字段留空,则应用程序名称旁会显示默认云图像。 appName是您刚刚创建的Heroku应用程序的名称。
  6. 在“回拨URL”字段中,输入https://appName.herokuapp.com/sdk/callback.html。 appName是您刚刚创建的Heroku应用程序的名称。
  7. 在Canvas App URL字段中,输入https://appName.herokuapp.com/examples/hello-world/index.jsp。 appName是您刚刚创建的Heroku应用程序的名称。
  8. 单击“保存”。保存画布应用程序后,将显示详细信息页面。
  9. 在Salesforce中,从“设置”中,在“快速查找”框中输入Canvas App Previewer,然后选择“Canvas App Previewer”。您可以使用Canvas应用程序预览器在重新打包之前测试您的画布应用程序。
  10. 单击左侧的Hello World链接。
    该应用程序应该出现,您将看到消息Hello User.FullName。画布应用程序在此上下文中工作,因为当您在预览器中单击应用程序名称时,已签名的请求将发送到端点https://appName.herokuapp.com/examples/hello-world/index.jsp。

在这个例子中,我们使用的是我们刚创建的相同画布应用程序,但更新它指向在Heroku上运行的“hello world”Web应用程序。因此,我们之前添加到“hello world”应用程序中的消费者秘密不需要更新。
如果要在Salesforce中创建一个新的画布应用程序,该应用程序显示在Heroku上运行的“hello world”应用程序,请转到创建画布应用程序以创建新应用程序,更新应用程序中的使用者密钥,然后将更改部署到Heroku的。

打包Canvas应用程序

现在您已经创建了画布应用程序,在Canvas应用程序预览器中对其进行了测试,并将其部署到Heroku,您已准备好打包并分发它。打包是使您的画布应用程序可以在其他组织中安装的第一步。有关打包的更多信息,请参阅ISVforce指南。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“包”,然后选择“包”并单击“新建”。
    提示:要将画布应用程序打包以在其他组织中安装,您必须创建名称空间前缀。名称空间前缀只能在Developer Edition组织中定义。有关详细信息,请参阅联机帮助中的“注册命名空间前缀”主题。
  2. 将Package Name字段设置为Hello World Package,并接受其他字段的默认值。
  3. 选择“托管”字段以使程序包成为组织的托管程序包。
  4. 出现一个提示,说明您只允许一个托管包。单击确定。
  5. 单击“保存”。
  6. 包是空的,因此单击“添加”。
  7. 在Component Type字段中,选择Connected App。
  8. 选中Hello World应用程序旁边的复选框,然后单击“添加到包”。出现包详细信息屏幕。从“设置”中,在“快速查找”框中输入“Package”,然后选择“Package”以查看新的托管包。

上传Canvas应用程序包

现在您已经打包了画布应用程序,您已准备好上传该软件包。这将创建一个安装链接,您可以向需要在其组织中安装画布应用程序的任何人提供该链接。

1.在Salesforce中,从“设置”中,在“快速查找”框中输入“Packages”,然后选择“Packages”。
2.在Packages列表中,单击Hello World Package链接。
3.在“Package Detail”页面上,单击“Upload ”以发布托管包。
4.在版本名称字段中,输入Winter 2014 Beta。保留默认版本号1.0和Managed-Beta的发布类型。
5.单击“Upload”。
注意:画布应用程序只能安装在您正在开发的组织之外的组织中。

安装Canvas应用程序

上载打包的画布应用程序会创建安装链接。然后,您可以使用此链接在其他组织中安装画布应用程序。 Beta软件包只能安装在沙盒或Developer Edition组织中,否则,您将收到错误消息。

  1. 打开浏览器并在浏览器地址栏中输入画布应用程序安装URL。如果您正在开发canvas应用程序,请确保在安装应用程序之前注销开发组织。
    安装URL类似于:
    https://login.instance.salesforce.com/services/packaging/installPackage.apexp?p0=04eU0000000AWNA。
  2. 出现提示时,输入您要在其中安装软件包的组织的登录凭据。
  3. 将显示“包安装详细信息”页面。在Package Components列表中,您应该看到Hello World画布应用程序。单击Continue。
  4. 单击Next ,然后单击Install

配置谁可以访问已安装的Canvas应用程序

您已在Salesforce组织中安装了画布应用程序,但在配置用户访问权限之前,没有人可以看到它。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“Connected Apps ”,然后选择用于管理已连接应用程序的选项。
  2. 单击Hello World应用程序,然后单击“Edit”。
  3. 在“允许的用户”字段中,选择“管理员批准的用户”已预先授权。在出现的弹出消息上单击“OK”。
  4. 单击“Save”。
    现在,您将定义谁可以看到您的画布应用程序。这可以使用配置文件和权限集来完成。在此示例中,我们将允许任何拥有系统管理员的人访问该应用程序。
  5. 在“已连接的应用程序详细信息”页面的“配置文件相关”列表中,单击“ Manage Profiles.”。
  6. 选择System Administrator配置文件,然后单击Save。
  7. 单击Chatter选项卡。
  8. 单击左侧的Hello World链接。
    该应用程序出现,您将看到消息Hello User.FullName。

画布开发(3)快速入门高级篇

学习目标

完成本单元后,您将能够了解到:

  • 先决条件
  • 从GitHub克隆项目
  • 在本地运行Web应用程序
  • 创建Canvas应用程序
  • 配置谁可以访问Canvas应用程序
  • 将Web App部署到Heroku
  • 更新Canvas应用程序
  • 打包Canvas应用程序
  • 上传Canvas App Package
  • 安装Canvas应用程序
  • 配置谁可以访问已安装的Canvas应用程序

这个高级快速入门向您展示了如何开始使用更多Canvas功能。 它将逐步介绍创建,打包,上载,安装和运行画布应用程序的过程。 示例画布应用程序是一个“hello world”Web页面,它调用Canvas SDK以显示当前用户的名称。
在这个例子中,你将:

  • 从GitHub克隆“hello world”应用程序
  • 在本地Web服务器上运行应用程序
  • 将Web应用程序公开为Salesforce开发组织中的画布应用程序,并在Canvas App Previewer中对其进行测试
  • 将Web应用程序部署到Heroku
  • 打包并上传画布应用程序
  • 将canvas应用程序安装在另一个Salesforce组织中,并以用户身份运行它

本快速入门中的步骤假设您使用的是Windows。 您可以使用其他操作系统,但步骤可能会有一些细微差别。

先决条件

您需要适当的访问和工具来完成快速启动步骤。

  • 访问Developer Edition组织以开发canvas应用程序。要安装画布应用程序,您需要一个除用于创建画布应用程序之外的Developer Edition组织。
    如果您还不是Lightning Platform开发人员社区的成员,请访问developer.salesforce.com/signup并按照注册Developer Edition组织的说明进行操作。即使您已经拥有Enterprise Edition,Unlimited Edition或Performance Edition,也可以使用Developer Edition根据示例数据开发,暂存和测试您的解决方案,以保护您组织的实时数据。对于插入,更新或删除数据的应用程序(与简单地读取数据相反)尤其如此。
    如果您有现有的Developer Edition组织,并且从安装程序中看不到菜单项Canvas App Previewer,请联系Salesforce。
  • “自定义应用程序”和“修改所有数据”用户权限。如果您是管理员,则很可能已拥有这些权限。否则,您需要添加它们,以便您可以看到Canvas应用程序预览器并创建画布应用程序。
  • 安装了Git。到这里安装和配置Git:https://help.github.com/articles/set-up-git。
    安装Git后,您可能需要使用keygen工具配置SSH。有关更多信息,请参阅https://help.github.com/articles/generating-ssh-keys。如果您使用的是Windows,则此工具位于Git \ bin目录中,在安装Git后,该目录未添加到路径中。使用“控制面板”将\ bin目录添加到路径中。根据您的安装目录,路径可能类似于C:\ Program Files(x86)\ Git \ bin。
  • 克隆代码示例的GitHub帐户。转到此处设置GitHub帐户:https://github.com/plans。
  • 安装Maven 3.0或更高版本以打包示例应用程序。到这里下载并安装Maven:
    http://maven.apache.org/download.html。
  • 如果您想从Heroku运行应用程序,可以使用Heroku帐户。转到此处创建一个Heroku帐户:
    https://api.heroku.com/signup。
  • Heroku Toolbelt如果要从命令行管理Heroku应用程序。到这里下载并安装Heroku Toolbelt:
    https://toolbelt.heroku.com。

从GitHub克隆项目

“hello world”示例项目是位于GitHub上的Canvas SDK的一部分。在此步骤中,我们将克隆项目以在本地计算机上制作它的副本。

  1. 登录https://github.com。
  2. 通过转到:找到包含Canvas SDK和代码示例的项目:
    https://github.com/forcedotcom/SalesforceCanvasFrameworkSDK。
  3. 单击Zip并下载.zip文件克隆项目。
  4. 将zip文件中的所有文件本地解压缩到名为c:\ SalesforceCanvasFrameworkSDK的目录中。或者,您可以使用Git命令行下载项目并发出以下命令:git clone git@github.com:forcedotcom / SalesforceCanvasFrameworkSDK.git。
  5. 打开命令窗口并导航到c:\ SalesforceCanvasFrameworkSDK。
  6. 输入命令git submodule init。
  7. 输入命令git submodule update。这会将其他项目添加到当前项目中。文件
    c:\ SalesforceCanvasFrameworkSDK \ .gitmodules显示哪些项目作为子模块包含在内。

克隆项目后,c:\ SalesforceCanvasFrameworkSDK目录应包含名为src的子目录,以及pom.xml和README.md等文件。

在本地运行Web应用程序

在此步骤中,您将使用Maven打包Web应用程序,然后使用Jetty在本地运行它。打包Web应用程序时,该过程会下载运行Web应用程序所需的所有组件,包括Jetty。

  1. 打开命令窗口并导航到c:\ SalesforceCanvasFrameworkSDK。
  2. 输入命令mvn package。当Maven打包应用程序及其相关组件时,您将在命令窗口中看到输出。如果该过程成功完成,您将看到如下内容:
    [INFO] ———————————————
    [INFO] BUILD SUCCESS
    [INFO] ———————————————
    [INFO] Total time: 28.016s
    [INFO] Finished at: Tue Jul 03 08:00:42 PDT 2012
    [INFO] Final Memory: 8M/59M
    [INFO] ———————————————
  3. 要使用Jetty运行应用程序,您需要启用本地SSL支持。此步骤只需要为每个应用程序执行一次,因此如果您已经完成此操作,请跳过此步骤。确保命令窗口已打开,并且您位于目录c:\ SalesforceCanvasFrameworkSDK中。
  4. 运行以下命令:keytool -keystore keystore -alias jetty -genkey -keyalg RSA。
    运行此命令后,系统将提示您输入以下信息。输入123456作为密钥库密码,输入是以在最后确认。出现提示时,“输入的密钥密码”,按Enter键以使用密钥库密码。对于其他信息,您可以输入值或将其留空。
    Enter keystore password: 《Choose Your Password》
    Re-enter new password: 《Choose Your Password》
    What is your first and last name?
    [Unknown]: 《Enter First and Last Name》
    What is the name of your organizational unit?
    [Unknown]: 《Enter an Org Unit》
    What is the name of your organization?
    [Unknown]: 《Enter an Org》
    What is the name of your City or Locality?
    [Unknown]: 《Enter a City》
    What is the name of your State or Province?
    [Unknown]: 《Enter a State》
    What is the two-letter country code for this unit?
    [Unknown]: 《Enter a Country》
    Is CN=XXXX, OU=XXXX, O=XXXX, L=XXXX, ST=XX, C=XX correct?
    [no]: yes
    Enter key password for 《jetty》
    (RETURN if same as keystore password):
    这将在目录c:\ SalesforceCanvasFrameworkSDK中创建名为keystore的文件。 Jetty使用密钥库来支持SSL。
  5. 输入以下命令运行Web服务器:target \ bin \ webapp.bat(Windows)或sh target / bin / webapp
    (Unix / OS X)。
    如果您使用的是Unix / OS X,则可能需要先向webapp添加执行权限,然后才能运行它。使用此命令执行此操作:chmod + x target / bin / webapp。
  6. 通过打开浏览器并导航到以下URL来验证应用程序是否正在运行:
    https://开头本地主机:8443 /例子/您好世界/ index.jsp的。
    根据您的浏览器和安全设置,您可能需要添加安全例外,因为您正在运行具有未签名SSL证书的站点。
    您应该看到一条消息,上面写着“必须通过已签名的请求调用此应用程序!”这表明Web应用程序在本地运行。出现此消息是因为该应用程序旨在从Salesforce接收已签名的请求,因此,该应用程序不会在Salesforce画布环境之外运行。

创建Canvas应用程序

在此步骤中,您将在Salesforce组织中创建画布应用程序。您将需要用户权限“自定义应用程序”和“修改所有数据”来创建画布应用程序。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“应用”,然后选择“应用”。
  2. 在Connected Apps相关列表中,单击New。
  3. 在Connected App Name字段中,输入Hello World。
  4. 接受Hello_World的默认API名称。这是画布应用程序的内部名称,保存后无法更改。
  5. 在联系电子邮件字段中,输入您的电子邮件地址。
  6. 在徽标图像URL字段中,输入https:// localhost:8443 / images / salesforce.png。这是默认的Salesforce“无软件”映像。此图像显示在安装屏幕和应用程序的详细信息屏幕上。
  7. 在Icon URL字段中,输入https:// localhost:8443 / examples / hello-world / logo.png。这是默认的Salesforce“无软件”映像。
    这是用户界面中应用名称旁边显示的图像。如果将此字段留空,则应用程序名称旁会显示默认云图像。
  8. 在API(启用OAuth设置)部分中,选择“启用OAuth设置”字段。
  9. 在Callback URL字段中,输入https:// localhost:8443 / sdk / callback.html。
  10. 在“选定的OAuth范围”字段中,选择“访问基本信息”。
  11. 在Canvas App Settings部分中,选择Canvas。
  12. 在Canvas App URL字段中,输入https:// localhost:8443 / examples / hello-world / index.jsp。
  13. 在“访问方法”字段中,选择“签名请求(发布)”。
  14. 在“位置”字段中,选择“Chatter”选项卡。
  15. 单击“保存”。保存画布应用程序后,将显示详细信息页面。
  16. 在画布应用程序的详细信息页面上,在“使用者密钥”字段旁边,单击“单击以显示”链接。在应用程序中使用消费者密钥进行身份验证。
  17. 选择使用者密钥值,然后输入CTRL + C进行复制。
  18. 进入命令窗口,输入CTRL + C停止Jetty Web服务器。在提示符下,输入Y.
  19. 创建一个名为CANVAS_CONSUMER_SECRET的环境变量,并将该值设置为刚复制的使用者密钥。要在Windows中执行此操作,请在命令窗口中输入set CANVAS_CONSUMER_SECRET = value_you_just_copied
    如果您使用的是Unix / OS X,请使用命令export CANVAS_CONSUMER_SECRET = value_you_just_copied设置环境变量。
    “你好世界”页面
    (c:\ SalesforceCanvasFrameworkSDK \ src \ main \ webapp \ examples \ hello-world \ index.jsp)使用使用者密钥,
  20. 输入以下命令重新启动Web服务器:target \ bin \ webapp.bat(Windows)或sh target / bin / webapp
    (Unix / OS X)。

如以下代码所示:

<%@ page import=”canvas.SignedRequest” %>
<%@ page import=”java.util.Map” %>
<%
// Pull the signed request out of the request body and verify and decode it. Map<String, String[]> parameters = request.getParameterMap();
String[] signedRequest = parameters.get(“signed_request”); if (signedRequest == null) {%>
This app must be invoked via a signed request!<% return;
}
String yourConsumerSecret=System.getenv(“CANVAS_CONSUMER_SECRET”);
String signedRequestJson = SignedRequest.verifyAndDecodeAsJson(signedRequest[0], yourConsumerSecret);
%>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” lang=”en”>
<head>
<title>Hello World Canvas Example</title>
<link rel=”stylesheet” type=”text/css” href=”/sdk/css/connect.css” />
<script type=”text/javascript” src=”/sdk/js/canvas-all.js”></script>
<!– Third part libraries, substitute with your own –>
<script type=”text/javascript” src=”/scripts/json2.js”></script>
<script>
if (self === top) {
// Not in an iFrame.
alert(“This canvas app must be included within an iFrame”);
}
Sfdc.canvas(function() {
var sr = JSON.parse(‘<%=signedRequestJson%>’); Sfdc.canvas.byId(‘username’).innerHTML = sr.context.user.fullName;
});
</script>
</head>
<body>
<br/>
<h1>Hello <span id=’username’></span></h1>
</body>
</html>

配置谁可以访问Canvas应用程序

您已在Salesforce中创建了画布应用程序,现在让我们为特定用户配置访问权限。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“已连接的应用程序”,然后选择用于管理已连接应用程序的选项。
  2. 单击Hello World应用程序,然后单击编辑。
  3. 在“允许的用户”字段中,选择“管理员批准的用户已预先授权”。在出现的弹出消息上单击“确定”。我们选择了“管理员批准的用户已预先授权”,因此在我们授予他们权限之前,用户不会看到画布应用。如果我们选择“所有用户可以自我授权”,则用户会看到画布应用,但需要批准或拒绝访问它。
  4. 单击“保存”。
    您可以在此处定义谁可以查看您的画布应用程序。这可以使用配置文件和权限集来完成。在此示例中,我们假设您的配置文件是系统管理员。
  5. 在“配置文件”相关列表中,单击“管理配置文件”。
  6. 选择System Administrator配置文件,然后单击Save。
  7. 在Salesforce中,从“设置”中,在“快速查找”框中输入Canvas App Previewer,然后选择“Canvas App Previewer”。您可以使用Canvas应用程序预览器在发布之前测试您的画布应用程序。
  8. 单击左侧的Hello World链接。
    该应用程序出现,您将看到消息Hello User.FullName。画布应用程序在此上下文中工作,因为当您在预览器中单击应用程序名称时,已签名的请求将发送到端点https:// localhost:8443 / examples / hello-world / index.jsp。

配置访问权限后,您可以在Canvas App Previewer和开发组织的Chatter选项卡上查看canvas应用程序。

将Web App部署到Heroku

在本演练中,您之前在本地运行了“hello world”Web应用程序,然后将其添加为画布应用程序并对其进行测试。现在您的画布应用程序在本地运行,您已准备好将“hello world”Web应用程序部署到Heroku并从那里运行它。这是你如何做到的。

  1. 如果您还没有,请登录Heroku并按照先决条件中的链接安装Heroku Toolbelt。
  2. 打开命令窗口,导航到c:\ SalesforceCanvasFrameworkSDK,然后输入以下命令:git init。这会将目录重新初始化为Git存储库。
  3. 在命令窗口中,输入以下命令:heroku create。这在Heroku上创建了一个新的“shell”应用程序。确认应用程序已创建如下:
    Creating deep-samurai-7923… done, stack is cedar
    http://deep-samurai-7923.herokuapp.com/ | git@heroku.com:deep-samurai-7923.git
    Git remote heroku added
  4. 要重命名此Heroku应用程序,请在命令窗口中输入以下命令:heroku rename newAppName –app
    oldAppName。
    在此示例中,oldAppName是deep-samurai-7923。您创建的newAppName必须以字母开头,并且只能包含小写字母,数字和短划线。您将看到重命名的确认,看起来与此类似:
    http://newappName.herokuapp.com/ | git@heroku.com:newappName.git
    所有Heroku应用程序中的newappName必须是唯一的。此名称将成为应用程序URL的一部分,例如,
    newappName.herokuapp.com。
  5. 在命令窗口中运行以下命令:git add -A。这会将整个SalesforceCanvasFrameworkSDK项目添加到Git存储库。如果您在Windows环境中工作,您可能会看到有关LF(换行符)的一些消息被CRLF(回车换行符)替换。
  6. 在命令窗口中输入以下命令以提交更改以及注释:git commit -m“MyChangeComments”。
  7. 在命令窗口中输入以下命令,将更改部署到Heroku:git push heroku master。如果该过程成功完成,您将看到如下内容:
    [INFO] ——————————————
    [INFO] BUILD SUCCESS
    [INFO] ——————————————
    [INFO] Total time: 13.188s
    [INFO] Finished at: Sat Feb 09 21:14:23 UTC 2013
    [INFO] Final Memory: 11M/490M
    [INFO] ——————————————
    如果收到“权限被拒绝”错误消息,则可能需要设置SSH密钥并将其添加到Heroku。看到
    https://devcenter.heroku.com/articles/keys。
  8. 打开命令窗口,并通过输入此命令并将consumer_secret_value替换为刚刚复制的值来设置包含使用者密钥的Heroku环境变量:heroku config:add CANVAS_CONSUMER_SECRET = consumer_secret_value。
    要获取画布应用程序的消费者机密,请在“设置”中的“快速查找”框中输入应用程序,然后选择“应用程序”并单击“Hello World”应用程序。您将在OAuth设置部分中看到“使用者密钥”字段。
  9. 通过打开浏览器并导航到以下URL,验证应用程序是否在Heroku中运行:
    https://newappName.herokuapp.com/examples/hello-world/index.jsp。
    您应该看到一条消息,上面写着“必须通过已签名的请求调用此应用程序!”这表明该应用程序正在Heroku中运行。出现此消息是因为该应用程序旨在从Salesforce画布环境接收签名请求。

更新Canvas应用程序

在此步骤中,您将更新画布应用程序以运行现在在Heroku上运行的“hello world”应用程序。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“应用”,然后选择“应用”。
  2. 在Connected Apps相关列表中,单击Hello World。
  3. 单击“编辑”。
  4. 在徽标图像URL字段中,输入https://appName.herokuapp.com/images/salesforce.png。这是默认的Salesforce“无软件”映像。此图像显示在安装屏幕和应用程序的详细信息屏幕上。 appName是您刚刚创建的Heroku应用程序的名称。
  5. 在图标URL字段中,输入https://appName.herokuapp.com/examples/hello-world/logo.png。这是默认的Salesforce“无软件”映像。
    这是Chatter选项卡或Canvas App Previewer中应用程序名称旁边显示的图像。如果将此字段留空,则应用程序名称旁会显示默认云图像。 appName是您刚刚创建的Heroku应用程序的名称。
  6. 在“回拨URL”字段中,输入https://appName.herokuapp.com/sdk/callback.html。 appName是您刚刚创建的Heroku应用程序的名称。
  7. 在Canvas App URL字段中,输入https://appName.herokuapp.com/examples/hello-world/index.jsp。 appName是您刚刚创建的Heroku应用程序的名称。
  8. 单击“保存”。保存画布应用程序后,将显示详细信息页面。
  9. 在Salesforce中,从“设置”中,在“快速查找”框中输入Canvas App Previewer,然后选择“Canvas App Previewer”。您可以使用Canvas应用程序预览器在重新打包之前测试您的画布应用程序。
  10. 单击左侧的Hello World链接。
    该应用程序应该出现,您将看到消息Hello User.FullName。画布应用程序在此上下文中工作,因为当您在预览器中单击应用程序名称时,已签名的请求将发送到端点https://appName.herokuapp.com/examples/hello-world/index.jsp。

在这个例子中,我们使用的是我们刚创建的相同画布应用程序,但更新它指向在Heroku上运行的“hello world”Web应用程序。因此,我们之前添加到“hello world”应用程序中的消费者秘密不需要更新。
如果要在Salesforce中创建一个新的画布应用程序,该应用程序显示在Heroku上运行的“hello world”应用程序,请转到创建画布应用程序以创建新应用程序,更新应用程序中的使用者密钥,然后将更改部署到Heroku的。

打包Canvas应用程序

现在您已经创建了画布应用程序,在Canvas应用程序预览器中对其进行了测试,并将其部署到Heroku,您已准备好打包并分发它。打包是使您的画布应用程序可以在其他组织中安装的第一步。有关打包的更多信息,请参阅ISVforce指南。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“包”,然后选择“包”并单击“新建”。
    提示:要将画布应用程序打包以在其他组织中安装,您必须创建名称空间前缀。名称空间前缀只能在Developer Edition组织中定义。有关详细信息,请参阅联机帮助中的“注册命名空间前缀”主题。
  2. 将Package Name字段设置为Hello World Package,并接受其他字段的默认值。
  3. 选择“托管”字段以使程序包成为组织的托管程序包。
  4. 出现一个提示,说明您只允许一个托管包。单击确定。
  5. 单击“保存”。
  6. 包是空的,因此单击“添加”。
  7. 在Component Type字段中,选择Connected App。
  8. 选中Hello World应用程序旁边的复选框,然后单击“添加到包”。出现包详细信息屏幕。从“设置”中,在“快速查找”框中输入“Package”,然后选择“Package”以查看新的托管包。

上传Canvas应用程序包

现在您已经打包了画布应用程序,您已准备好上传该软件包。这将创建一个安装链接,您可以向需要在其组织中安装画布应用程序的任何人提供该链接。

1.在Salesforce中,从“设置”中,在“快速查找”框中输入“Packages”,然后选择“Packages”。
2.在Packages列表中,单击Hello World Package链接。
3.在“Package Detail”页面上,单击“Upload ”以发布托管包。
4.在版本名称字段中,输入Winter 2014 Beta。保留默认版本号1.0和Managed-Beta的发布类型。
5.单击“Upload”。
注意:画布应用程序只能安装在您正在开发的组织之外的组织中。

安装Canvas应用程序

上载打包的画布应用程序会创建安装链接。然后,您可以使用此链接在其他组织中安装画布应用程序。 Beta软件包只能安装在沙盒或Developer Edition组织中,否则,您将收到错误消息。

  1. 打开浏览器并在浏览器地址栏中输入画布应用程序安装URL。如果您正在开发canvas应用程序,请确保在安装应用程序之前注销开发组织。
    安装URL类似于:
    https://login.instance.salesforce.com/services/packaging/installPackage.apexp?p0=04eU0000000AWNA。
  2. 出现提示时,输入您要在其中安装软件包的组织的登录凭据。
  3. 将显示“包安装详细信息”页面。在Package Components列表中,您应该看到Hello World画布应用程序。单击Continue。
  4. 单击Next ,然后单击Install

配置谁可以访问已安装的Canvas应用程序

您已在Salesforce组织中安装了画布应用程序,但在配置用户访问权限之前,没有人可以看到它。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“Connected Apps ”,然后选择用于管理已连接应用程序的选项。
  2. 单击Hello World应用程序,然后单击“Edit”。
  3. 在“允许的用户”字段中,选择“管理员批准的用户”已预先授权。在出现的弹出消息上单击“OK”。
  4. 单击“Save”。
    现在,您将定义谁可以看到您的画布应用程序。这可以使用配置文件和权限集来完成。在此示例中,我们将允许任何拥有系统管理员的人访问该应用程序。
  5. 在“已连接的应用程序详细信息”页面的“配置文件相关”列表中,单击“ Manage Profiles.”。
  6. 选择System Administrator配置文件,然后单击Save。
  7. 单击Chatter选项卡。
  8. 单击左侧的Hello World链接。
    该应用程序出现,您将看到消息Hello User.FullName。

画布开发(2)快速入门

学习目标

完成本单元后,您将能够了解到:

  • 先决条件
  • 创建应用程序
  • 设置应用程序位置

这个简单的快速入门向您展示了如何使用Heroku快速入门开始使用Canvas。 Heroku Quick Start在Heroku上用Java或Ruby创建一个“hello world”应用程序,具体取决于您选择的模板。 同时,它在Salesforce中创建相应的画布应用程序。

Heroku应用程序是一个“hello world”网页,它调用Canvas SDK来显示有关当前用户的信息,并允许您发布到当前用户的Chatter提要。

先决条件

您需要适当的访问和工具来完成快速启动步骤。

  • 访问Developer Edition组织。
    如果您还不是Lightning Platform开发人员社区的成员,请访问developer.salesforce.com/signup并按照注册Developer Edition组织的说明进行操作。即使您已经拥有Enterprise Edition,Unlimited Edition或Performance Edition,也可以使用Developer Edition根据示例数据开发,暂存和测试您的解决方案,以保护您组织的实时数据。对于插入,更新或删除数据的应用程序(与简单地读取数据相反)尤其如此。
    如果您有现有的Developer Edition组织,并且从安装程序中看不到菜单项Canvas App Previewer,请联系Salesforce。
  • “自定义应用程序”和“修改所有数据”用户权限。如果您是管理员,则很可能已拥有这些权限。否则,您需要添加它们,以便您可以看到Canvas应用程序预览器并创建画布应用程序。
  • Heroku帐户。转到此处创建一个Heroku帐户:https://api.heroku.com/signup。
  • Java版本1.6或1.7以运行您创建的“hello world”应用程序的本地实例。 (该应用程序的Heroku实例自动下载正确版本的Java。)

创建应用程序

在此步骤中,您将在Salesforce组织中创建Heroku“hello world”应用程序和关联的画布应用程序。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入Canvas App Previewer,然后选择“Canvas App Previewer”。
  2. 单击Heroku Quick Start。
  3. 在“模板”字段中,选择“ Java – Quick Start Template ”。
  4. 在Canvas App Name字段中,输入最多30个字符的唯一名称。
  5. 在Heroku App Name(Heroku应用程序名称)字段中,输入最多30个字符的唯一名称,该字符以字母开头,仅包含小写字母,数字和短划线。所有Heroku应用程序中的newappName必须是唯一的。此名称将成为应用程序URL的一部分,例如newappName.herokuapp.com。
  6. 在“身份验证类型”字段中,选择OAuth或API密钥。如果您已登录Heroku,Heroku OAuth会启动Heroku OAuth流程或使用Heroku令牌。在Heroku我的帐户页面上找到与您的帐户关联的API密钥。
  7. 单击“Create”。该应用程序显示在左侧导航窗格中。
    如果您看到错误“错误[读取超时]执行POST到Heroku克隆REST服务,”这意味着操作已经超时尝试联系Heroku。您可以在http://status.heroku.com上查看Heroku的状态。
    注意:如果您启用了双因素身份验证并选择了OAuth,请先输入您的Heroku用户名和密码,然后输入您的双因素身份验证信息。关闭OAuth提示并再次单击“Create”,应用程序现在将显示在导航窗格中。
  8. 单击左侧新应用程序的链接。
    该应用程序出现,您将看到消息Hello User.FullName,以及有关当前用户的其他信息。

你刚刚创建了一个画布应用程序祝贺!您只能在Canvas应用程序预览器中看到您的画布应用程序,直到您按照设置应用程序位置中的步骤设置它可以显示的位置。这定义了用户在组织中安装应用后的位置。

在幕后,Heroku快速入门设置了画布应用程序的允许用户,其中包括管理员批准的用户和您的个人资料。例如,如果您的用户配置文件是系统管理员,则该配置文件将添加到您刚刚创建的画布应用程序中,并且具有该配置文件的任何用户都可以访问画布应用程序。

我们建议您检查代码以查看画布应用程序的工作方式。该应用程序的源代码可以在Java app和Ruby app的公共GitHub存储库中找到。使用这些应用中的示例代码,了解如何在应用中解码和验证画布签名请求。

Set the App Location

在此步骤中,您将指定画布应用程序在Salesforce中向用户显示的位置。

  1. 在Salesforce应用程序中,从“设置”中,在“快速查找”框中搜索应用程序,然后在Lightforce Experience中选择应用程序管理器或在Salesforce Classic中选择已连接的应用程序。
  2. 在相关列表中,单击刚刚创建的应用程序的下拉箭头,然后单击“编辑”。
  3. 在“Canvas应用程序设置”部分的“位置”字段中,选择画布应用程序向用户显示的位置。在本演练中,选择Chatter选项卡。
    • Chatter Feed-画布应用程序显示在Feed中。如果选择此选项,则必须创建CanvasPost订阅源项并确保当前用户可以访问画布应用程序。
    • Chatter选项卡 – 画布应用程序显示在Chatter选项卡上的应用程序导航列表中。如果选择此选项,画布应用程序将自动显示在那里。
    • 控制台 – 画布应用程序显示在Salesforce控制台的页脚或侧边栏中。如果选择此选项,则必须通过将画布应用程序添加为自定义控制台组件来选择画布应用程序在控制台中显示的位置。
    • 布局和移动卡 – 画布应用程序可以显示在页面布局或移动卡上。如果选择此选项,则可以通过将画布应用程序添加到页面布局来选择画布应用程序的显示位置。
    • Mobile Nav-可从导航菜单访问画布应用程序。
    • 打开CTI – 画布应用程序出现在呼叫控制工具中。如果选择此选项,则必须在呼叫中心的定义文件中指定画布应用程序才能显示。
    • Publisher – 画布应用程序显示在Chatter发布者和操作栏中。如果选择此选项,则还必须创建画布自定义操作并将其添加到全局发布者布局或对象的页面布局。
    • Visualforce页面 – 画布应用程序可以显示在Visualforce页面上。如果添加组件以在Visualforce页面上公开画布应用程序,请确保为画布应用程序选择此位置;否则,你会收到一个错误。
  4. 单击“保存”。

由于您选择了Chatter选项卡,因此您的画布应用程序现在会显示在Chatter选项卡的左侧导航窗格中。

画布开发(1)介绍Canvas

学习目标

完成本单元后,您将能够了解到:

  • 画布场景
  • Canvas应用程序出现的位置
  • 支持的浏览器
  • 支持的Salesforce版本
  • 需要用户权限
  • 用户界面注意事项
  • Canvas App Process
  • Canvas个人应用程序

Canvas使您可以轻松地在Salesforce中集成第三方应用程序。 Canvas是一组工具和JavaScript API,可用于将应用程序公开为画布应用程序。这意味着您可以将新的或现有的应用程序作为Salesforce体验的一部分提供给用户。

您现在可以使用这些工具在Canvas中集成您的技术,而不是重新设计和重新集成外部应用程序。 Canvas包含处理以下内容的工具:

  • 身份验证 – 如果您的应用程序需要授权,则可以使用已签名的请求或OAuth 2.0来实施。
  • Context-API支持,使您可以检索有关运行画布应用程序的环境的上下文信息。
  • 跨域XHR-JavaScript支持跨域XML HTTP请求返回Salesforce域。
  • 调整大小 – 支持调整画布应用程序大小的方法。
  • Events-Events提供基于JavaScript的方式在canvas应用程序之间发送和接收事件。使用事件可在单个页面上启用多个画布应用程序之间的通信。
  • Visualforce中的Canvas应用程序 – 一个Visualforce组件,允许您在Visualforce页面上公开您的画布应用程序。
  • Publisher中的Canvas应用程序 – 允许您将画布应用程序添加为自定义操作,并将发布者扩展为包含画布应用程序。
  • Chatter Feed中的Canvas应用程序 – 允许您将画布应用程序公开为Feed项。
  • Salesforce应用程序中的画布 – 使您的画布应用程序在Salesforce应用程序中可用。

您希望作为画布应用程序公开的第三方应用程序可以使用任何语言编写。唯一的要求是应用程序具有安全URL(HTTPS)。

画布场景

从高级视图来看,有两种常见的Canvas实现方案。

  • 应用程序集成 – 您是构建云应用程序的合作伙伴,系统集成商或客户,您希望将这些应用程序与Salesforce集成。
  • 应用程序合理化/企业桌面 – 您是一个大型组织,除了Salesforce之外,还有许多用户可以访问的现有应用程序。您希望将这些应用程序集成到Salesforce中,以便用户可以在一个位置完成所有任务。

Canvas应用程序出现的位置

Canvas应用程序可以出现在几个地方。

  • 在创建它的组织中的Canvas App Previewer中
  • 在Chatter摘要中,如果您将画布应用程序编码为显示在那里,并且当前用户可以访问画布应用程序
  • 在Chatter选项卡的Chatter应用程序列表中,为任何被允许访问它的用户
  • 作为Salesforce应用程序导航菜单中的一个选项,适用于已被允许访问它的任何用户
  • 将Open CTI呼叫控制工具添加到呼叫中心的定义文件后,在其中
  • 在Chatter发布者和Salesforce应用操作栏中,如果将其配置为显示为快速操作
  • 将Salesforce控制台添加为自定义控制台组件后,在Salesforce控制台中
  • 将Visualforce页面添加到页面并将该页面提供给用户后,在Visualforce页面中
  • 在Chatter应用程序列表的“配置文件”页面中,适用于已被允许访问它的任何用户
  • 将画布应用程序添加到页面布局后,在标准或自定义对象的页面布局中。根据您将画布应用程序放置在页面布局上的位置,画布应用程序可以显示在记录详细信息页面或移动卡中。

显示已安装的画布应用程序取决于在Salesforce中创建连接的应用程序时在“位置”字段中选择的值。

  • Chatter Feed-画布应用程序显示在Feed中。如果选择此选项,则必须创建CanvasPost订阅源项并确保当前用户可以访问画布应用程序。
  • Chatter选项卡 – 画布应用程序显示在Chatter选项卡上的应用程序导航列表中。如果选择此选项,画布应用程序将自动显示在那里。
  • 控制台 – 画布应用程序显示在Salesforce控制台的页脚或侧边栏中。如果选择此选项,则必须通过将画布应用程序添加为自定义控制台组件来选择画布应用程序在控制台中显示的位置。
  • 布局和移动卡 – 画布应用程序可以显示在页面布局或移动卡上。如果选择此选项,则可以通过将画布应用程序添加到页面布局来选择画布应用程序的显示位置。
  • Mobile Nav-可从导航菜单访问画布应用程序。
  • 打开CTI – 画布应用程序出现在呼叫控制工具中。如果选择此选项,则必须在呼叫中心的定义文件中指定画布应用程序才能显示。
  • Publisher – 画布应用程序显示在Chatter发布者和操作栏中。如果选择此选项,则还必须创建画布自定义操作并将其添加到全局发布者布局或对象的页面布局。
  • Visualforce页面 – 画布应用程序可以显示在Visualforce页面上。如果添加组件以在Visualforce页面上公开画布应用程序,请确保为画布应用程序选择此位置;否则,你会收到一个错误。

支持的浏览器

Canvas支持以下浏览器的最新版本:

  • Mozilla®Firefox®(首选)
  • 谷歌Chrome™
  • Microsoft®InternetExplorer®(确保禁用兼容模式)
  • Microsoft®Edge
  • Apple®Safari®(确保将Block Cookies设置为Never)

有关特定版本和一些重要注意事项,请参阅Salesforce联机帮助中支持的浏览器主题。由于Canvas不是基于Lightning构建的,因此它仍然支持Microsoft®InternetExplorer®11。

如果您的应用使用会话Cookie,则可能需要将P3P标头设置为允许第三方Cookie或更改浏览器设置以允许所有会话Cookie。

支持的Salesforce版本

Canvas支持这些Salesforce版本:

EditionCreate a canvas appPublish a canvas appInstall a canvas app
GroupYes*NoYes*
ProfessionalYes*NoYes*
EnterpriseYesNoYes
UnlimitedYesNoYes
PerformanceYesNoYes
DeveloperYesYesYes

*如果组织中启用了配置文件和页面布局,则组和专业版只能使用或创建具有允许用户值“管理员批准的用户已预授权”的画布应用程序。

用户权限要求

创建画布应用程序并在Canvas App Previewer中查看它们需要以下用户权限:

  • “Customize Application”
  • “Modify All Data”

用户界面注意事项

画布的尺寸

画布应用程序的框架大小取决于应用程序显示的位置。使用SDK时,这些值将在Dimensions对象中返回。

注意:如果您计划在Salesforce应用程序中使用画布应用程序,请考虑移动设备屏幕大小。有关更多信息,请参阅Salesforce App中的Canvas。

Location描述
Chatter tab默认尺寸为800像素(宽)乘900像素(高)。最大尺寸为1,000像素(宽)×2,000像素(高)。
Chatter feed默认尺寸为420像素(宽)×100像素(高)。最大尺寸为420像素(宽)×400像素(高)。
Open CTI默认和最大尺寸由您设置自定义控制台组件的方式决定。
Publisher设置画布发布者操作的方式决定了默认高度。默认宽度为522像素。最大尺寸为522像素(宽)×500像素(高)。
Salesforce Console默认和最大尺寸由您设置自定义控制台组件的方式决定。
Visualforce page默认尺寸为800像素(宽)乘900像素(高)。开发人员可以通过修改apex:canvasApp组件上的属性来更改这些维度。

Logo Image

当有人安装您的画布应用程序时或在OAuth身份验证期间,当提示用户允许该应用程序运行时,将显示与画布应用程序关联的徽标图像。我们建议您使用256像素(高)×256像素(宽)的图像。

Icon Image

与画布应用程序关联的图标图像显示在这些位置。

  • Chatter选项卡上Chatter应用程序列表中画布应用程序链接的左侧
  • Canvas App Previewer中画布应用程序链接的左侧
  • 在Salesforce导航菜单中

我们建议您使用大小为60像素(宽)乘60像素(高)的图像,以便图标在移动和Salesforce站点中都能正确显示。如果您没有计划在Salesforce应用程序中显示图标,则可以使用16像素(宽)乘16像素(高)的较小图标大小。

缩略图

当有人访问Feed中的画布应用程序时,将显示与画布应用程序源项关联的缩略图图像。如果指定,此图像将显示在Feed项标题和说明旁边。

我们建议您使用尺寸为120像素(宽)×120像素(高)或更小的图像。

Canvas App Process

在创建,发布,安装和运行画布应用程序的过程中,开发人员,管理员和用户都需要执行操作,如下图所示。

Canvas Personal Apps

Canvas个人应用程序允许您创建专为跨组织的最终用户设计的连接应用程序。使用canvas个人应用程序,您可以自行安装应用程序,而无需依赖组织管理员进行分发。

以前,只有管理员可以安装画布应用程序。管理员仍然可以安装画布应用,但现在开发人员可以创建最终用户可以自行安装的画布个人应用。

最终用户可以直接从Chatter选项卡安装和使用画布个人应用程序(前提是他们在Salesforce中具有适当的权限)。当最终用户安装应用程序时,系统会提示他们允许应用程序使用其Salesforce数据。

创建画布个人应用程序类似于创建任何画布应用程序,除了:

  • 无论您是否使用OAuth或签名请求作为访问方法,系统都会提示用户在首次访问应用时批准或拒绝画布个人应用。这是因为初始访问会触发OAuth批准流程。初始访问后,将透明地识别用户,并且不会提示用户进行批准或凭据(只要他们登录到Salesforce)。
  • 使用画布个人应用程序时,仅安装应用程序的元数据,而不安装其他软件包组件(例如Apex类和Visualforce组件)。这有助于广泛安装应用程序,并允许您将应用程序的功能限制为仅限最终用户所需的功能。

有关托管和非托管软件包的信息,请参阅“ISVforce指南”中的“软件包概述”。

Canvas Personal App Process

创建画布个人应用程序与创建任何画布应用程序类似。但是,您将画布个人应用程序直接分发给最终用户,最终用户通过您提供的链接安装它,并将应用程序与Salesforce数据集成。安装应用程序后,最终用户可以直接从Chatter选项卡运行它。

以下是如何为最终用户提供canvas个人应用程序。

  1. 验证组织管理员是否已在目标组织中启用了个人应用程序。有关详细信息,请参阅在组织内启用Canvas Personal Apps。
  2. 您创建应用程序,并指定它是一个画布个人应用程序。有关详细信息,请参阅“将应用程序设为画布个人应用程序”。
  3. 最终用户单击您提供的应用程序链接。例如,链接可以是您网站上的按钮,也可以通过电子邮件发送。单击该链接可调用该应用的OAuth批准过程。以下是该应用程序链接的示例:
    https://login.salesforce.com/services/oauth2/authorize?response_type=code&client_id=<your_client_id>&redirect_uri=<your_redirect_uri>
  4. 出现提示时,最终用户批准该应用程序并允许访问Salesforce数据。
  5. OAuth批准流程以异步模式触发画布安装程序。画布安装程序从API获取应用程序的上下文信息,并安装应用程序的元数据。该应用程序安装在后台,最终用户在安装完成后会收到一封电子邮件。
    注意:仅安装了canvas个人应用程序的元数据。通常与canvas应用程序一起打包的任何其他组件都不随应用程序一起安装。这意味着用户只能获得他们需要的功能,并且安装快速轻便。但是,如果管理员选择为整个组织安装画布个人应用程序,则会安装其他软件包组件,就像使用任何画布应用程序一样。
  6. 用户通过单击Chatter选项卡中的应用程序图标开始使用画布个人应用程序。

在组织内启用Canvas个人应用程序

组织的管理员控制用户是否可以在该组织内安装画布个人应用程序。在尝试创建画布个人应用程序之前,请验证组织管理员是否已启用画布个人应用程序。

以下是组织管理员如何启用画布个人应用程序。

  1. 在“设置”中,在“快速查找”框中输入已连接的应用程序,然后选择用于管理已连接应用程序的选项
  2. 在“应用访问设置”旁边,单击“编辑”。
  3. 选中“允许用户安装画布个人应用程序”复选框。
  4. 单击“保存”。
选中“允许用户安装画布个人应用程序”复选框

管理员完成这些步骤后,您可以将画布应用程序指定为画布个人应用程序。有关详细信息,请参阅的“将应用程序设为画布个人应用程序”。

使应用程序成为Canvas个人应用程序

您(应用程序的开发人员)可以在您第一次创建应用程序时将其作为画布个人应用程序启用,或者将现有画布应用程序设置为画布个人应用程序。此过程涉及确保组织首选项处于活动状态,并在应用程序的“详细信息”页面上激活设置。

为了让你的应用程序成为一个画布个人应用程序:

  • 应用程序目标组织的管理员必须在该组织中启用画布个人应用程序。为此,请在“设置”中的“快速查找”框中输入“已连接的应用程序”,然后选择用于管理已连接应用程序的选项。
  • 您需要将应用程序作为画布个人应用程序启用,如下所示。
    1. 在“位置”字段中,选择“Chatter”选项卡。如果这是一个画布个人应用程序,Chatter Tab是唯一可以显示画布个人应用程序的位置。
    2. 在Canvas App Settings下,选中Enable as a Canvas Personal App复选框。仅当Chatter选项卡被选为应用程序的位置时,此设置才可用。

在您创建了canvas个人应用程序并提供了指向它的链接后,最终用户可以访问该应用程序并自行安装。

卸载Canvas Personal App

当用户安装并允许画布个人应用程序时,会创建刷新令牌,然后生成OAuth令牌。要阻止最终用户访问应用程序,必须撤消此刷新令牌。此操作有效地卸载了canvas个人应用程序。

以下是如何卸载画布个人应用程序。

  • 组织管理员通过“安装程序”中的“连接的应用程序OAuth使用情况”页面删除组织中一个或所有用户的刷新令牌。
  • 最终用户从其“已连接的应用”列表中撤消画布个人应用。
  • 管理员通过“设置”中的“管理应用程序”页面从组织中明确卸载画布个人应用程序。此操作会从组织中删除该应用。

如果组织管理员在安装画布个人应用程序后禁用组织内的画布个人应用程序,则画布个人应用程序将继续工作。这是因为应用程序的版本号和URL仍然存在,无论如何设置画布个人应用程序的组织首选项。

但是,管理员可以明确卸载该应用程序,将其从组织内部完全删除。