従量制課金接続のコスト制約を管理する方法 (HTML)
[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]
このトピックでは、ネットワーク接続コストまたはデータ プランのステータス変更に注目し、Windows.Networking.Connectivity 名前空間のクラスを通じてこの情報をアプリで使うことにより、ローミングや指定されたデータ転送制限の超過による追加コストの発生を回避するためのベスト プラクティスを説明します。
必要条件
次の例は、JavaScript で記述されており、ネットワーク情報のサンプルに基づいています。 JavaScript を使った Windows ランタイム アプリの作成についての一般的なヘルプは、「JavaScript を使った初めての Windows ランタイム アプリの作成」をご覧ください。
ConnectionProfile がどのようなものであるかと、それが表す情報にどのようにアクセスすればよいかを知ることが重要です。詳しくは、「ネットワーク接続情報を取得する方法」をご覧ください。その他のコード例については、ネットワーク情報のサンプルをダウンロードしてください。
従量制課金接続とは
従量制課金接続は、指定されたデータ使用量に対して、またはローミングの間、ユーザーにコストが発生するネットワークです。 多くのモバイル ネットワーク プロバイダーは、データ転送量について 1 ユーザー 1 か月あたりの上限を設定しており、データの上限を超過すると (またはローミング中にデータを転送すると)、ユーザーに高額の請求が課される可能性があります。モバイル ブロードバンド テクノロジの普及が進み、データの利用需要が増えると、この問題の影響が深刻化し、データ プランが多様化することが予想されます。したがって、Windows ランタイム アプリは、このようなネットワークの制限を認識し、状況の変化に応じて動作を適応させることが求められます。
Windows 8、Windows Server 2012、Windows Phone 8.1 以降では、従量制課金接続を、無制限、定額制、変動定額制に分類しています。NetworkCostType 列挙体で、これらの値が定義されています。ほとんどのネットワークに言えることですが、データ プランで指定された上限を超過するか、ローミングを行うと、驚くほど高額な料金になるか、または極端なアクセス遮断/制限が適用されます。
モバイル ネットワークのユーザーの多くは、1 日の間に、従量制課金もそれ以外も含め、さまざまなネットワーク間を移動します。自宅やオフィスの外では、ネットワーク接続に 3G または 4G ネットワークが使われることがあります。自宅やオフィスでは、よく Wi-Fi ネットワークが利用されます。ユーザーが外出すると、これらの Wi-Fi ネットワークはやがて利用できなくなります。それどころか、一切のネットワークが利用できないこともあります。このようにネットワークが変化する状況は、Wi-Fi とモバイル ブロードバンド ネットワークの普及によって、ますます一般的になってきています。
影響が及ぶ範囲
従量制課金接続の帯域幅は適切に使わないと、アプリや組織の評判に影響します。一般的に、すべての Windows ランタイム アプリ (特に、大量のデータを転送するアプリ) は、以下のガイドラインに従う必要があります。
一般的なガイドライン
アプリでは接続の変更イベントを登録して、接続の変更 (この例ではコストまたはデータ プランの変更) を認識できます。アプリは変更が通知されると、アプリの動作を適応させるための次の決定までに、指定された ConnectionProfile にアクセスして現在の情報を確認できます。このプロセスについて詳しくは、「ネットワーク接続イベントと可用性の変更を管理する方法」をご覧ください。
従量制課金接続では、次の ConnectionCost プロパティを使って、特定の接続の情報を収集し、現在のデータ プラン設定を特定できます。
プロパティ | 説明 |
---|---|
データ プランで指定された (キャリアによって決められた) データ使用量の上限に近づいているかどうかを示す値を取得します。この制限は、一般的にはデータの上限と呼ばれます。 |
|
接続の現在のネットワーク コストを示す値を取得します。
|
|
データ プランで指定された (キャリアによって決められた) データ使用量の上限を超過したかどうかを示す値を取得します。 |
|
ホーム プロバイダーの外部のネットワークに接続しているかどうかを示す値を取得します。 |
従量制課金接続でインターネット上の接続先に接続するアプリは、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 ではモバイル ブロードバンド プロファイル用に変更する必要があります。
最大転送サイズの扱い
従量制課金接続で大きなファイルを転送すると、ユーザーの思いも寄らない高額な料金が発生することがあります。従量制課金接続でファイルを同期、アップロード、ダウンロードするアプリが、ユーザーの許可なくファイルを転送してよいのは、キャリアによって決められた最大転送サイズよりもファイルが小さいときだけです。
大量のデータを転送する際は、ユーザーの許可を得るか、制限のないネットワークにアクセスできるまで待機する必要があります。 2 回目以降はユーザーの許可を求めるメッセージを抑制するかどうかを、ユーザーが選べるようにすることもできます。
次のコード例は、接続の最大転送サイズを取得する方法を示しています。
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
サンプル