Xamarin Advent Calendar 2016 7日目の記事です。
概要
Xamarin で作った Android アプリをブラウザから起動できるようにしてみます。
プロジェクト自体は Xamarin.Forms で作っていますが、筆者の環境の都合上、Android にしか対応してません。すまぬ。
サンプルプロジェクト
本記事のサンプルプロジェクトは以下にあげてあります。Visual Studio 2015 (要 Xamarin) で動くはず。
対応の仕方:Activity に IntentFilter 属性を付ける
Xamarin.Forms の Droid プロジェクトの中にある Activity クラスの定義が以下のようになっていると思いますが、
[Activity(....)] public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity { ....
こんな感じに IntentFilter を入れてあげると "{任意スキーム}://{名前}" のような URI 指定でアプリを開けるようになります。
.... using Android.OS; using Android.Content; .... [Activity(....)] [ // この IntentFilter 指定により、 // "hogeapp://main?param1=aaa¶m2=bbb" のような URI でアプリを開くことができるようになる. IntentFilter( new[] { Intent.ActionView }, Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable }, DataScheme = "hogeapp", DataHost = "main" ) ] public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity { ....
HTML 側
以下のようなリンクを作ってあげれば良いだけです。これをクリックすると該当アプリが立ち上がります。
<a href="hogeapp://main">Launch</a>
以下のようにパラメータを付けることもできます。
<a href="hogeapp://main?param1=aabbcc&hoge=fuga&xyz=1000">Launch</a>
アプリ側でのパラメータ受け取り
これも今回は Android 側の対応しか書けず恐縮ですが、以下のようにして起動時のパラメータを取得することができます。
if (Intent.ActionView.Equals(Intent.Action)) { Android.Net.Uri uri = Intent.Data; if (uri != null) { // "hogeapp://main?param1=aabbcc&hoge=fuga&xyz=1000" で起動されていれば // ここでは "aabbcc" という文字列が取得できる。 string param1 = uri.GetQueryParameter("param1"); } }
実行結果
今回は http://dev.clock-up.jp/hoge.html にサンプル HTML を設置して実験を行いました。
このページ内の2番目のリンクをクリックすると、
こんな感じに🍣パラメータを受け取った状態のアプリが開きます。
おしまい
この仕組みは OAuth 認証でブラウザからアプリに戻るとき等にも活躍したりします。そのあたりの解説についてはまた別の機会にでも。