近接通信とタップのサポート (HTML)
[この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、 「最新のドキュメント」をご覧ください]
目的
注
近接通信は、タップによって簡単な接続をアプリに組み込みたいと考えている開発者向けの機能です。たとえば、このようなアプリには、2 人のユーザーがデバイスを同時にタップして共有ゲーム セッションを確立するマルチプレイヤー ゲームがあります。また、デバイスをタップすると詳しい情報や商品の購入先へのリンクが示されるアプリもあります。タップ ジェスチャを使って 2 台のデバイスを接続するには、両方のデバイスに近距離通信 (NFC) 無線などの近接通信デバイスが装備されている必要があります。
近接通信を使ってアプリを拡張して、近距離通信 (NFC) の使用や、ネットワークで Wi-Fi Direct を使わない 2 台のデバイスの接続ができます。近接通信と NFC を使うと、単純なタップ ジェスチャでデバイスを接続できます。2 台のデバイスを 4 センチ以内の範囲内に近づけるか、同時にタップすると、各デバイスのオペレーティング システムは互いを認識するようになります。また、Wi-Fi Direct によるピア参照を使って、ワイヤレス範囲内でアプリを実行している 2 台のデバイスどうしを接続することもできます。2 台のデバイスを接続すると、写真やリンクなどのコンテンツの共有、マルチプレイヤー エクスペリエンスの作成、またはメッセージの発行と受信登録を行うことができます。
重要
タップ接続を有効にするには、デバイスに近距離通信 (NFC) 無線デバイスなどの近接通信デバイスが装備されている必要があります。ピア参照を有効にするには、デバイスに Wi-Fi Direct をサポートする Wi-Fi デバイスが装備されている必要があります。
このセクションの内容
トピック | 説明 |
---|---|
近接通信を使うと、ユーザーは、単純なタップ ジェスチャのみで、またはワイヤレス範囲内にあるデバイスを参照して、2 つのデバイス間に接続を作成できます。ネットワークに接続している必要はありません。2 つのデバイスを同時にタップするか、Wi-Fi Direct を使って接続するだけです。 |
|
近接通信により、単純なタップ ジェスチャを使って 2 つのデバイス間でメッセージを発行、受信登録したり、デバイスに静的なタグを書き込んだりすることができます。2 つのデバイスを互いから 3 ~ 4 センチの間隔に近づけると、近接機能によってシステムに通知されます。 ここでは、近接通信を使ってメッセージの発行と受信登録を行う方法について説明します。 |
|
このトピックでは、アプリをストアに提出する前に、アプリ開発者がアプリの近接通信のテストとトラブルシューティングを行うためのガイドラインを示します。 |
対象となる開発者
近接通信は、タップまたはワイヤレス範囲内でアプリ (ピア アプリ) を実行している他のデバイスの参照によって簡単な接続を実現できるようにアプリを拡張したいと考えている開発者向けの機能です。たとえば、このようなアプリには、2 人のユーザーがデバイスを同時にタップして共有ゲーム セッションを確立するマルチプレイヤー ゲームがあります。また、デバイスをタップすると詳しい情報や商品の購入先へのリンクが示されるアプリもあります。
近接通信を使うと、タップ ジェスチャを行っている間にデータを簡単に交換できます。また、タップを使って、インフラストラクチャ ネットワーク、Wi-Fi Direct、または Bluetooth による長時間の接続チャネルを設定できます。
注
Windows Phone ストア アプリでは、Wi-Fi Direct を使って通信チャネルを設定することはサポートされていません。長時間の接続チャネルの設定には、インフラストラクチャ ネットワークまたは Bluetooth のみ使うことができます。
近接通信は、Windows ランタイムの Windows.Networking.Proximity 名前空間に含まれるクラスによってサポートされます。ProximityDevice クラスを使うと、4 cm 以下の近接範囲内にある他のデバイスとやり取りし、タップが行われている間に少量のデータを交換できます。PeerFinder クラスを使うと、ピア アプリとやり取りし、長時間のソケット接続を設定できます。ピア アプリは、別のデバイス上で実行されている、アプリのもう 1 つのインスタンスです。
たとえば、次のコードでは、ProximityDevice クラスの GetDefault 静的メソッドを使って、ローカル コンピューターの近接通信デバイスへの参照を取得しています。また、イベント ハンドラーを DeviceArrived イベントと DeviceDeparted イベントに関連付けて、デバイスが近接通信範囲に入ったときまたは近接通信範囲から離れたときを判定しています。
function id(elementId) {
return document.getElementById(elementId);
}
WinJS.Application.onmainwindowactivated = function (e) {
if (e.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {
var proximityDevice = Windows.Networking.Proximity.ProximityDevice.getDefault();
if (proximityDevice != null) {
proximityDevice.addEventListener("devicearrived",
proximityDeviceArrived, false);
proximityDevice.addEventListener("devicedeparted",
proximityDeviceDeparted, false);
}
else {
id("MessageBlock").innerHTML += "Failed to initialize proximity device.<br/>";
}
}
}
function proximityDeviceArrived() {
id("MessageBlock").innerHTML += "Proximate device arrived.<br/>";
}
function proximityDeviceDeparted() {
id("MessageBlock").innerHTML += "Proximate device departed.<br/>";
}
同時にタップされるデバイスまたはピア参照で接続されるデバイス間にネットワーク接続を作成する方法を示すサンプル コードについては、「クイック スタート: タップまたは参照によるアプリの接続」をご覧ください。同時にタップされるデバイス間でサイズの小さなメッセージを共有する方法を示すサンプル コードについては、「クイック スタート: タップを使ったメッセージの発行と購読」をご覧ください。PeerFinder、ProximityDevice、PeerWatcher オブジェクトを使ってマルチピア アプリ接続を作成し、範囲内のピア アプリを動的にスキャンするサンプル コードについては、近接通信に関するサンプルをご覧ください。
重要
アプリでタップを使うには、アプリのパッケージ マニフェストで近接通信機能を有効にする必要があります。
重要
Proximity API には、認証の機能はありません。これらの API と重要なデータを交換することは避けてください。
近接通信がサポートされているかどうかを判別する方法
既に説明したとおり、近接通信機能を利用できるようにするために、デバイスには Windows 近接通信インターフェイスを実装するデバイスがインストールされている必要があります (Windows 近接通信インターフェイスの実装について詳しくは、「Windows 8 の近距離通信実装の仕様」をご覧ください)。PeerFinder.SupportedDiscoveryTypes プロパティを調べて Triggered 接続がサポートされているかどうかを確認すること、GetDefault メソッドが NULL を返すかどうかを確認すること、またはすべての近接通信デバイスの一覧を取得して、一覧が 1 つ以上のデバイスを参照するようにすることにより、近接通信をサポートするデバイスがインストールされているかどうかを判別することができます。インストールされているすべての近接通信デバイスの一覧を取得する方法の例については、「GetDeviceSelector メソッド」をご覧ください。
近接通信は、アプリがフォアグラウンドで実行されている場合にのみ有効です。
アプリをバックグラウンドに移行すると、すべての ProximityDevice 操作と PeerFinder 操作が無効になります。アプリがフォアグラウンドで実行されている場合は、メッセージの発行と受信登録のみ、またはソケット接続を開くことのみを行うことができます。ソケット接続を開いた後にアプリをバックグラウンドに移行すると、そのソケット接続は開いたままになります。
近接通信を使ったアプリのアクティブ化
PeerFinder を使い、タップしてアプリを別のデバイス上のピア アプリに接続する場合、そのアプリがまだ実行されていないときやフォアグラウンドで実行されていないときは、アプリのアクティブ化を促すメッセージがその別のデバイスのユーザーに表示されます。アプリがフォアグラウンドで既に実行されているときは、ユーザーに先にメッセージが表示されずにアクティブ化イベントが発生します。文字列パラメーターを使う PeerFinder.Start メソッドのオーバーロードを呼び出すことにより、フォアグラウンドで実行されていないアプリをアクティブ化することもできます。Start メソッドの文字列パラメーターには、ピア アプリに送信されるメッセージが含まれます。アプリは、アクティブ化引数に渡されるメッセージを使ってアクティブ化されます。
タップ ジェスチャを使ってピア アプリをアクティブ化する場合は、Activated イベントが発生します。アクティブ化の Kind は Launch です。PeerFinder.Start メソッドを使ってメッセージを送信することによってイベントをアクティブ化すると、起動引数の Arguments プロパティからメッセージ テキストを取得することができます。StreamSocket を開くためにアプリをアクティブ化すると、Arguments プロパティが文字列 Windows.Networking.Proximity.PeerFinder:StreamSocket を返します。この場合は、TriggeredConnectionStateChanged プロパティを適切なイベント ハンドラーに設定し、PeerFinder.Start メソッドを呼び出してソケット接続を完了します。
app.onactivated = function (args) {
if (args.detail.kind === activation.ActivationKind.launch) {
if (args.detail.arguments == "Windows.Networking.Proximity.PeerFinder:StreamSocket") {
// Call PeerFinder.Start to begin multi-user mode.
}
else {
// Respond to the message string in args.detail.arguments
}
args.setPromise(WinJS.UI.processAll());
}
}
タップ ジェスチャでアクティブ化し、自動的にソケット接続を完了するアプリの例については、「クイック スタート: タップまたは参照によるアプリの接続」をご覧ください。
ソケット通信プロトコル
StreamSocket オブジェクトを使ってピア アプリに情報を送信するときには、情報をどのように共有するかプロトコルを定義することができます。たとえば、名前と値のペアを区切った XML 形式などを使うことができます。PeerFinder クラスでピア アプリ間のソケット接続を作る場合、アプリのバージョンに関係なくアプリが接続されます。そのため、2 つの異なるバージョンのアプリ間で相互に通信を行うことがあります。たとえば、受信側のアプリが 2 つの 4 バイト値を必要としていて、そのアプリの新しいバージョンがよりサイズの大きなデータに対応するためにデータを 2 つの 8 バイト値として送信する場合、4 バイト値を必要とする受信側のアプリではデータの処理中にエラーが発生します。通信プロトコルを使い、新しいバージョンのアプリが前のバージョンのアプリとも確実に通信できるようにする必要があります。つまり、前のバージョンのアプリが、新しいバージョンのアプリから送信された新しい情報を問題が発生しないように無視できるようにします。
ヒント
ピア アプリ間で通信するときには、多くの場合、まずどちらのアプリが最初にメッセージを送信してどちらのアプリがリッスンするかを決める必要があります。アプリがセンダーかリスナーかを決める 1 つの方法は、streamSocket.information.localAddress.canonicalName と streamSocket.information.remoteHostName.canonicalName を比較することです。ローカル ホスト名がリモート ホスト名を超えているかどうかを確認することで、アプリの 2 つのインスタンス間で常に反対の結果を得ることができます。
関連トピック
Windows.Networking.Proximity namespace
サンプル