如何接收链接 (HTML)
[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]
链接是用户希望共享的常见数据格式。用户有时会直接共享某个链接(如网站上的某篇文章)。当用户共享 HTML 或可能会联机提供的内容时,作为一种辅助选项,支持链接也是很有帮助的。
本主题显示如何接收从某个源应用共享的单个链接。
你需要了解的内容
技术
先决条件
- 你应当熟悉 Visual Studio 及其关联模板。
- 你应当熟悉 JavaScript。
说明
步骤 1: 支持“共享”合约
你必须首先声明你的应用支持“共享”合约,然后你的应用才能接收共享内容。此合约从根本上让系统知道你的应用可用于接收内容。如果你使用 Microsoft Visual Studio 模板创建应用,以下是支持“共享”合约的方法:
- 在设计器视图中打开清单文件 (package.manifest)。
- 打开“声明”选项卡。
- 从“可用声明”列表中,选择“共享目标”。****
- 单击“添加”****以在应用中添加对共享目标协定的支持。
步骤 2: 指定你的应用支持链接
为了支持链接,你需要指定你的应用支持 URI 格式:
- 打开清单文件。
- 在“数据格式”部分中,单击“新增”****。
- 键入"文本"(不包含引号)。
前面的步骤将以下部分添加到清单中:
<Extensions>
<Extension Category="windows.shareTarget">
<ShareTarget>
<DataFormat>uri</DataFormat>
</ShareTarget>
</Extension>
</Extensions>
注意 当为共享目标协定激活你的应用时,你可以指定一个不同的输入点。若要完成此操作,请在程序包清单中的“共享目标”声明的“应用设置”部分中修改“起始页”条目。****强烈建议你还使用一个单独的 JavaScript 文件来处理此页面的激活。例如,检查共享内容目标应用示例。
步骤 3: 添加要用来检测应用在何时激活的事件处理程序。
当用户选择你的应用来共享内容时,系统会激活你的应用。由于可通过许多方式实现该操作,因此你需要添加用来检测激活原因的代码。这可通过检查 kind 属性的值来完成。
app.onactivated = function (args) {
if (args.detail.kind === activation.ActivationKind.launch) {
// The application has been launched. Initialize as appropriate.
} else if (args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.shareTarget) {
...
}
};
如果你为共享目标协定使用某个专用起始页,那么你可以跳过检查 kind 属性
步骤 4: 获取 ShareOperation 对象。
ShareOperation 对象包含你的应用为了获取用户要共享的内容而所需的全部数据。
shareOperation = args.detail.shareOperation;
步骤 5: 快速从已激活的事件处理程序返回。
activated 事件处理程序必须快速返回。将 activated 事件处理程序中的某个异步事件排入队列,这样共享数据处理会在已激活事件返回后发生。
WinJS.Application.addEventListener("shareready", shareReady, false);
WinJS.Application.queueEvent({ type: "shareready" });
剩下的步骤将实现 shareReady
函数。
步骤 6: 查明 DataPackageView 是否包含一个 URI。
ShareOperation 对象包含一个 DataPackageView 对象。DataPackageView 对象是源应用在创建数据时所使用的 DataPackage 对象的只读版本。使用此对象来查明正在共享的内容是否包含一个链接。
if (shareOperation.data.contains(Windows.ApplicationModel.DataTransfer.StandardDataFormats.uri)) {
// Code to process URI goes here.
}
检查 DataPackage 是否包含你感兴趣的数据格式是很好的做法,即使你的应用仅支持一种格式也是如此。这更便于在以后支持其他数据格式类型和文件格式。
步骤 7: 处理链接。
要获取 URI,请调用 DataPackageView.getUriAsync 方法。
shareOperation.data.getUriAsync().then(function (uri) {
if (uri != null) {
// In this sample, we only display the URI. To output the link using this example,
// you need a div tag with an id of "output" in your HTML file.
// In your app, replace this with whatever is appropriate for your scenario.
document.getElementById("output").innerText = uri.absoluteUri;
}
});
步骤 8: 调用 reportCompleted。
在你的应用成功完成共享内容之后,请调用 reportCompleted。在你调用此方法之后,系统会关闭你的应用。
shareOperation.reportCompleted();
备注
某些应用可能会提供不以 http:// 或 https:// 开头的统一资源标识符 (URI)。例如,某个源应用可能会提供一个激活协议,该协议会直接将用户带到应用本身中的内容。如果你的应用已经可以支持任何 URI,那么默认情况下你会获得此功能。如果你的应用被限定于某些类型的 URI,那么你应该考虑以下事项:
- 如果你支持 HTML,请改为使用 DataPackage 中提供的 HTML。
- 如果你不支持 HTML,但支持文本,请使用 DataPackage 中的文本。
- 如果前面的两个选项都不适合,请考虑显示一条消息,通知用户你不支持该特定 URI。
在所有情况下,请尝试将数据的标题和描述合并到你的体验中。这样会为用户提供围绕正在共享的内容的更多上下文。
检查我们的共享内容目标应用示例代码示例以了解应用作为共享的一部分接收图像的整个端对端体验。
完整示例
var shareOperation = null;
function shareReady(args) {
if (shareOperation.data.contains(Windows.ApplicationModel.DataTransfer.StandardDataFormats.uri)) {
shareOperation.data.getUriAsync().done(function (uri) {
// In this sample, we only display the URI. To output the link using this example,
// you need a div tag with an id of "output" in your HTML file.
// In your app, replace this with whatever is appropriate for your scenario.
document.getElementById("output").innerText = "Uri: " + uri.absoluteUri;
});
}
}
app.onactivated = function (args) {
if (args.detail.kind === activation.ActivationKind.launch) {
// The app was launced. Initialize as appropriate.
args.setPromise(WinJS.UI.processAll());
} else if (args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.shareTarget) {
// This app was been activated for the Share contract
args.setPromise(WinJS.UI.processAll());
// We receive the ShareOperation object as part of the eventArgs
shareOperation = args.detail.shareOperation;
// We queue an asychronous event so that working with the ShareOperation
// object does not block or delay the return of the activation handler.
WinJS.Application.addEventListener("shareready", shareReady, false);
WinJS.Application.queueEvent({ type: "shareready" });
}
};
相关主题
Windows.ApplicationModel.DataTransfer