言語: HTML | XAML

近接通信とタップ (XAML)

Applies to Windows and Windows Phone

目的

  

近接通信は、タップによって簡単な接続をアプリに組み込みたいと考えている開発者向けの機能です。たとえば、このようなアプリには、2 人のユーザーがデバイスを同時にタップして共有ゲーム セッションを確立するマルチプレイヤー ゲームがあります。また、デバイスをタップすると詳しい情報や商品の購入先へのリンクが示されるアプリもあります。タップ ジェスチャを使って 2 台のデバイスを接続するには、両方のデバイスに近距離通信 (NFC) 無線などの近接通信デバイスが装備されている必要があります。

また、Wi-Fi Direct によるピア参照を使って、ワイヤレス範囲内でアプリを実行している 2 台の PC どうしを接続することもできます。同様に、ピア参照を使って、Bluetooth の範囲内でアプリを実行している 2 台の Windows Phone どうしを接続できます。デバイスを接続すると、写真やリンクなどのコンテンツの共有、マルチプレイヤー エクスペリエンスの作成、メッセージの発行と受信登録を行うことができます。

このセクションの内容

トピック説明

クイック スタート: タップまたは参照によるアプリの接続

このトピックでは、アプリが、別のデバイスで実行されているアプリの別のインスタンスに近接通信で接続できるようにするために必要なコードについて説明します。

クイック スタート: タップを使ったメッセージの発行と購読

このトピックでは、PublishMessageSubscribeForMessage の近接通信 API を使って、2 台のデバイス間でタップによってメッセージを交換する方法について説明します。

アプリの近接通信のテストとトラブルシューティング

このトピックでは、アプリをストアに提出する前に、アプリ開発者がアプリの近接通信のテストとトラブルシューティングを行うためのガイドラインを示します。

 

ロードマップ: このトピックと他のトピックとの関連については、以下をご覧ください。

対象となる開発者

近接通信を使うと、タップ ジェスチャを行っている間にデータを簡単に交換できます。また、タップを使って、インフラストラクチャ ネットワーク、Wi-Fi Direct、または Bluetooth による長時間の接続チャネルを設定できます。

  • Applies to Windows Phone

  

Wi-Fi Direct を使って通信チャネルを設定することはサポートされていません。長時間の接続チャネルの設定には、インフラストラクチャ ネットワークまたは Bluetooth のみ使うことができます。

近接通信は、Windows ランタイムの Windows.Networking.Proximity 名前空間に含まれるクラスによってサポートされます。ProximityDevice クラスを使うと、4 cm 以下の近接範囲内にある他のデバイスとやり取りし、タップが行われている間に少量のデータを交換できます。PeerFinder クラスを使うと、ピア アプリとやり取りし、長時間のソケット接続を設定できます。ピア アプリは、別のデバイス上で実行されている、アプリのもう 1 つのインスタンスです。

たとえば、次のコードでは、ProximityDevice クラスの GetDefault 静的メソッドを使って、ローカル コンピューターの近接通信デバイスへの参照を取得しています。また、イベント ハンドラーを DeviceArrived イベントと DeviceDeparted イベントに関連付けて、デバイスが近接通信範囲 (デバイスから 4 cm 以内の範囲) に入ったときまたは近接通信範囲から離れたときを判定しています。


Windows.Networking.Proximity.ProximityDevice proximityDevice;

public MainPage()
{
    InitializeComponent();

    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();

    if (proximityDevice != null)
    {
        proximityDevice.DeviceArrived += ProximityDeviceArrived;
        proximityDevice.DeviceDeparted += ProximityDeviceDeparted;
    }
    else
    {
        MessageTextBlock.Text += "Failed to initialize proximity device.\n";
    }
}



    Windows.UI.Core.CoreDispatcher _dispatcher = Window.Current.Dispatcher;

private async void ProximityDeviceArrived(object sender)
{
await _dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
() =>
{
            MessageTextBlock.Text += "Proximate device arrived.\n";
});
}

private async void ProximityDeviceDeparted(object sender)
{
await _dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
() =>
{
            MessageTextBlock.Text += "Proximate device departed.\n";
});
}       


同時にタップされるデバイス間にネットワーク接続を作成する方法を示すサンプル コードについては、「クイック スタート: タップまたは参照によるアプリの接続」をご覧ください。同時にタップされるデバイス間でサイズの小さなメッセージを共有する方法を示すサンプル コードについては、「クイック スタート: タップを使ったメッセージの発行と購読」をご覧ください。PeerFinder、ProximityDevice、PeerWatcher オブジェクトを使ってマルチピア アプリ接続を作成し、範囲内のピア アプリを動的にスキャンするサンプル コードについては、近接通信に関するサンプルをご覧ください。

重要  

アプリでタップを使うには、アプリのパッケージ マニフェストで近接通信機能を有効にする必要があります。

重要  

Proximity API には、認証の機能はありません。これらの API と重要なデータを交換することは避けてください。

近接通信がサポートされているかどうかを判別する方法

既に説明したとおり、近接通信機能を使うには、PC や電話に Windows 近接通信インターフェイスを実装するデバイスがインストールされている必要があります (Windows 近接通信インターフェイスの実装について詳しくは、「Windows 8 の近距離通信実装の仕様」をご覧ください)。近接通信をサポートするデバイスがインストールされているかどうかを判別するには、PeerFinder.SupportedDiscoveryTypes プロパティを調べて Triggered 接続がサポートされているかどうかを確認する方法、GetDefault メソッドが NULL を返すかどうかを確認する方法、または the GetDeviceSelector メソッドを使ってインストール済みの近接通信デバイスの一覧を取得し、1 つ以上のデバイスが返されていることを確認する方法があります。

近接通信は、アプリがフォアグラウンドで実行されている場合にのみ有効です。

アプリをバックグラウンドに移行すると、すべての ProximityDevice 操作と PeerFinder 操作が無効になります。アプリがフォアグラウンドで実行されている場合は、メッセージの発行と受信登録のみ、またはソケット接続を開くことのみを行うことができます。ソケット接続を開いた後にアプリをバックグラウンドに移行すると、そのソケット接続は開いたままになります。

近接通信を使ったアプリのアクティブ化

PeerFinder を使い、タップしてアプリを別のデバイス上のピア アプリに接続する場合、そのアプリがまだ実行されていないときやフォアグラウンドで実行されていないときは、アプリのアクティブ化を促すメッセージがその別のデバイスのユーザーに表示されます。アプリがフォアグラウンドで既に実行されているときは、ユーザーに先にメッセージが表示されずにアクティブ化イベントが発生します。文字列パラメーターを使う PeerFinder.Start メソッドのオーバーロードを呼び出すことにより、フォアグラウンドで実行されていないアプリをアクティブ化することもできます。Start メソッドの文字列パラメーターには、ピア アプリに送信されるメッセージが含まれます。アプリは、アクティブ化引数に渡されるメッセージを使ってアクティブ化されます。

タップ ジェスチャを使ってピア アプリをアクティブ化する場合、アクティブ化の KindLaunch の状態でアプリがアクティブになります。PeerFinder.Start メソッドを使ってメッセージを送信することによってアプリをアクティブ化すると、起動引数の Arguments プロパティからメッセージ テキストを取得することができます。StreamSocket を開くためにアプリをアクティブ化すると、Arguments プロパティが文字列 Windows.Networking.Proximity.PeerFinder:StreamSocket を返します。この場合は、TriggeredConnectionStateChanged プロパティを適切なイベント ハンドラーに設定し、PeerFinder.Start メソッドを呼び出してソケット接続を完了します。次の例は、「クイック スタート: タップまたは参照によるアプリの接続」のコード例から抜粋したものであり、起動引数を渡す処理には OnLaunched イベントのコードを利用しています。


protected override void OnNavigatedTo(NavigationEventArgs e)
{
    DisplayNameTextBox.Text = Windows.Networking.Proximity.PeerFinder.DisplayName;
    Windows.Networking.Proximity.PeerFinder.ConnectionRequested += ConnectionRequested;

    // If activated from launch or from the background, create a peer connection.
    var args = e.Parameter as Windows.ApplicationModel.Activation.LaunchActivatedEventArgs;
    if (args != null && args.Kind == Windows.ApplicationModel.Activation.ActivationKind.Launch)
    {
        if (args.Arguments == "Windows.Networking.Proximity.PeerFinder:StreamSocket")
        {
            AdvertiseForPeersButton_Click(null, null);
        }
    }
}


ネットワーク ソケットを介して送信するデータの暗号化

近接通信を使って StreamSocket を開き、ネットワークを介して機密情報を送る場合、ソケットを介して送るデータを暗号化することができます。暗号化の設定について詳しくは、「SessionKey プロパティ」と「CreateSymmetricKey メソッド」をご覧ください。

ソケット通信プロトコル

StreamSocket オブジェクトを使ってピア アプリに情報を送信するときには、情報をどのように共有するかプロトコルを定義することができます。たとえば、名前と値のペアを区切った XML 形式などを使うことができます。PeerFinder クラスでピア アプリ間のソケット接続を作る場合、アプリのバージョンに関係なくアプリが接続されます。そのため、2 つの異なるバージョンのアプリ間で相互に通信を行うことがあります。たとえば、受信側のアプリが 2 つの 4 バイト値を必要としていて、そのアプリの新しいバージョンがよりサイズの大きなデータに対応するためにデータを 2 つの 8 バイト値として送信する場合、4 バイト値を必要とする受信側のアプリではデータの処理中にエラーが発生します。通信プロトコルを使い、新しいバージョンのアプリが前のバージョンのアプリとも確実に通信できるようにする必要があります。つまり、前のバージョンのアプリが、新しいバージョンのアプリから送信された新しい情報を問題が発生しないように無視できるようにします。

ヒント  

ピア アプリ間で通信するときには、多くの場合、まずどちらのアプリが最初にメッセージを送信してどちらのアプリがリッスンするかを決める必要があります。アプリがセンダーかリスナーかを決める 1 つの方法は、StreamSocket.Information.LocalAddress.CanonicalNameStreamSocket.Information.RemoteHostName.CanonicalName を比較することです。ローカル ホスト名がリモート ホスト名を超えているかどうかを確認することで、アプリの 2 つのインスタンス間で常に反対の結果を得ることができます。

関連トピック

クイック スタート: タップまたは参照によるアプリの接続
クイック スタート: タップを使ったメッセージの発行と購読
Guidelines for Proximity
アプリの近接通信のテストとトラブルシューティング
Windows.Networking.Proximity namespace
サンプル
近接通信のサンプル

 

 

表示:
© 2014 Microsoft