Open10

【Flutter】AppLinksで別アプリから起動できるようにしてみる

ちっぴーちっぴー

起動したいアプリ側のAndroidManifest.xmlにドキュメントのとおり、.MainActivityを持つ<activity>の部分に記載する。

AndroidManifest.xml
+ <meta-data android:name="flutter_deeplinking_enabled" android:value="true" />
+ <intent-filter android:autoVerify="true">
+   <action android:name="android.intent.action.VIEW" />
+   <category android:name="android.intent.category.DEFAULT" />
+   <category android:name="android.intent.category.BROWSABLE" />
+   <data android:scheme="http" android:host="example.com" />
+   <data android:scheme="https" />
+ </intent-filter>

hostについてはこのあとassetlinks.jsonを置くドメインを記載しておく。

ちっぴーちっぴー

ストアに既に登録している場合、assetlinks.jsonの中身はGooglePlayConsoleの該当アプリを表示後、設定 > アプリの署名 > Digital Asset Links JSON からコピーすることができる。

手っ取り早くFirebaseHostingでも使って、<host>/.well-known/assetlinks.jsonとなるように配置する。

ちっぴーちっぴー

AppLinksが正しく設定できているかは以下のサイトで検証可能(Proxyなどがあり、Googleからのリクエストを受け取れない場合は失敗するので注意)。
https://developers.google.com/digital-asset-links/tools/generator?hl=ja

また、同様にコマンドでも検証可能。

adb shell 'am start -a android.intent.action.VIEW \
    -c android.intent.category.BROWSABLE \
    -d "http://<web-domain>/<some-root>"' \
    <package name>
ちっぴーちっぴー

他のアプリから立ち上げてみる。

ひとまず android_intent_plus を使って、律儀に飛ばしてみる。

適当なボタンウィジェットとかのアクションで以下を実行する。

const intent = AndroidIntent(
  action: 'android.intent.action.VIEW',
  category: 'android.intent.category.BROWSABLE',
  data: 'https://example.com',
  package: '<packageName>',
);
await intent.launch();
ちっぴーちっぴー

どうやら、起動したいアプリの設定から「対応するWebアドレス」を開いて、assetlinks.jsonを置いたドメインをONにする必要があるみたい。

「アプリで開きますか?」みたいな確認メッセージ的なのって、出せないんだろうか・・・。

ちっぴーちっぴー

気を取り直して、再度飛んでみる。

・・・

内部でアプリが立ち上がった。

ちっぴーちっぴー

起動したいアプリ側のAndroidManifest.xmllaunchModeを変更すると外部アプリとして立ち上がってくれる。
この変更をした場合、もはやurl_launcherでも十分になる。

AndroidManifest.xml
 <activity
  android:name=".MainActivity"
  android:exported="true"
- android:launchMode="singleTop"
+ android:launchMode="singleTask"
 </activity>

上記の修正をしない場合、flagFLAG_ACTIVITY_NEW_TASKを付与することで外部アプリとして立ち上げることができた。

 const intent = AndroidIntent(
   action: 'android.intent.action.VIEW',
   category: 'android.intent.category.BROWSABLE',
+  flags: [268435456],
   data: 'https://example.com',
   package: '<packageName>',
 );
 await intent.launch();

https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_NEW_TASK