【Flutter】初めてのアプリリリースでハマった/躓いた点まとめ

初めてのAndroid/iOSアプリのリリースの際に、悩んだことや躓いた点が多かったので、
自分用のメモとしても、参考にしたサイトや情報をまとめてみました。

リリースしたアプリはこちらの記事で紹介していますので、よろしければご覧下さい。

https://qiita.com/yakuran1/items/89c6302452c2bdd384fb

## 広告表示を行っていないのにPermissionに広告ID(AD_ID)が含まれる

GooglePlayStoreで申請を行う際にハマった。

広告設定を追加した覚えはないのに、「アプリに広告は含まれていない」と申請するとポリシー違反となってしまった。
以下の記事で記載されている通り、Firebaseを利用しているとデフォルトで広告IDの取得を行うため、Permissionに宣言が追加されるらしい。

https://qiita.com/Nkzn/items/326ad03e358b5d3fbafc

## Firebaseの設定を環境毎に変更したい

最初から環境を分けていたわけではなかったのできつかった・・・。
以下の記事で記載されている方法で対応できた。

https://zenn.dev/altiveinc/articles/separating-environments-in-flutter

`DynamicLinks`や`GoogleSignIn`など、個別に設定ファイルに記載が必要なものについても、
上述した記事の応用で全て対応が出来たので、とても参考になった。

### 例:DynamicLinksの設定

[Firebase公式](https://firebase.google.com/docs/dynamic-links/flutter/receive?hl=ja#android)に記載されている通り、設定ファイルにホストの指定等が必要となっている。
ホストを環境毎に変える方法も、上述した記事にの応用で下記の通り出来た。

#### Android

1. `dart_defines`ディレクトリに作成した環境毎のJSONファイルにホスト(または環境毎に異なる接尾語)を定義する

   ```json:dart_defines/dev.json
   {
       "flavor": "dev",
       "appName": "(dev)AppName",
       "appIdSuffix": ".dev",
       "dynamicLinkHost": "my-app-develop.com"
   }
   ```

2. `android/app/build.gradle`の`defaultConfig`にホスト名を定義する

   ```json:dart_defines/dev.json
   defaultConfig {
       applicationId "com.example.package"
       applicationIdSuffix appIdSuffix
       ~~~
       resValue "string", "dynamic_link_host", dynamicLinkHost
   }
   ```

3. `android/app/src/main/AndroidManifest.xml`に定義したディープリンクのホストを設定する

   ```xml:android/app/src/main/AndroidManifest.xml
   <intent-filter>
       <action android:name="android.intent.action.MAIN"/>
       <category android:name="android.intent.category.LAUNCHER"/>
   </intent-filter>
   <!-- Add -->
   <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:host="@string/dynamic_link_host"
           android:scheme="https"/>
   </intent-filter>
   ```

#### iOS

1. `ios/Runner/info.plist`にディープリンクのホストを定義する

    ```plist:ios/Runner/info.plist
    <key>FirebaseDynamicLinksCustomDomains</key>
    <array>
        <string>https://$(dynamicLinkHost)</string>
    </array>
    ```

## `GoogleSignIn`がGooglePlayStoreから公開したものだけエラーになる

GooglePlayStoreのクローズドテストを実施した際にハマった。

エミュレータ、実機でのテストでは問題なく実施できたのに、
GooglePlayStoreからインストールしたアプリだけ、`PlatformException`が発生してログイン出来なかった。

GooglePlayStoreのアプリ署名が有効になっていたため、以下の手順で解決

https://joyplot.com/documents/app-bundle-platform-exception/

## Material3に則って、画像(SVG)の色を動的に変更したい

Material You (Material Design3) に則って開発を行っていく中で、画像の色を動的に変更する必要があった。
https://m3.material.io/styles/color/dynamic-color/imagery

SVGの一部色を変更するにあたって、キレイなやり方ではなかったが、以下の方法で対応できた

https://github.com/dnfield/flutter_svg/issues/372#issuecomment-886767115

FlutterのMaterial3対応でその内対応されることを祈る。

## アプリアイコンの作成

デザインを全てFigmaで作成していたので、
アプリアイコンも以下のプラグインで作成することが出来た。

https://www.figma.com/community/file/824894885635013369

## Twitter[^1]のアプリを開きたい

基本は以下の記事の通りで対応出来た。

https://qiita.com/Riscait/items/422cc22873371617c850

ただし、url_launcherの[ReadMe](https://pub.dev/packages/url_launcher#configuration)にも記載されている通り、
Android 11からは`AndroidManifest.xml`に対して利用するアプリのパッケージやそれに準ずるフィルタを追加する必要がある。

今回は`WebView`とTiwtter[^1]アプリの表示だけだったため、以下のように指定して解決

```xml:android/app/src/main/AndroidManifest.xml
<queries>
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="https" />
    </intent>
    <!-- Twitterだけ -->
 <package android:name="com.twitter.android" />
</queries>
```

## `share_plus`の共有機能がiOSだけ英語で固定されてしまう

最初はエミュレータの問題なのかと勘違いしてたけど、Issueにも挙がってた

https://github.com/fluttercommunity/plus_plugins/issues/406

`info.plist`に`CFBundleLocalizations`を追加して、アプリが対応している言語コードを追加するだけだった

   ```plist
   <key>CFBundleLocalizations</key>
   <array>
       <string>en</string>
       <string>ja</string>
       <string>it</string>
       <string>de</string>
       <string>fr</string>
   </array>
   ```



[^1]: 旧Twitter,Xのこと、パッケージ名は変更できないので直指定でも問題ないはず