情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 におけるバックグラウンド ファイル転送のベスト プラクティス

2014/06/18

対象: Windows Phone 8 および Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

このトピックでは、バックグラウンド ファイル転送を使用するアプリケーションに関する一般的なガイダンスとベスト プラクティスを示します。バックグラウンド転送サービスの概要、およびこのサービスの技術的な制約については、「Windows Phone 8 のバックグラウンド ファイル転送」を参照してください。バックグラウンド ファイル転送を使用するアプリケーションの作成手順については、「Windows Phone 8 のバックグラウンド ファイル転送を実装する方法」を参照してください。

重要:重要:

バックグラウンド ファイル転送を使用するアプリケーションは、一般的なアプリケーションの要件のほかに、ストア にアプリケーションを登録するための追加の認定要件を満たさなければなりません。アプリケーションの設計や実装を行う際には、これらの要件を考慮する必要があります。詳細については、「Windows Phone の特定のアプリの種類に関する追加の要件」を参照してください。

このトピックは、次のセクションで構成されています。

バックグラウンド ファイル転送を使用する多くのアプリケーションでは、次のような一般的な開発タスクを実装します。

  • アプリケーションの起動後

    • Requests オブジェクトの BackgroundTransferService プロパティを使用して、アプリケーションのすべてのバックグラウンド転送を反復処理します。

    • 要求ごとに、TransferStatusChanged イベントのハンドラーを登録し、実行中に起きる状態の変化にアプリケーションが対応できるようにします。

    • 要求ごとに、TransferProgressChanged イベントのハンドラーを登録します。これはアクティブな転送の進捗についてユーザーに通知するときに役立ちます。

    • 要求ごとに、TransferStatus プロパティを調べて、アプリケーションがアクティブでなかったときに転送が完了したり転送の状態が変化したりしていないかどうかを確認します。

    • タイマーやその他のしくみを使ってサービスにポーリングして変化を確認する代わりに、前述のコールバックを使用してアプリケーション UI を更新します。

  • 新しい転送要求の追加時

    • BackgroundTransferService オブジェクトの Add(BackgroundTransferRequest) メソッドを使用します。

    • まず、同時転送の数がアプリケーションごとの制限である 25 個に達していないかどうかを確認します。制限に達している場合は、ユーザーに警告を出し、既存の転送が完了するまで待つように求めるメッセージを表示するか、既存の転送を取り消すことができます。また、新しい転送に関する情報を分離ストレージに格納し、後からファイル転送キューが制限を下回った時点でこの情報を読み込んで転送を開始することもできます。

    • Add への呼び出しを try ブロックに入れて、例外が発生したらキャッチします。新しい転送の作成に失敗した場合は、その原因がユーザーにわかるようなメッセージを表示します。

    • すべての転送処理のローカル ディレクトリ ルートとして "/shared/transfers" を使用します。ファイルのダウンロードでは、DownloadLocation プロパティをこのディレクトリ内のファイル名に設定します。転送が完了すると、ファイルはこの場所に保存されます。ファイルのアップロードでは、UploadLocation プロパティをこのディレクトリ内のファイル名に設定し、アップロードするファイルを指定します。

    • RequestUri プロパティを使用して、ファイル転送用のリモート サーバーのアドレスを指定します。バックグラウンド転送サービスは、UriOriginalString プロパティを使用します。このため、Uri がまだエスケープされていない場合、Uri.EscapeUriString メソッドを使用して、Uri 内のすべての特殊文字をエスケープする必要があります。

    • 転送されるファイルのサイズが 100 MB を超える場合は、転送の TransferPreferences プロパティを None に設定します。この設定を行わないと、システムによって転送設定が自動的にこの値に変更されます。その場合は、電話が外部電源に接続されていて、Wi-Fi 接続されているときだけ転送が実行されるようになります。

  • 転送の完了時

    • TransferStatus プロパティに、値 Completed が設定されます。

    • StatusCode プロパティを調べて転送が成功したかどうかを確認します。このプロパティには、対象サーバーから返される HTTP 状態コードが格納されます。転送が成功した場合は、サーバーの構成に応じて 200 または 206 という値が格納されます。両方を確認することをお勧めします。それ以外の状態コードはサーバー エラーを示しています。サーバー エラーに対処する方法は、アプリケーションによって異なります。

    • TransferError プロパティを調べると、転送が失敗した理由を確認するのに役立ちます。

    • ファイルのダウンロードが成功したら、それ以降のバックグラウンド転送処理の影響を受けないように、ファイルを "/shared/transfers" ディレクトリから分離ストレージの別の場所に移動することをお勧めします。

    • BackgroundTransferServiceRemove(BackgroundTransferRequest) メソッドを呼び出して、キューから転送要求を削除します。アプリケーションの同時転送要求の数は、保留中の要求、アクティブな要求、および完了した要求を含めて 25 個に制限されています。完了した転送は自動的に削除されません。古い転送を削除しないままアプリケーションの制限を超えると、新しい転送を追加しようとしたときに例外がスローされます。

バックグラウンド ファイル転送を使用するアプリケーションには、次のようなユーザー インターフェイス要素を実装してください。

  • バックグラウンド ファイル転送は、ボタンをタップするなどしてユーザーが開始する必要があります。ユーザーが転送を開始しない場合は、ユーザーに代わって転送を開始することをアプリケーションがユーザーに警告する必要があります。

  • すべてのバックグラウンド転送の状態と進捗状況をユーザーが確認できるような UI を用意する必要があります。

  • 現在のどの転送でもユーザーが取り消せるようなしくみを用意する必要があります。

  • Wi-Fi 接続されていて、外部電源に接続されているときでなければファイル転送が行われないように制限する既定の転送設定を使用します。携帯電話回線経由で接続されていて、外部電源がないときでも転送を実行できるようにユーザーが設定を選択するための UI を用意します。ユーザーの選択は、TransferPreferences プロパティを使用して設定できます。

  • バックグラウンド転送の状態が WaitingForExternalPowerWaitingForExternalPowerDueToBatterySaverModeWaitingForWiFi、または WaitingForNonVoiceBlockingNetwork になっている場合は、転送が待機中になっている理由を通知し、必要に応じて、転送を再開するための手順 (たとえば、Wi-Fi ネットワークに接続するなど) を説明するメッセージをユーザーに表示します。

バックグラウンド転送を使用するアプリケーションでは、次のような推奨事項に従ってください。

  • 関連する転送処理が完了するまでは、"/shared/transfers" ディレクトリにある対象ファイルにアクセスしたり、ファイルを変更したりしないでください。

  • Tag オブジェクトの BackgroundTransferRequest プロパティを使用して、転送にカスタム データを関連付けることができます。アプリケーションは、転送要求の作成時に値を設定できます。Requests プロパティまたは Find(String) メソッドを使用して、転送要求を取得すると、Tag プロパティに以前に設定されたデータが格納されます。このプロパティの最大長は 4000 文字ですが、パフォーマンス向上のためにデータのサイズはそれより小さくすることをお勧めします。

  • Requests プロパティにアクセスすると、BackgroundTransferRequest の新しいインスタンスが作成されます。メモリ リークを防ぐために、ゲーム ループなどで、要求数を照会するためにこのプロパティに頻繁にアクセスしないようにすることをお勧めします。また、返されたオブジェクトは、使用しなくなったら直ちに破棄することをお勧めします。指定された転送 ID が見つかるたびに新しいインスタンスを作成する Find(String) メソッドにも同じ推奨事項が当てはまります。

  • ユーザー インターフェイスの反応が鈍くならないように、TransferStatusChanged イベントおよび TransferProgressChanged イベントのイベント ハンドラーはすぐに制御を返す必要があります。分離ストレージの読み取りと書き込みには時間がかかる場合があるので、可能であれば独立したワーカー スレッドで実行します。

  • TotalBytesToReceive ロパティは、ダウンロードされるファイルの合計サイズを示します。この値が -1 の場合は、ファイル サイズが不明です。

  • HTTP 応答ヘッダーで Content-length を返すようにサーバーを構成し、転送のサイズと進捗状況がユーザーにわかるようにします。

  • パフォーマンス向上のために、サーバーでクライアントからの Range 要求をサポートする必要があります。バックグラウンド転送の実行中に、転送が一時停止して再開することがよくあります。Range 要求をサポートしないと、一時停止するたびに転送を再始動する必要があるのでパフォーマンスが低下します。

  • ブラウザーを使用するか、バックグラウンド転送アプリケーション以外の何らかのしくみを使用してサーバー側の機能をテストし、機能が正常に動作しているかどうかを確認することをお勧めします。

表示: