daisuke_nomura の日記

Android プログラマーな鉄道ファンのブログ

Windows Phone 8でアプリ間連携を実現する

はじめに

 @daisuke_nomura です。
 Windows Phone 8では、アプリ間の連携が取れるようになりました。
 Windows 8では「コントラクト」という仕組みで、連携元のアプリから連携先のアプリにURLなどを渡しますが、その際に互いのアプリは相手を知ることができません。Windows Phone 8ではこのコントラクトがなく、連携元アプリから連携先アプリを直接呼び出します。

 

次に
 アプリ関連系で渡せるパラメータは、「文字列」もしくは「ファイル」です。 ここでは、前者の文字列について記述します。

連携の手順としては、
 1)連携先アプリで設定を行なってListen
 2)連携元アプリがメソッドを叩く
 3) 連携先アプリが起動する
となっています。 
アプリ間連携の際、連携元のアプリは連携先のアプリが受け取れるパラメータについて知っている必要があります。

 

1)連携先アプリで設定を行う
 まずは、連携先アプリで「プロトコルの登録」を行います。この登録を行わないと、 アプリは他アプリから呼び出されません。
 ソリューションの中のプロジェクトの中にあるWMAppManifest.xmlテキストエディタで開きます。(Visual Studioで開いてはいけません)
 WMAppManifest.xmlの下部に<Extensions>がありますので(ない場合は追記する)、その内部に

<Protocol Name="wpnav" NavUriFragment="encodedLaunchUri=%s" TaskID="_default"/>

を追記します。 
 Nameは登録したいプロトコル名に書き換えます。NavUriFragmentとTaskIDは固定値です。
 これでプロトコルが登録できました。この例だと、wpnavでListenしています。

 次に、App.xaml.csを書き換えます。
 App.xaml.csのInitializePhoneApplicationメソッドに、RootFrame.UriMapperにUriMapper継承クラスをインスタンスするように記述します。

RootFrame.UriMapper = new CustomURIMapper();

 このUriMapper継承クラスがインスタンス化された際、アプリが呼び出された際のパラメータであるURLエンコードされたUriが、

/Protocol?encodedLaunchUri=wpnav%3Ahogehoge//hogehogeがパラメータ

 この形式で得られるので、このUriHttpUtility.UrlDecodeメソッドを通してデコードし、パラメータを判別する処理を記述します。
 UriMapper継承クラスがreturnするUriによってアプリ起動後に表示されるページを変えることができますので、呼び出された際のパラメータを用いて遷移先のページを変更することなどで、アプリ間連携が実現できます。 

class CustomURIMapper : UriMapperBase
{
    string str = null;

    public override Uri MapUri(Uri uri)
    {
        str = HttpUtility.UrlDecode(uri.ToString());
        if (str.Contains("wpnav:"))
        {
            if (str.Contains("reject"))//ここでパラメータ判別
                uri = new Uri("/SubPage.xaml?hogehoge=reject", UriKind.Relative);
        }

        return uri;
    }
 }

 

2)連携元アプリがメソッドを叩く
 連携元アプリは、 

Launcher.LaunchUriAsync(new System.Uri("wpnav:reject"));

を叩くことで、 wpnavアプリを呼び出すことができます。これだけです。上記のパラメータ、"wpnav:hogehoge"の":"の前が呼び出したいアプリがListenしているプロトコル、":"の後ろがパラメータです。連携元は連携先のアプリのプロトコルだけでなく、どういう形式でパラメータを記述すればいいのかを知っている必要があります。
 パラメータの記述方法は各アプリによって異なるはずなのでご注意を。パラメータのURLエンコードは不要です。

 

3)連携先アプリが起動する 
 連携元アプリが裏にまわり、連携先アプリが呼び出されます。

 

さいごに
 iOSアプリ開発者の方は、iOSのアプリ間連携と似ていることに気付いたでしょうか。iOSアプリの呼び出し方との違いは、1)のプロトコル登録有無やパラメータの受け取り周りですね。Windows Phone 8になってアプリ間で連携が取れますので、開発者間でも連携して、アプリを便利にしていきましょう!

 

参考
Auto-launching apps using file and URI associations for Windows Phone 8
http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj206987(v=vs.105).aspx