XamarinでApp Links for Android

#はじめに
今、いただいているお仕事で初めてXamarin触っているので忘れないようにメモ！
簡単な内容かもしれないけど、XamarinでApp Linksの実装の公式ドキュメントが英語だったのと、実際のディレクトリなどが違ったりしました。

#やりたい事
- SMSに表示されているhttps://から始まるリンクを叩くと自アプリ起動
- リンクにパラメーターをつけて自アプリに渡す（渡した後の処理はまた別で作る）

#環境
- MacBookPro late2016
- MacOS Hight Sierra var10.13.3
- Nexsus5　Android ver6.0.1
- Visual Studio for Mac Community ver7.3.3

#手順
- intent filtersを追加
- 受信したインテントからデータを読み込む
- Digital Asset Links JSONファイル作成
- JSONファイルの配置
- 動作確認

#参考にしたサイト
- [Xamarin公式サイト App-Linking in Android 6.0](https://developer.xamarin.com/es-es/guides/android/platform_features/app-linking/#configure-intent-filter)
- [Xamarin公式サイト キーストアの MD5 または SHA1 署名の検索](https://developer.xamarin.com/ja-jp/guides/android/deployment,_testing,_and_metrics/signing/keystore-signature/)
- [【Xamain .Android】 【C#】 外部アプリから, 自アプリの カスタムURL Scheme で起動させて引数を受け取る](https://chomado.com/programming/c-sharp/xamarin-android-launch-with-url-scheme/)

#実装
## intent filtersを追加

Android公式サイトではAndroidManifest.xmlに記述と書いてあるのですが、XamarinではMainActivity.csへ記述する。

```
	[Activity (
　　 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　//省略
　　　　　　　　　　　　　　　　　　)]

    //インテントフィルター追加
    [IntentFilter(new[] { Android.Content.Intent.ActionView },
                       AutoVerify = true,
                       Categories = new[]
                       {
                            Android.Content.Intent.CategoryDefault,
                            Android.Content.Intent.CategoryBrowsable
                       },
                       DataScheme = "http",
                       DataHost = "exsample.jp",
                       DataPathPrefix = "/myApp/")]
```

自動認証を行う場合は、インテントフィルターに`autoVerify=”true”`設定を行います。

## 受信したインテントからデータを読み込む

MainActivityクラスに受信したデータを読み込む記述を追加する。

```
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
	{ //省略
            //URI情報を取得
            var action = Intent?.Action;
            var data = Intent?.Data;
//省略
}
```

## Digital Asset Links JSONファイル作成
アプリがインテントフィルタで使用されているURLドメインに属していることを確認する必要があり、そのためにSHA256のフィンガープリントが必要となります。
今回はデバッグ用のキーストアーのフィンガープリントを使用します。
公式サイトの[キーストアの MD5 または SHA1 署名の検索](https://developer.xamarin.com/ja-jp/guides/android/deployment,_testing,_and_metrics/publishing/signing-the-app-package/keystore-signature/)のページには

```
~/.local/share/Xamarin/Mono for Android/debug.keystore

```
ここにあると書いてますが私の環境には`Xamarin`のディレクトリ内に`Mono for Android`のディレクトリが見当たりませんでした。
しばらく探しましたが、諦めて、ターミナルでfindすると速攻発見！（私の1時間を返して...）

```
$ find ./ -name debug.keystore
```
以下の３件の結果から該当するキーストアの場所がわかりました。

```
.//project/Droid/debug.keystore
.//android_project/project/debug.keystore
.//.android/debug.keystore
```
そして、公式サイトに載っている以下のコマンドを使ってフィンガープリントを確認

```
keytool -list -v -keystore "キーストアーの場所"/debug.keystore -alias androiddebugkey -storepass android -keypass android
```
実行すると下記の様に確認ができます。

```
別名: androiddebugkey
作成日: 2016/10/01
エントリ・タイプ: PrivateKeyEntry
証明書チェーンの長さ: 1
証明書[1]:
所有者: CN=Android Debug, O=Android, C=US
発行者: CN=Android Debug, O=Android, C=US
シリアル番号: 56d27636
有効期間の開始日: Mon Oct 1 10:00:00 JST 2016終了日: Fri Mar 1 10:00:00 JST 2044
証明書のフィンガプリント:
	 MD5:  XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
	 SHA1: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
	 SHA256: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
	 署名アルゴリズム名: SHA256withRSA
	 バージョン: 3

拡張: 

#1: ObjectId: 2.5.29.14 Criticality=false
```

確認できたら、` SHA256`の署名を使ってDigital Asset Links JSONファイルを作成します。
Digital Asset Links JSONファイルを作成するには下記のページで作成可能です。
ちなみに、以下のページでは、Digital Assetsファイルが適切にフォーマットされてホストされていることを確認することもできます。

<img width="1384" alt="スクリーンショット 2018-02-13 0.19.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/100644/7d6a2f81-ad57-c49e-a75c-4c93189ab8b4.png">

[Google Digital Asset Links](https://developers.google.com/digital-asset-links/tools/generator)

出来上がったのがこちら

```
[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target" : { "namespace": "android_app", "package_name": "jp.co.exsample.myapp",
               "sha256_cert_fingerprints": ["XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX"] }
}]
```

## JSONファイルの配置
作成したJSONファイルを`assetlinks.json`と言う名前で保存し、Webサイトに`.well-known`と言うディレクトリを作成し、アップロードします。

<img width="645" alt="スクリーンショット 2018-02-13 0.24.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/100644/c5679679-74cc-73d7-8e52-2f60c348b2b2.png">

アップロードできているかURLを叩いて確認。
https://exsample/.well-known/assetlinks.json
## 動作確認
外部アプリから `http://exsample.jp/myApp/`を叩いて, ちゃんと 自アプリが起動するか試める。自アプリが起動すれば成功です！