Flutterプロジェクトの Company domain を変更する

公式サンプルや動画コースでFlutterを勉強しているのですが、作り進めたFlutterプロジェクトのCompany domainを後から変更したい場面に遭遇しました。

AndroidアプリもiOSアプリも作ったことのないド素人だったので設定に少し手間取ってしまいました。きっと同じような人いるだろうなと思ったので記事に残します。

# 変更箇所

Flutterプロジェクトは一つですが、Androidアプリ用の変更箇所とiOSアプリ用の変更箇所があるようでした。
また、下記サンプルは`i_am_rich`プロジェクトのCompany domainを`example.com`から`hogehoge.com`に変更する例を紹介します。
基本的には、Android Studioにて新規にFlutterプロジェクトを生成してから、それほど大きな開発を進めていない状態になっているので、一般的な構造になっていると思います。

# Androidアプリ用

Androidアプリ用には、ファイル内の記述とディレクトリ名を変更する必要があります。

## 1. ビルド定義の変更

プロジェクト内 `android/app/build.gradle/build.gradle` の `applicationId`を変更します。

```gradle
    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.example.i_am_rich"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
``` 
↓ 

```gradle
    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.hogehoge.i_am_rich"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
``` 

## 2. MainActivityパッケージの変更

プロジェクト内 `android/app/src/main/kotlin/com/example.i_am_rich/MainActivity.kt` 内の `package`を変更します。

```kotlin
package com.example.i_am_rich

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }
}
```
↓

```kotlin
package com.hogehoge.i_am_rich

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }
}
```

また、ファイルの格納されているディレクトリ名も下記のように変更します。
`android/app/src/main/kotlin/com/example.i_am_rich/MainActivity.kt`
↓
`android/app/src/main/kotlin/com/hogehoge.i_am_rich/MainActivity.kt`

## 3. マニフェストファイル設定値の変更

2で行ったパッケージの変更をマニフェストファイル(`AndroidManifest.xml`)に反映します。
このファイルは下記の3ディレクトリに同様のファイルが作られていると思うので全て変更します。

- `android/app/src/main/AndroidManifest.xml`
- `android/app/src/profile/AndroidManifest.xml`
- `android/app/src/debug/AndroidManifest.xml`

```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.i_am_rich">
```
↓

```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hogehoge.i_am_rich">
```

# iOSアプリ用

iOSアプリ用にはIdentifierの設定を変える必要があります。

## Identifier設定の変更

プロジェクト内の`ios`ディレクトリをXcodeで開きます。

Android Studioを使っている場合は`ios`ディレクトリを`右クリック`→`Flutter`→`Open iOS module in Xcode`で開くと思います。

左のナビゲーターから`Runner`を選択すると下記画像のように表示されはずです。
このカーソルがあたっている`Bundle Identifier`の項目を変更してください。

![Identifier_change.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401312/c5cf4aa1-f494-95d4-fbd3-ba39732f463c.png)

# Android Studioを使うときのTIPS

[2. MainActivityパッケージの変更](#2-mainactivityパッケージの変更)にてディレクトリ名の変更を行う際、Android Studioで行う場合は `右クリック`→`Refactor`→`Rename`ではドメインまで変更できません。

`右クリック`→`Refactor`→`Move`を使ってください。
もちろん、Finder等のエクスプローラで開きなおして直接変更しても大丈夫です。

# おわりに

上記で自分は動きました！
ただ、まだまだ学びたてでより複雑なパターンがあるのかもしれないので、アップデートあればどんどん加筆していきます。

# 参考
https://stackoverflow.com/questions/58679233/how-to-change-company-domain-name-in-flutter