[WinRT] 独自プロトコルを使ってストアアプリ間で通信する

ってことで、ストアアプリ間で通信を行います。共有コントラクトを使うと相手先を選択しないといけないし、デスクトップアプリ経由(WCFサーバー経由)だとアプリのインストールが必要だし、というわけで、ひとまず、手軽なアプリ間通信は「プロトコル」を使えます。まあ、ワンクッションだけなんですけどね。双方向にプロトコルを設定しておけば、それなりに通信はできるかと。

■送信先のアプリ

ターゲットアプリでは、App.xaml.cs でプロトコルを受けます。OnActivated をオーバーライドして、種別がプロトコル ActivationKind.Protocol の時に処理をするという感じです。
ここでは、画面に表示させるために new Frame をしていますが、アプリ内部で処理する場合は、クラス変数にするのがよいかと。

protected override void OnActivated(IActivatedEventArgs args)
{
    if (args.Kind == ActivationKind.Protocol)
    {
        var ar = args as ProtocolActivatedEventArgs;
        var rootFrame = new Frame();
        rootFrame.Navigate(typeof(BasicPage));
        Window.Current.Content = rootFrame;
        BasicPage p = rootFrame.Content as BasicPage;
        p.UpdateMsg(ar.Uri);
    }
    Window.Current.Activate();
}

プロトコル自体は、マニフェストで設定します。

■送信元のアプリ

private void Button_Click(object sender, RoutedEventArgs e)
{
    string text = this.text1.Text;
    var ret = Windows.System.Launcher.LaunchUriAsync(new Uri(
        "mm-message://" + text));
}

独自に作った「mm-message://」プロトコルを使って、LaunchUriAsync メソッドで呼び出します。ここではテキストしか送っていませんが、ファイル名を送って受信側で処理すれば、ファイルや画像などを送ることも可能です。ファイルに関しては、マイドキュメントを使うとかマイピクチャを使うとかがあるので、まあ、ちょっと細工が必要ですが。

■試してみる

プロトコルなのでURLエンコードをしないと駄目なんですが、通常のアルファベットならばそのまま送ることもできます。

サンプルはこちら
http://sdrv.ms/15cIv1G

カテゴリー: C#, WinRT パーマリンク