导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

Windows Phone 8 的后台文件传输最佳做法

2014/6/18

适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

本主题为使用后台文件传输的应用程序提供常规指南和最佳做法。有关后台传输服务的简介以及有关该服务的技术限制的信息,请参见 Windows Phone 8 的后台文件传输。有关创建使用后台文件传输的应用程序的分步演练,请参阅如何实现 Windows Phone 8 的后台文件传输

重要说明重要说明:

对于使用后台文件传输的应用程序,除了常规应用程序的要求之外,还必须符合其他认证要求才能在 商店 中列出应用程序。当您设计和实现应用程序时,应该考虑这些要求。有关更多信息,请参见Windows Phone 特定应用类型的其他要求

本主题包括以下部分。

使用后台文件传输的大多数应用程序都将实现以下常见的开发任务。

  • 应用程序启动之后

    • 使用 BackgroundTransferService 对象的 Requests 属性循环访问您应用程序的所有后台传输。

    • 对于每个请求,为 TransferStatusChanged 事件注册一个处理程序以便您的应用程序可以响应该应用程序正在运行时发生的状态更改。

    • 对于每个请求,为 TransferProgressChanged 事件注册一个处理程序。这对于通知用户有关活动传输进度的信息非常有用。

    • 对于每个请求,检查 TransferStatus 属性,以确定该应用程序处于非活动状态时任何传输的状态是否为“已完成”或“已更改”。

    • 使用前面提到的回调更新应用程序 UI,而不是使用计时器或其他一些轮询服务更改的机制。

  • 当您添加新的传输请求时

    • 使用 BackgroundTransferService 对象的 Add(BackgroundTransferRequest) 方法。

    • 首先,查看应用程序是否已达到每个应用程序 25 个并发传输的限制。如果已达到,则可以通知用户,提示用户等待现有传输完成或取消现有传输。也可以将有关新传输的信息存储在独立存储中,然后在将来的某些时间文件传输队列低于此限制时加载该信息并启动传输。

    • 将对 Add 的调用放置在一个 try 块中并捕获任何异常。尝试创建新的传输失败时,您应该向用户提供一个可使用的消息。

    • 使用“/shared/transfers”作为所有传输操作的本地根目录。对于文件下载,请将 DownloadLocation 属性设置为该目录中的某个文件名。这就是传输完成时文件所在的位置。对于文件上传,请将 UploadLocation 属性设置为该目录中的某个文件名以指定要上传的文件。

    • 使用 RequestUri 属性指定文件传输的远程服务器地址。后台传输服务使用 UriOriginalString 属性。因此,应该使用 Uri.EscapeUriString 方法转义 Uri 中的任何特殊字符(如果 Uri 尚未转义)。

    • 如果要传输的文件大于 100 MB,将传输的 TransferPreferences 属性设置为 None。如果未进行设置,系统会自动将传输设置更改为此值,这意味着仅当手机已连接到外部电源或拥有 Wi-Fi 连接时才会进行传输。

  • 当传输完成时

    • TransferStatus 属性将拥有值 Completed

    • 通过检查包含从目标服务器返回的 HTTP 状态代码的 StatusCode 属性确定传输是否成功。根据服务器配置,如果传输成功,则该值将为 200 或 206。建议您检查这两个值。其他任何状态代码都指示服务器错误。处理服务器错误的方式取决于您的应用程序。

    • 检查 TransferError 属性以帮助确定失败的传输未成功的原因。

    • 如果文件下载成功,您可能希望将该文件从“/shared/transfers”目录移动到独立存储中的某个新位置,以便不向将来的后台传输操作公开该文件。

    • 通过调用 BackgroundTransferServiceRemove(BackgroundTransferRequest) 方法从队列中删除传输请求。应用程序限制为 25 个并发传输请求,包括挂起的、活动的以及已完成的请求。系统不会自动删除已完成的传输。如果您删除旧传输失败且超过了应用程序限制,则当您尝试添加新的传输时会引发异常。

使用后台文件传输的应用程序应该实现以下用户界面元素。

  • 后台文件传输应该由用户启动,如通过点击某个按钮。如果用户未启动传输,则应用程序应该通知用户该应用程序正在代表用户启动传输。

  • 您必须提供允许用户查看所有后台传输的状态和传输进度的 UI。

  • 必须提供用户取消任何以及所有当前传输的机制。

  • 使用将文件传输限制为仅通过 Wi-Fi 以及在连有外部电源时进行的默认传输首选项。提供可让用户选择在没有外部电源的情况下允许通过手机网络连接进行传输的 UI。可以使用 TransferPreferences 属性设置用户的选择。

  • 如果后台传输的状态为 WaitingForExternalPowerWaitingForExternalPowerDueToBatterySaverModeWaitingForWiFiWaitingForNonVoiceBlockingNetwork,则向用户发送一条消息,通知他们传输正在等待的原因,如果适用,则通知他们恢复传输(例如连接到 Wi-Fi 网络)所需采取的步骤。

使用后台传输的应用程序应该遵循以下建议:

  • 在关联的传输操作完成之前,不要尝试访问或修改“/shared/transfers”目录中的目标文件。

  • BackgroundTransferRequest 对象的 Tag 属性可用于将关联的自定义数据与某个传输关联。应用程序可以在创建传输请求时设置值。当使用 Requests 属性或 Find(String) 方法检索传输请求时,Tag 属性将包含以前设置的数据。该属性的最大长度为 4000 个字符,但建议您保持较小的数据大小以便提高性能。

  • 访问 Requests 属性时,会创建 BackgroundTransferRequest 的新实例。若要帮助防止内存泄露,建议您避免经常(如在某个游戏循环中)访问此属性来查询请求数量。还建议您,只要不再使用返回的对象,就迅速处置它们。相同的建议也适用于 Find(String) 方法,该方法在找到提供的传输 ID 时将创建新的实例。

  • TransferStatusChangedTransferProgressChanged 事件的事件处理程序应该快速返回以便用户界面不会变得行动迟缓。从独立存储中读取以及向独立存储中写入的速度可能很慢,如果可能的话,应该在单独的工作线程上执行。

  • TotalBytesToReceive 属性指示文件下载的总大小。如果该值为 -1,则表示文件大小未知。

  • 服务器应该在 HTTP 响应标头中返回内容长度,以便让用户知道传输的大小和进度。

  • 服务器必须支持来自客户端的 Range 请求以改进性能。后台传输有可能会在进行时暂停和恢复。不支持 Range 请求将导致性能降低,因为传输一旦暂停,必须重新启动。

  • 建议您在浏览器中或者通过后台传输应用程序外部的某个其他机制测试服务器端功能以确保正常工作。

显示:
© 2014 Microsoft