如何管理按流量计费的网络成本约束 (HTML)
[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]
本主题主要讲述使用 Windows.Networking.Connectivity 命名空间中的类对网络连接成本或数据计划状态的更改保持感知,并使你的应用能够使用该信息来避免因漫游或超出指定的数据传输限制而产生额外成本的最佳做法。
先决条件
以下示例使用 JavaScript,且基于网络信息示例。 有关创建使用 JavaScript 的 Windows 运行时应用的常规帮助,请参阅创建第一个使用 JavaScript 的 Windows 运行时应用。
知道 ConnectionProfile 是什么以及如何访问它呈现的信息十分重要。有关详细信息,请参阅如何检索网络连接信息。有关其他代码示例,请下载网络信息示例。
什么是按流量计费的网络?
按流量计费的网络就是任何根据指定的数据使用量或在漫游期间向用户收取费用的网络。 大多数移动网络提供商都已经对每位用户的月数据传输量设置了上限,一旦超出该数据上限(或在漫游期间传输数据),可能会导致向用户收取巨额费用。随着移动宽带技术的日益普及,对数据消耗需求的增加将加剧这一问题的影响,从而导致出现一组更多变的数据计划。因此,Windows 运行时应用需要注意此类网络限制,并在条件发生变化时调整其行为。
Windows 8、Windows Server 2012 和 Windows Phone 8.1 和更高版本将按流量计费的网络分类为允许无限制、固定或可变的成本限制。NetworkCostType 枚举定义这些值。如果用户超出数据计划指定的上限或正在漫游,则大多数网络将通过金融手段或通过对访问的禁止或限流来实施一种急剧提高的收费。
大多数移动网络用户在一天当中可能会在不同网络(按流量计费的网络和免费网络)之间移动。不在家或办公室时,可能使用 3G/4G 网络进行网络连接。在家或办公室时,通常会有一个或多个可用 Wi-Fi 网络;同样,上述 Wi-Fi 网络最终会在用户离开家后不再可用。有时还可能没有任何可用网络。随着 Wi-Fi 和移动宽带网络使用越来越广泛,这种网络更改方案也越来越常见了。
受影响的对象
不正确使用按流量计费的网络带宽可能会影响应用和组织的信誉。通常,所有的 Windows 运行时应用(尤其是传输大量数据的应用)都需要遵循以下原则:
常规原则
你的应用可以通过注册链接更改事件来注意连接更改,在本例中是成本或数据计划更改。在收到更改通知后,你的应用可以在做出调整应用行为的决定前访问指示的 ConnectionProfile 以获得当前信息。有关此流程的说明,请参阅如何管理网络连接事件和可用性更改。
特定于按流量计费的网络方案,以下 ConnectionCost 属性可以用于收集信息和标识特定连接的当前数据计划设置:
属性 | 描述 |
---|---|
获取一个值,该值指示连接是否接近数据流量套餐指定的使用上限,此上限由运营商定义。此限制值通常称为数据上限。 |
|
获取一个值,该值指示连接的当前网络成本。
|
|
获取一个值,该值指示连接是否超过数据流量套餐指定的使用上限,此上限由运营商定义。 |
|
获取一个值,该值指示是否连接到超出家庭网络提供商范围的网络。 |
使用按流量计费的网络连接到 Internet 上的目标的应用可以直接通过调用 GetInternetConnectionProfile 并访问相关联的成本属性来获得成本信息。通过使用该信息,应用可以按照以下指南来决定如何最大程度使用网络资源:
行为 | 应用指南 | 示例 |
---|---|---|
正常 |
如果 NetworkCostType 是 Unrestricted 或 Unknown,并且 ConnectionCost 不是 Roaming,则应用应该采取 Normal 行为。 在 Normal 方案中,应用不实施限制。应用将连接费用视为 Unlimited,并且使用费用和容量约束均为 Unrestricted。 示例:
|
|
保守 |
如果 NetworkCostType 是 Fixed 或“Variable”,并且 ConnectionCost 不是 Roaming 或 OverDataLimit,则应用应采取 Conservative 行为。 在保守方案中,应用实施限制,从而优化网络使用情况以处理按流量计费网络上的传输。 示例:
|
|
选择加入 |
如果 ConnectionCost 为 Roaming 或 OverDataLimit,则应用应采取 Opt-In 行为。 对于选择加入方案,应用将处理网络访问费用显著高于套餐费用的情况。例如,当用户处于漫游状态时,移动运营商可能会收取更高的数据使用费用。 示例:
|
|
此代码示例将检查连接成本,并返回关于相应应用行为的建议。
var CostGuidance = { Normal: 0, Conservative: 1, OptIn: 2 };
// GetCostGuidance returns an object with a Cost (with value of CostGuidance),
// CostName (a string) and Reason, which says why the cost is what it is.
function GetCostGuidance()
{
var connectionCost = Windows.Networking.Connectivity.NetworkInformation.getInternetConnectionProfile().getConnectionCost();
var networkCostConstants = Windows.Networking.Connectivity.NetworkCostType;
var Retval = new Object();
if (connectionCost.roaming || connectionCost.overDataLimit)
{
Retval.Cost = CostGuidance.OptIn;
Retval.CostName = "OptIn";
Retval.Reason = connectionCost.roaming
? "Connection is roaming; using the connection may result in additional charge."
: "Connection has exceeded the usage cap limit.";
}
else if (connectionCost.networkCostType == networkCostConstants.fixed
|| connectionCost.networkCostType == networkCostConstants.variable)
{
Retval.Cost = CostGuidance.conservative;
Retval.CostName = "Conservative";
Retval.Reason = connectionCost.networkCostType == NetworkCostType.fixed
? "Connection has limited allowed usage."
: "Connection is charged based on usage. ";
}
else
{
Retval.Cost = CostGuidance.Normal;
Retval.CostName = "Normal";
Retval.Reason = connectionCost.networkCostType == networkCostConstants.unknown
? "Connection is unknown"
: "Connection cost is unrestricted";
}
return Retval;
}
Windows 应用商店应用和 Windows Phone 应用商店应用之间的行为差异
某些移动宽带提供商不会针对移动宽带在已配置文件中为用户的套餐设置成本信息。用户负责在 Windows 和 Windows Phone 上输入此成本信息。
针对移动宽带网络,成本信息的报告有所不同。在 Windows 8.1 上,如果用户未针对移动宽带设置成本信息,NetworkCostType 将会报告为 Fixed 成本。在 Windows Phone 8.1 上,如果未针对移动宽带(蜂窝数据)设置成本信息,它将会报告为 Unknown。此行为差异将影响上面有关如何检查连接成本的常规指南,并会针对相应的应用行为返回建议。通过使用上面的指南,Windows 8.1 将建议 Conservative 行为,而 Windows Phone 8.1 将建议 Normal 行为。这两个平台都应建议 Conservative 行为。因此,应在 Windows Phone 上针对移动宽带配置文件修改相应行为的常规指南。
处理最大传输大小
通过按流量计费的网络传输较大文件将导致用户的较高的意外费用。在处于按流量计费的网络上时同步、上载或下载文件的应用仅可以在文件大小小于运营商指定的最大传输大小时才可以如此操作而无需用户许可。
若要传输较大数据量的数据,则应用应获取用户许可或等到处于无限制网络时进行访问。 或者,应用程序可以允许用户跳过进一步用户许可消息。
以下示例代码介绍如何检索连接的最大传输大小:
var dataPlanStatus = InternetProfile.getDataPlanStatus();
if (dataPlanStatus.maxTransferSizeInMegabytes !== null) {
mySample.displayStatus("Maximum Transfer Size in Megabytes: " + dataPlanStatus.maxTransferSizeInMegabytes);
}
else{
mySample.displayError("Maximum Transfer Size in Megabytes: " + "Not Defined");
}
摘要
在本主题中,我们了解了按流量计费的网络方案,以及如何以最佳方式防止你的联网应用以最终用户的名义产生额外的费用。
虽然这些内容涵盖了按流量计费的网络方案,但 NetworkStatusChanged 事件也可以表示连接可用性发生变化。有关如何以最佳方式处理这些方案的详细信息和指南,请参阅如何管理网络连接事件和可用性更改。
相关主题
其他
创建第一个采用 JavaScript 的 Windows 运行时应用
参考
Windows.Networking.Connectivity
示例