Flutter＆Codemagicを使用してMacなしでiOSアプリを開発および配布する方法

![remote-access-virtual-macos-build-machine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/232a98a9-8ce6-0e7d-e332-146282e392f6.png)

この投稿から、LinuxでiOSアプリを構築する方法を学びます。FlutterとCodemagicを使用すると、Macを使用せずにLinuxでiOSアプリを開発および配布できます。これにより、LinuxでのiOS開発が簡単になります。
ほとんどの場合、iOSアプリはmacOSマシンから開発および配布されます。macOSなしでiOSプラットフォーム用のアプリを開発することは想像しがたいものです。ただし、Flutterと[Codemagic](http://codemagic.io/ja/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)を組み合わせることで、macOSを使用せずにiOSアプリを開発および配布できます。 前回の投稿では、Macを使用せずにiOSアプリに[コード署名するプロセスについて説明しました](https://blog.codemagic.io/automatic-code-signing-for-ios-that-doesnt-require-a-mac/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)。この投稿では、LinuxでFlutterアプリを開発し、Codemagicでカスタム/手動コード署名を使用して、[Codemagic-Demoアプリの例でアプリ署名を完全に制御するプロセスについて詳しく説明します](https://github.com/Shashikant86/Codemagic-Demo)。
それでは、始めましょう。最初に、CI/CDツールとの関係を教えてください。

## LinuxでのFlutterアプリの開発

Flutterは、同じソースコードからiOSアプリとAndroidアプリを開発できるようにする、クロスプラットフォームのモバイルアプリケーション開発フレームワークです。ただし、iOSアプリの開発に使用されるAppleのネイティブフレームワークは、LinuxやWindowsなどの他のプラットフォームではコンパイルできません。ネイティブiOSコンポーネントには、iOSアプリの開発と配布にmacOSまたはDarwinが必要です。ただし、Flutterなどのテクノロジーを使用すると、LinuxまたはWindowsでクロスプラットフォームアプリを開発でき、Codemagic CI/CDソリューションを使用してアプリをGooglePlayストアまたはAppleAppStoreに配布できます。
FlutterとCodemagicを組み合わせることで、LinuxでのiOS開発が容易になります。


## LinuxでFlutterアプリを入手する

Androidアプリは、Linuxプラットフォームから構築、テスト、公開できます。このAndroid機能を利用して、LinuxでのFlutterアプリ開発を有効にすることができます。Codemagic-DemoというFlutterアプリがあります。そのアプリを使用して、Linux上でAndroidおよびiOS向けにビルドする方法を示します。ただし、iOSではなくLinux上のAndroidに対してのみ開発できることに注意してください。LinuxでAndroidアプリを開発している間も、AppStoreにデプロイできるiOSアプリを入手できます。さまざまな方法を使用して、Comagic-DemoをLinuxに取り込むことができます。

### Linuxマシンを入手する

Linuxがインストールされているコンピューターを既にお持ちの場合は、プロセス全体が簡単です。Linuxマシンに [Android SDK](https://developer.android.com/studio)と[Flutter](https://flutter.dev/docs/get-started/install/linux))をインストールするだけです。 [Codemagic-Demo]((https://github.com/Shashikant86/Codemagic-Demo))アプリのクローンを作成したら、すぐに作業を開始できます。


### Dockerコンテナを作成する

アプリを入手する別の方法は、[Docker](https://www.docker.com)を使用することです。Dockerエコシステムに精通している場合は、Android SDKとFlutterがインストールされた[Dockerfile](https://docs.docker.com/engine/reference/builder/)を作成できます。 Dockerhubには多くのAndroid　Dockerfileがあり、Flutter SDKでそれらのイメージを拡張する必要があります。[ここで](https://developer.android.com/studio)サンプルのAndroid　Dockerイメージを拡張する簡単なDockerfileを作成して、AndroidおよびFlutter環境をDockerコンテナーに取り込みます。 Dockerfileはアプリをコンテナーにコピーし、Flutter　Android環境を実行する必要があります。Codemagic-DemoのDockerfileの例は次のようになります：

```dockerfile
FROM runmymind/docker-android-sdk
RUN mkdir /codemagic-demo
WORKDIR /codemagic-demo
ADD . /codemagic-demo
RUN apt-get update && \
    apt-get install -y lcov git-core curl unzip && \
    git clone https://github.com/flutter/flutter.git && \
    /flutter/bin/flutter doctor && \
    apt-get remove -y curl unzip && \
    apt autoremove -y && \
    rm -rf /var/lib/apt/lists/*
ENV PATH $PATH:/flutter/bin/cache/dart-sdk/bin:/flutter/bin
RUN flutter doctor
```

このコードスニペットは説明のみを目的としていますが、必要に応じてDockerfileをカスタマイズできます。DockerfileとDockerをインストールすると、Dockerを使用してCodemagicアプリを入手できます。

```bash
docker build -t codemagic-demo .
docker run --name codemagic-demo
```

これらのコマンドを実行すると、DockerコンテナがFlutter環境で実行されます。

Dockerising Futterアプリは別のトピックですので今後の投稿で詳しく説明します。


## App Store Connectからコード署名アセットを生成する

iOSアプリにコード署名するには、Appleデベロッパアカウント、開発証明書と配布証明書、アプリID、アプリ用に作成されたプロビジョニングプロファイルが必要です。コード署名アクティビティの詳細については、 [以前の投稿](https://blog.codemagic.io/automatic-code-signing-for-ios-that-doesnt-require-a-mac/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)で説明しました。CodemagicでiOSアプリの開発またはデバッグビルド用に手動コード署名を構成するには、次のものが必要です。


- .P12形式の開発または配布証明書
- App Store ConnectまたはApple Developerポータルからプロビジョニングプロファイルをダウンロードしました
- iOSアプリのバンドル識別子

証明書とプロビジョニングプロファイルの両方を、Apple Developer Portalの[証明書]、[識別子]、および[プロファイル]セクションからダウンロードできます。


![](https://blog.codemagic.io/uploads/2019/03/image4.png 'MacなしのLinuxでのiOS開発にCodemagicを使用する')

同様に、Apple Deverloperポータルからプロビジョニングプロファイルをダウンロードできます。

![](https://blog.codemagic.io/uploads/2019/03/image3.png 'MacなしのLinuxでのiOS開発にCodemagicを使用する')

CodemagicでiOSアプリにコード署名するには、証明書とプロビジョニングプロファイルの両方が必要なので、後で使用するためにこれらのファイルを保存します。

## Xcodeプロジェクトファイルの更新 

これで、Apple Developerポータルからすべてのコード署名アセットを入手できました。次に、正しいチームとプロビジョニングプロファイルで手動のコード署名を使用するように、[Xcodeプロジェクト](https://github.com/Shashikant86/Codemagic-Demo/blob/master/ios/Runner.xcodeproj/project.pbxproj)ファイルを整理する必要があります。これは、Xcodeproj Gemを使用してRubyスクリプトを使用するか、ios/YOUR_APP.xcodeproj/project.pbxprojファイルの次のフィールドを変更するだけで実行できます。

- DevelopmentTeam = YOUR_DEVELOPMENT_TEAM_ID
- ProvisioningStyle = Manual
- PROVISIONING_PROFILE_SPECIFIER = NAME_OF_YOUR_PROVISIONING_PROFILE

Codemagic-Demoアプリでは、[ここにある](https://github.com/Shashikant86/Codemagic-Demo/blob/master/ios/Runner.xcodeproj/project.pbxproj)GitHubでXcodeプロジェクトファイルを編集する必要があります。 内部ビルドデバッグ構成とAppStoreビルドのリリース構成に対してこれらの変更を必ず行う必要があります。 project.pbxprojに値を設定すると、CodemagicからiOSアプリを問題なくデプロイする準備が整います。

## Codemagicでの手動コード署名の設定

Linuxで開発する場合、XcodeおよびiOSツールをLinuxにインストールまたは実行できないため、Androidアプリの状態しか確認できません。LinuxにSwiftおよびiOSツールを導入するために常に努力が注がれていますが、まだまだ時間がかかりそうです。アプリを配布する準備ができたら、Codemagicを使用してアプリのCI/CDを簡単に設定できます。[スタートガイド](https://blog.codemagic.io/getting-started-japanese/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)を参照してください。ここで無料のアカウントを作成できます：


[SIGN UP](https://codemagic.io/signup/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)

Codemagicでは、Apple Developerポータルからダウンロードした証明書とプロビジョニングプロファイルをアップロードすることで、[公開]セクションからiOSコード署名を有効にできます。Codemagicアプリで、[設定]→[公開]→[iOSコード署名]→[手動]に移動し、そこに証明書とプロビジョニングプロファイルをアップロードします。

![Use Codemagic for ios development on Linux without Mac](https://blog.codemagic.io/uploads/2019/03/image5.png 'MacなしのLinuxでのiOS開発にCodemagicを使用する')

ビルドを実行すると、プロビジョニングされたデバイスにデプロイできるIPAファイルの形式でiOSアプリが取得されます。Codemagicのビルドアーティファクトのリストは次のようになります：

![](https://blog.codemagic.io/uploads/2019/03/image1.png 'MacなしのLinuxでのiOS開発にCodemagicを使用する')

アーティファクトのセクションにあるように、クラッシュレポート用のcodemagic_demo.ipaファイルとdSYMsファイルを入手しました。 このアプリは、プロビジョニングプロファイルに追加された任意のiOSデバイスにインストールして、iOSアプリをテストできます。そこにバグが見つかった場合は、いつでもLinux環境に戻って、それらのバグを修正できます。

## iOSアプリをApp Storeに配布する

現在、内部でテストするためのiOSアプリのデバッグバージョンを構築しています。同様の方法で、iOSアプリをApp Storeに配布できます。アプリをAppStoreにデプロイする準備ができたら、リリースモードでアプリをビルドし、配布証明書と本番用プロビジョニングプロファイルを使用する必要があります。 同様の方法で証明書とプロファイルを生成できますが、プロビジョニングプロファイルを作成するときに必ずApp Storeディストリビューションを選択する必要があります。

![](https://blog.codemagic.io/uploads/2019/03/image6.png 'MacなしのLinuxでのiOS開発にCodemagicを使用する')

ディストリビューションプロビジョニングプロファイルは、どのデバイスでもiOSアプリを実行し、プロビジョニングプロファイルにデバイスを明示的に追加する必要はありません。App Storeプロビジョニングプロファイルは次のようになります：

![](https://blog.codemagic.io/uploads/2019/03/image2.png 'MacなしのLinuxでのiOS開発にCodemagicを使用する')

iOS配布証明書と本番用プロビジョニングプロファイルが手元にあると、以下に示すように、Codemagicの[ビルド]セクションでリリースモードを選択できます。

![](https://blog.codemagic.io/uploads/2019/03/image7.png 'Develop without Mac')

また、ビルド引数をデバッグではなくリリースに設定しました。[公開]セクションで、配布証明書と本番用プロビジョニングプロファイルをアップロードして、アプリのApp Storeバージョンを生成する必要があります。

Codemagicがビルドアーティファクトを生成したら、App Store[ガイドライ](https://developer.apple.com/ios/submit/)に従って、以前はiTunes Connectと呼ばれていたApp Store Connectにビルドし、レビューのためにアプリを送信できます。


## 結論：MacなしでiOSアプリを開発するのは簡単です

クロスプラットフォームのモバイルアプリケーション開発フレームワークとCodemagicのような魔法のCI/CDソリューションの組み合わせにより、iOSアプリ開発用のMacを所有することはまったく必須ではありません。iOS向けの開発中にアプリのデバッグに問題が発生する可能性がありますが、FlutterとCodemagicの組み合わせを使用してiOSアプリを開発し、App Storeに公開することは全く可能です。ご覧のとおり、FlutterとCodemagicの組み合わせにより、LinuxでのiOSアプリの構築がこれまでになく簡単になりました。