🔰

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

2023/08/02に公開

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

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

https://zenn.dev/yakuran1/articles/be126a719023b9

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

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

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

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

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

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

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

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

例:DynamicLinksの設定

Firebase公式に記載されている通り、設定ファイルにホストの指定等が必要となっている。
ホストを環境毎に変える方法も、上述した記事にの応用で下記の通り出来た。

Android

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

    dart_defines/dev.json
    {
        "flavor": "dev",
        "appName": "(dev)AppName",
        "appIdSuffix": ".dev",
        "dynamicLinkHost": "my-app-develop.com"
    }
    
  2. android/app/build.gradledefaultConfigにホスト名を定義する

    dart_defines/dev.json
    defaultConfig {
        applicationId "com.example.package"
        applicationIdSuffix appIdSuffix
        ~~~
        resValue "string", "dynamic_link_host", dynamicLinkHost
    }
    
  3. android/app/src/main/AndroidManifest.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にディープリンクのホストを定義する

    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にも記載されている通り、
Android 11からはAndroidManifest.xmlに対して利用するアプリのパッケージやそれに準ずるフィルタを追加する必要がある。

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

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.plistCFBundleLocalizationsを追加して、アプリが対応している言語コードを追加するだけだった

<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>ja</string>
    <string>it</string>
    <string>de</string>
    <string>fr</string>
</array>
脚注
  1. 旧Twitter,Xのこと、パッケージ名は変更できないので直指定でも問題ないはず ↩︎ ↩︎

GitHubで編集を提案

Discussion