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がパラメータ
この形式で得られるので、このUriをHttpUtility.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