画布开发(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仍然存在,无论如何设置画布个人应用程序的组织首选项。

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

画布开发(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仍然存在,无论如何设置画布个人应用程序的组织首选项。

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

Salesforce Connect(3)外部对象

学习目标

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

  • 配置外部查找关系。
  • 配置间接查找关系。
  • 自定义外部数据的显示。
  • 为外部对象启用记录提要。
  • 在Salesforce应用程序中显示外部数据。

定义外部对象的关系

配置外部数据源和定义的外部对象后,可以使用关系字段将外部数据集成到Salesforce中。您可以为外部对象定义三种类型的关系。

  • 查找关系—将子标准,自定义或外部对象链接到父标准或自定义对象。如果外部数据包含通过18个字符的ID标识相关Salesforce记录的列,则只能使用此类关系。如果不是这种情况,请使用以下两种类型的关系之一,这对外部对象是唯一的。
  • 外部查找关系—将子标准,自定义或外部对象链接到父级外部对象。父外部对象上的标准外部标识字段的值与外部查找关系字段的值相匹配。对于子外部对象,外部查找关系字段的值来自指定的外部列名称。
  • 间接查找关系—将子外部对象链接到父标准或自定义对象。您在父对象上选择一个自定义唯一的外部ID字段,以匹配子值的间接查找关系字段,其值由指定的外部列名称确定。

该表总结了不同类型的外部对象关系。

关系类型 子对象 父对象 必须包含Salesforce ID的外部数据?
Lookup 标准,自定义或外部 标准或自定义 Yes
External Lookup 标准,自定义或外部 External No
Indirect Lookup 外部 标准或自定义 No

作为示例,我们来看看如何配置查询关系,以便将订单链接到其行项目以及Salesforce组织中的帐户。

配置外部查找关系

在之前的单位中,您可以查看Salesforce组织中的外部订单数据。回想一下,当您选择订单表进行同步时,您还选择了OrderDetails表,其中包含每个订单的订单项。通过创建从OrderDetails到订单的外部查找关系,您可以在组织中的订单页面上看到订单项。实际上,您告诉Salesforce一个对象上的字段(OrderDetails上的OrderId)对应于外部对象(Orders)上的外部ID字段。

  1. 登录到您的Salesforce Developer Edition。
  2. 从设置中,在快速查找框中输入外部对象,然后选择 External Objects.
  3. 单击 OrderDetails 外部对象。Order details screen
  4. 点击订单ID旁边的Edit 链接。Edit Order ID
  5. 点击 Change Field Type 按钮。Edit Order ID details
  6. 选择 External Lookup Relationship 然后单击下一步。外部查找关系可以将任何对象链接到外部对象。
  7. 选择 Orders 作为相关对象,然后单击 Next.Choose related external object
  8. 输入18作为长度,然后单击下一步。
  9. 要使关系对所有配置文件都可见,请选择“可见”选项,然后单击“下一步”。Specify FLS for external lookup relationship在真正的生产部署中,您将仔细分析哪些配置文件应该有权访问订单行项目。
  10. 单击 Save 以接受默认设置 – 您一定要在订单页面布局上订购详细信息相关列表!
  11. 使用应用程序菜单(左上角)启动订单。
  12. 在“最近订单”列表中单击订单的外部标识。View External ID of order
  13. 确认您看到订单的订单项列表。View line items for order

您可以点击订单项的外部ID来查看其详细信息,但是在相关列表中,我们将在此处显示订单项详细信息。

  1. 在安装程序中,使用快速查找框转到对象管理器。
  2. 点击Order对象,然后点击 Page Layouts | Order Layout.
  3. 在“订单布局”框中,单击 Related Lists.Edit layout for order details
  4. 向下滚动到OrderDetails相关列表,然后单击扳手图标。Edit layout for order details
  5. 从所选字段中删除显示URL,添加产品,数量和单价,然后单击确定。Related list properties dialog
  6. 点击页面顶部的快速保存。现在您可以在相关列表中看到订单项详细信息。

配置间接查找关系

现在您可以在订单页面上看到订单项,下一步是配置订单和帐户之间的间接查询关系。这种关系使您的用户能够查看给定订单与哪个客户关联以及给定客户的所有订单。

间接查找关系模拟外部对象与自定义或标准对象之间的外键关系。这次,您告诉Salesforce外部对象(订单上的customerId)上的字段对应于自定义或标准对象(帐户上的Customer_ID__c)上唯一的外部ID字段。这是间接查找,因为它引用标准ID字段以外的字段。

  1. 在安装程序中,使用快速查找框转到对象管理器。
  2. 点击订单对象,然后点击 Fields and Relationships.
  3. 点击客户ID旁边的修改。Edit customer ID screen
  4. 点击 Change Field Type 按钮。
  5. 选择 Indirect Lookup Relationship 然后单击 Next. 间接查找关系将外部对象(如订单)链接到标准对象(如帐户,甚至自定义对象)。
  6. 选择 Account 作为相关对象,然后单击 Next.Select account
  7. 选择 Customer_ID__c 作为目标字段的值,然后单击 Next.Select customer ID
  8. 输入18作为长度,然后单击 Next.
  9. 要使关系对所有配置文件都可见,请选择“可见”选项,然后单击 Next.
  10. 单击保存以接受默认值 – 您希望帐户页面布局上的订单相关列表!
  11. 如果应用程序菜单(右上角)未显示外部订单,请单击应用程序菜单并选择它。
  12. 点击 Orders 标签。
  13. 在“最近订单”列表中单击订单的外部标识。
  14. 确认订单在customerID字段中显示链接。
  15. 点击客户ID链接。你被带到相应的帐户页面。滚动到底部查看订单列表。Orders related list
  16. 同样,您可以自定义UI以在相关列表中显示更多有用的信息。通过单击页面右侧的灰色三角形选择Force.com快速访问菜单。
  17. 选择 Edit Layout.
  18. 向下滚动到订单相关列表,然后点击扳手图标。
  19. 从所选字段中删除显示URL,添加orderDate和shippedDate。对于“排序方式”,单击“订单日期”并选择“降序”,以便首先查看最近的订单。点击 OK.Orders related list properties
  20. 点击页面顶部的保存,向下滚动,在相关列表中查看订单日期。Account with edited list

现在您的外部订单数据与帐户无缝集成。

为外部数据启用Chatter

要将外部数据进一步集成到Salesforce组织中,让我们看看如何在订单记录上启用Chatter订阅源。在当前版本中,外部对象不可用字段跟踪;也就是说,我们不能将Salesforce配置为在其字段值更改时发布到记录的Chatter提要,但我们仍然可以启用Chatter提要。

  1. 登录到您的Salesforce Developer Edition。
  2. 从设置中,在快速查找框中输入Feed Tracking,然后选择Feed Tracking。
  3. 选择订单(请注意复数;单数订单是标准对象),请点击启用Feed追踪,然后点击保存。Enable Feed Tracking checkbox
  4. 使用应用启动器转到订单应用。
  5. 在“最近订单”列表中单击订单的外部标识。
  6. 现在订单有一个Follow按钮,用户可以点击订阅它的Chatter feed。Record feed on an external object detail page

查看Salesforce应用程序中的外部数据

当您的外部数据在您的Salesforce组织中可用时,您可以在Salesforce应用程序中查看它。

  1. 启动Salesforce应用程序。您可以在移动设备(获取应用程序)或Salesforce Mobile Simulator Chrome App上运行应用程序。如果需要,请使用Developer Edition用户名和密码登录。
  2. 点击Salesforce App Nav以打开导航菜单Salesforce App Nav。帐户和订单显示在最近列表的顶部。如果他们不在顶部,点击“更多”以显示“最近”列表中的所有对象。
    Navigation menu
  3. 点按订单查看近期订单列表。除了已配置的外部对象之外,还列出了具有相同名称的标准对象Orders。如果点击订单并查看最近没有记录,请查找其他订单对象。
    Recent orders
  4. 您在上一步中查看的订单显示在列表顶部。点击它查看其详细信息。
    Order details
  5. 点按Feed以查看订单记录的Feed和您的Feed帖子。Record feed
  6. 点击相关,然后点击OrderDetails查看订单的订单项。Related order line items
  7. 点击Salesforce应用程序的后退箭头Salesforce app's back arrow两次,然后点击Salesforce App NavSalesforce App Nav。点击帐户以查看最近的帐户列表。
  8. 点击列表中的顶级帐户,然后点击相关。向下滚动相关列表,然后点击订单查看该账户的订单。
    Orders related to the account

如您所见,您的外部数据在Salesforce应用程序中可用,就像它在整个Salesforce站点中一样,不需要额外的配置!

Salesforce Connect(2)设置

学习目标

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

  • 在您的Salesforce组织中创建外部数据源,以指定如何连接到外部系统。
  • 验证与外部系统的连接。
  • 同步以创建映射到外部系统模式的外部对象。
  • 查看外部对象。

设置概述

使用Salesforce Connect设置外部数据集成涉及到这些高级步骤。

  1. 创建外部数据源. 如果您的外部系统承载多个服务,则为每个访问数据所需的服务创建一个外部数据源。
  2. 创建外部对象及其字段。 在您的Salesforce组织中为每个要访问的外部数据表创建一个外部对象。在每个外部对象上,为要从Salesforce组织访问的每个外部表列创建一个自定义字段。

    注意

    如果外部系统允许,我们建议您同步外部数据源以自动创建相关的外部对象。您也可以选择手动定义外部对象来自定义外部对象名称并手动创建自定义字段。

  3. 定义外部对象的关系. 创建查找,外部查找和间接查找关系字段,以跨系统边界提供数据的无缝视图。
  4. 允许用户访问外部对象及其字段. 通过权限集或配置文件授予对象和字段权限。
  5. 设置用户认证. 对于使用每个用户身份验证的每个外部数据源,请执行以下两项操作。
    1. 使用户能够对外部数据源进行身份验证. 通过权限集或配置文件授予用户访问权限
    2. 设置每个用户的身份验证设置. 告诉您的用户如何设置和管理他们自己的个人设置中的外部系统的身份验证设置。或者,您可以为每个用户执行此任务。

作为此模块的一部分,您可以将示例订单数据与Salesforce Developer Edition中的现有帐户数据相集成。要完成这些步骤,您需要安装一个测试包,用于在帐户对象上配置必要的架构,创建一个Customer ID字段,并为每个帐户分配一个Customer ID值。

按照以下步骤安装软件包。

  1. 打开浏览器,点击这里 click here 开始安装。
  2. 选择 Install for Admins Only.
  3. 点击 Install.Installer for the Salesforce Connect Quickstart package
  4. 选择 External Orders 应用程序。
  5. 点击 Set Customer IDs 将客户ID号码分配到Developer Edition中的样例帐户记录。Assign Customer IDs to sample account records

您的Salesforce Developer Edition现在已经安装在本教程的主要部分。现在是整合一些数据的时候了!

连接外部数据源

作为练习,让我们连接一个可公开访问的现有OData 2.0数据源。

  1. 从安装程序中,在快速查找框中输入外部数据源,然后选择 External Data Sources.
  2. 点击 New External Data Source.
  3. 输入OrderDB作为标签。当您从标签字段中单击或远离标签时,名称字段默认为OrderDB。
  4. 选择 Salesforce Connect: OData 2.0 作为类型。
  5. 输入 https://orderdb.herokuapp.com/orders.svc/作为网址。
  6. 保留其他设置的默认值,然后单击 Save.

注意

因为这是一个示例,只读数据库,所以不需要身份验证。一个真正的外部系统可能需要一些凭证。您可以将Salesforce Connect配置为对所有数据源访问使用同一组凭据,或者为每个用户使用单独的凭据。

现在您已经配置了一个外部数据源,您可以选择您希望集成到您的Salesforce组织中的表。

创建外部对象

您可以创建或修改外部对象。

  1. 从安装程序中,在快速查找框中输入外部数据源,然后选择外部数据源,然后单击OrderDB外部数据源。
  2. 点击 Validate and Sync.

    注意

    Salesforce Connect从示例数据库中检索OData 2.0元数据并列出可用的表。点击这里查看元数据XML。

  3. 选择订单和订单明细。
    Validate External Data Source dialog
  4. 点击 Sync.

同步将创建与所选表相对应的外部对象。同步不会在Salesforce中存储任何数据。同步仅将映射定义到包含数据的外部表或存储库。这些映射使Salesforce能够访问和搜索外部数据。

注意

您可以选择手动创建外部对象。这样做使您可以自定义外部对象名称,决定为哪些表格列创建自定义字段,并自定义字段名称。从设置中,在快速查找框中输入外部对象,然后选择外部对象。

查看外部数据

连接外部数据源并定义外部对象之后,可以直接在Salesforce组织中查看外部数据。

  1. 从安装程序中,在快速查找框中输入外部数据源,然后选择 External Data Sources.
  2. 点击OrderDB外部数据源。
  3. 向下滚动到外部对象,然后单击 Orders.View external objects page
Salesforce Connect的同步进程从外部系统的模式创建此外部对象。如果您熟悉自定义对象,则会注意到外部对象看起来很相似。同步过程还创建了一组自定义字段,就像您为自定义对象创建它们一样。外部对象和自定义对象定义之间的主要区别是:

  • 外部对象API名称具有后缀__x而不是__c。
  • 外部对象具有对其外部数据源和该源内的表的引用。
  • 外部对象具有不同的标准字段。显示URL是表示外部数据库中的记录的OData 2.0 URL,而外部ID是每个记录的主键值。

External objects details page

让我们创建一个自定义选项卡,轻松访问订单记录。

  1. 从设置中,在快速查找框中输入标签,然后选择 Tabs.
  2. 单击自定义对象选项卡旁边的New 按钮。
  3. 选择Orders 作为对象
  4. 单击“选项卡样式”旁边的选择器,然后选择您喜欢的任何样式。
  5. 点击 Next.
  6. 点击 Next 以接受默认选项卡可见性设置。
  7. 点击“包含”标签旁边的复选框取消选择所有应用。
  8. 点击外部订单旁边的复选框将其选中。
  9. 点击 Save.

注意

因为还有一个名为Order的标准对象,所以现在有两个标签为Orders的选项卡。您可以通过更改对象定义中的标签来更改外部对象的选项卡名称。

您现在可以查看外部订单数据,就好像它存储在您的Salesforce组织中的自定义对象中一样。

  1. 如果应用程序菜单(右上角)未显示外部订单,请单击应用程序菜单并选择它。
  2. 点击 Orders 标签。
  3. 点击 Go! 按钮在“查看:全部”旁边。View list of external ordersSalesforce Connect从样本订单数据库中检索到前25个订单记录的订单ID。您可以像在任何其他列表视图中一样配置要显示的字段。
  4. 点击其中一个外部ID值。View details of external orderSalesforce Connect检索您选择的订单的所有字段值。
    请记住,外部数据在您的Salesforce组织中绝不会重复。 Salesforce Connect总是实时从外部系统获取当前数据。

    现在您可以在组织中看到外部数据,也可以通过创建查找关系将其链接到现有数据。你会看到如何在稍后的单位做到这一点。

设置用户认证

本机使用的示例数据库不需要认证。但是,真正的外部系统可能需要登录凭据。您有两个选项可用于设置外部数据源的用户身份验证。

  • 命名委托人—您的整个Salesforce组织在外部系统上共享一个登录帐户。
  • 每个用户—您的组织在外部系统上使用多个登录帐户。您或您的用户可以为外部系统设置个人身份验证设置。
    有关更多信息,请参阅Salesforce帮助中的外部数据源的标识类型。