【Mac不要】.NET製iOSアプリをiPhone実機配備する手順

2023/12/02 追記

Xamarin.Forms の後継である MAUI を使った記事を投稿しました。
* [【Mac不要】.NET MAUI 製 iOS アプリを iPhone に手軽にデバッグ配備する手順](https://qiita.com/kami_teru/items/b2a6bd77f7c836ae3d1e)

# 前提

この記事は、以下に当てはまる人向けの iPhone/iPad アプリを開発する手順を紹介します。

* iPhone / iPad を使っている
* 開発機はWindowsだ
* <font color="Red">**Macを持っていない**</font>
* .NET言語で開発したい。または、「それも悪くない」。
* Apple Developer Programに既に登録している、または年間で約12,000円を支払えるクレジットカードまたはデビットカードを持っていて、支払い後に最大48時間待ってやるのも悪くない。※1

※1: 2020/03/25現在。

# はじめに

私はその前提に当てはまっていて、長らくiPhoneアプリの開発をあきらめていた一人でした。なぜなら、インターネットで見つかる丁寧な記事、Apple, Microsoftの文書、それらは必ずどこかで、Macを手に入れるようにと私をナビゲートしたのです。いや、まだそこまで本気じゃないし・・・。

この記事を見つけたあなたもきっとそんな一人。いや、そうに違いありません。
では早速、手順を始めましょう。

**謝辞:**

この記事を作成するにあたり、以下のページを参考にさせていただきました。
[How to Create an iOS Provisioning Profile and P12 with Windows](https://www.joshmorony.com/how-to-create-an-ios-provisioning-profile-and-p12-with-windows/)
上記のページが公開されていなければ、私がこの方法にたどり着くことはありませんでした。ありがとうございます。

# 目次

1. 下準備を行います。
* Visual Studioで、Xamarin.Formsのプロジェクトを作成し、開発します。
* Windows用OpenSSLを利用し、[Apple Developer](https://developer.apple.com/)から証明書を入手します。
* [Apple Developer](https://developer.apple.com/)で、プロビジョニングファイルを作成します。
* [Visual Studio App Center](https://appcenter.ms/)で、実機用にビルドします。
* [Visual Studio App Center](https://appcenter.ms/)から、iPhone/iPadにアプリを直接インストールします。

# 1. 下準備

### Apple Developer Programに登録する

もし、まだApple Developer Programに登録していなければ、先に登録し、支払いを済ませておきましょう。問題がなければ、支払い後最大48時間で、Apple Developer Programが利用可能になるようです。（私はきっちり48時間~~待たされ~~待ってやりました）

[Apple Developer Program](https://developer.apple.com/)

※途中から英語のサイトに切り替わりますが、最初の日本語の説明は丁寧でわかりやすく、私は特に詰まることなく登録することができました。

### Visual Studio App Centerのアカウントを作成する

もし、まだVisual Studio App Centerのアカウントがなければ、作成しましょう。無料で作成することができます。

[Visual Studio App Center](https://appcenter.ms/)

### Windows用OpenSSLをインストールする

OpenSSLは、オープンソースですが、公式ではソースコードのみが公開されています。
従って、Windows用のバイナリは、公式サイト以外から入手する必要があります。

入手にあたり、以下の記事が参考になりましたので紹介します。
[WindowsにOpenSSLをインストールして証明書を取り扱う（基本編） - @IT](https://www.atmarkit.co.jp/ait/articles/1601/29/news043.html)

### VisualStudioをインストールする

本記事の内容は、Visual Studio 2019 Community Edition (version 16.5.0)で検証しました。
Visual Studio Installerでは、以下のワークロードを選択してインストールしてください。

* .NET によるモバイル開発 

*この時、ワークロード選択のページの右側「インストールの詳細」に、「Android SDK セットアップ」が出てきますが、<font color="Red">Macを持たない私たちは、選択を外してはいけません</font>。その理由は後ほど。*

# 2. Xamarin.Formsのプロジェクトを開発

プロジェクトを作成する際は、「モバイルアプリ(Xamarin.Forms)」のテンプレートを選択します。
似たものに「Xamarin.iOS」がありますが、こちらは画面のデザインにMacが必要になってしまいます。

とはいえ「Xamarin.Forms」でも、画面デザインのiOS向けプレビューにはMacが必要です。そこで代わりに、Android向けのプレビュー機能を利用します。*(Macを持たない私たちは、Android SDKをインストールしたはずです)*

*※ところがこれが割と調子が悪く、よく描画エラーが起こります。そんな時は、Androidエミュレータデバッグを利用して、画面デザインを確認します。*

*※Xamarin.Formsは複数のプラットフォームで1つの画面デザインを利用できるのがウリですが、それでも若干のズレは発生します。それは後述の実機インストール後のテストで潰す、といった割り切りが大切になります。*

またiOSに依存する機能を含む場合、Androidエミュレータを利用した動作確認が行き詰まってしまうかもしれません。その場合は「クロスプラットフォーム開発」の手法を使って依存性解決を図るアプローチをお勧めします。やり方は以下の記事を参考にしてください。

[.NET+ReactiveUIでXamForms,WPF,WinFormsのクロスプラットフォーム開発やってみた](https://qiita.com/kami_teru/items/15934fef6b09c5423deb)
→Dependencies, EntryPointの項。

開発が進み、いよいよ実機テストへ、となりましたら、リリースビルド用のソリューションファイルを作成します。このソリューションファイルは、Xamarin.Forms.iOSのリリースビルドに必要なプロジェクトのみで構成してください。(Xamarin.Forms.Androidはリリースビルドを阻害してしまいます)

# 3. 署名に必要な公開鍵、秘密鍵の作成

iOSの実機で動作させるためには、署名されたアプリケーションパッケージが必要です。その署名には秘密鍵が必要です。また実機にインストールするためには公開鍵の配付が必要です。公開鍵の作成には、証明書が必要です。

これらの作成は、MacがあればGUIで作業できますが、Macを持たない私たちは、コマンドを利用して作業することができます。

「ツール > コマンドライン > 開発者用PowerShell」を起動しましょう。
最初に、インストールしたOpenSSLのbinフォルダにパスを通しておきましょう。

```powershell
#実際にインストールしたパスを指定すること。先頭の";"を忘れないこと！
$Env:Path += ";C:\Program Files\OpenSSL-Win64\bin\"
```

以下の情報で作成するものとします。
**メールアドレスは、Apple IDの登録に使用しているものを正しく入力してください**

```
アプリケーション名: MyApp.iOS
発行者: kami_teru
発行者のメールアドレス: kami_teru@example.com　　
```

### 秘密鍵(*.key)の作成

RSA, 2048bit で作成します。

```powershell
openssl genrsa -out MyApp.iOS.key 2048
```

### 証明書署名要求(*.csr)の作成

秘密鍵、メールアドレス、発行者名(CN)、国コード(C)を指定して作成します。

```powershell
openssl req -new -key MyApp.iOS.key -out MyApp.iOS.csr -subj "/emailAddress=kami_teru@example.com, CN=kami_teru, C=JP"
```

### 証明書の発行依頼と証明書(*.cer)のダウンロード

[Apple Developer](https://developer.apple.com/)にサインインし、[Certificates](https://developer.apple.com/account/resources/certificates/list)のページにアクセスします。

1. Certificateの追加ボタンを押す
* 「iOS App Development」を選択し、Continue。
* 「Choose File」に```MyApp.iOS.csr```を選択し、Continue。
* 「Download」ボタンをを押し、ファイルを```MyApp.iOS.cer```という名前で保存する。

### 証明書を格納するPEM形式のコンテナ(*.pem)を作成

PEM形式のコンテナは、超ざっくり説明すると、カギのかかっていない入れ物です。*(テキスト形式なので、興味があればテキストエディタで覗いてみてください。"CERTIFICATE"が入っていることがわかります。)*

証明書(*.cer)を指定して作成します。

```powershell
openssl x509 -in MyApp.iOS.cer -inform DER -out MyApp.iOS.pem -outform PEM
```

### 証明書と秘密鍵からPKCS12形式のコンテナ(*.p12)を作成

PKCS12形式のコンテナは、超ざっくり説明すると、カギのかかった入れ物です。暗号化された形式で、パスワードを設定する必要があります。

秘密鍵(*.key)、コンテナに入れた証明書(*.pem)と、パスワードを指定して作成します。

```powershell
openssl pkcs12 -export -inkey MyApp.iOS.key -in MyApp.iOS.pem -out MyApp.iOS.p12
#> (パスワードを入力する)
```

これで、秘密鍵、公開鍵と証明書のセットを持ったコンテナ(*.p12)を作成することができました。

# 4. プロビジョニングファイルの作成

[Apple Developer](https://developer.apple.com/)にサインインし、以下の作業を行います。

### AppIDの作成

[Identifiers](https://developer.apple.com/account/resources/identifiers/list)のページで、AppIDを登録します。
このAppIDは、Xamarin.Forms.iOSプロジェクトのに含まれる```Info.plist```に定義する「バンドル識別子」と一致させる必要があります。

### Deviceの登録

[Devices](https://developer.apple.com/account/resources/devices/list)のページで、利用する実機を登録します。登録には UUID が必要です。
UUIDは、iPhoneの場合はiTunesに接続すると調べることができます。その他の方法もいくつかあるようです。参考：[iPhone XSシリーズからのUDID・識別子の確認方法](https://qiita.com/takashings/items/f4f96d8f948e14cd98d9)

### プロビジョニングファイルの作成

プロビジョニングファイルは、証明書, AppID, Deviceのセットが記述されたファイルです。
これがアプリケーションパッケージに埋め込まれることにより、「記述されたDevice」で「記述された証明書がインストールされた端末」にのみ、「AppIDが一致するアプリケーション」がインストール可能になります。

[Profiles](https://developer.apple.com/account/resources/profiles/list)のページで、「iOS App Development」と、先に登録した「証明書」「AppID」「Device」を選択してプロビジョニングファイルを作成・ダウンロードし、MyApp.iOS.mobileprovisionという名前でファイルに保存します。

# 5. [App Center](https://appcenter.ms/)で実機用にビルド

Visual Studio App Centerでは、実際のアプリケーションに対応する仮想の「App」を作成します。

### iOS向けXamarin Appの作成

[App Center](https://appcenter.ms/)で「Add New App」メニューを選択し、以下を入力します。

```
App Name: 作成したXamarin.Forms.iOSアプリケーションを識別できる名前を入力。
OS: "iOS"を選択。
Platform: "Xamarin"を選択。
```

するとAppが作成され、専用のGetting startedページが表示されます。
このページの手順に従って、作業を進めます。

* Xamarin.Forms.iOSプロジェクトに、Nugetライブラリ```Microsoft.AppCenter.Analytics```と```Microsoft.AppCenter.Crashes```を追加します。バージョンは最新を選択しましょう。
* Xamarin.Forms.iOSプロジェクトの```AppDelegate.cs```に、```using```と```AppCenter.Start```の記述を追加します。

これらは、実機での動作の統計と、クラッシュ情報をこのAppのページで確認できるようにするためのものです。うまく利用してみましょう。

### Xamarin.Forms.iOSプロジェクトのソースコードをアップロード。

Visual Studio App Centerは、以下のGitリポジトリサービスと連携することができます。

* Azure DevOps
* GitHub
* Bitbucket
* GitLab

上記のいずれかのリポジトリに、ソリューションファイルを含むディレクトリ全体をpushします。

### Xamarin.Forms.iOSプロジェクトのテスターグループを登録

ビルドが成功してインストーラが作成された時に、通知されるメールアドレスを登録しておきましょう。このメールアドレスは、実機で受信できるものにします。

[App Center](https://appcenter.ms/)のDistribute-Groupsのページを開き、Distribution groupsを追加します。

### Xamarin.Forms.iOSプロジェクトのビルド設定を登録

[App Center](https://appcenter.ms/)のAppのBuildのページを開き、リポジトリとブランチを選択します。

次に、以下の情報を設定します。

```
Project: リリースビルド用のソリューションファイルを選択してください。
Configuration: "Release"を選択してください。
SDK version: ※1
Xcode version: 選択できる中で最新を選択します。
Build type: "Device build"を選択します。
Automatically increment build number: Onにします。Build number formatは好みで選択。
Provisioning Profile: プロビジョニングファイル(*.mobileprovision)をアップロード
Certificate: PKCS12形式のコンテナ(*.p12)をアップロードし、コンテナのパスワードを入力。
Distribute builds: Groupsを選択し、作成したテスターグループを選択。
他: 任意。
```
※1 SDKバージョンは、Learn more about [compatible .NET Core versions](https://aka.ms/appcenter-xamarin-ios-netcore)のリンクを参考に選択します。ちなみに、Xamarin.FormsプロジェクトがNET Standard 2.0なら```.NET Core 2.X```、2.1なら```.NET Core 3.X```です。また、次のページも併せ見るとより参考になります。[.NET Standard - .NET 実装のサポート](https://docs.microsoft.com/ja-jp/dotnet/standard/net-standard#net-implementation-support)

入力できたら、「Save & Build」ボタンを押しましょう。ビルドがキューに予約され、しばらくするとビルドが始まります。

ビルドが成功すると、テスターグループに登録したメールアドレスにメールが届きます。
ビルドが失敗した場合は、ビルドログを"error"で検索し、原因を探りましょう。

以下、よくあるビルドエラーの原因です。
* リリースビルド用のソリューションファイルに.NET Standard, Xamarin.iOS以外のプロジェクトが紛れている。
* リリースビルド用のソリューションファイルに、追加し忘れたプロジェクトがある
* そもそもリリースビルド用のソリューションファイルを選択していない。
* いずれかのプロジェクトに、iOSをサポートしていないライブラリを追加した。
* SDK versionが合っていない。
* PKCS12形式のコンテナ(*.p12)のパスワード入力誤り

# 6. [App Center](https://appcenter.ms/)から端末にアプリをインストール

### テスト端末の登録(初回のみ)

その端末に初めて通知が届いた場合、以下のようなメールが届きます。
<img width="400px" alt="リリースメール.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109362/5ae0de77-95f7-8836-6be9-07e5bd94a16c.jpeg">

"Add Device"をタップします。
以下のようなページに遷移しますので、「＋Add Device」をタップします。

するとプロファイルがダウンロードされます。ダウンロード後、端末の「設定」を開くと、「プロファイルがダウンロードされ・・・」という表示が出ているはずですので、タップし、プロファイルのインストールを行います。

そしてページに戻り、「＋Add Device」の下の「I'm good」をタップします。
するとインストール用のページに遷移します。

### インストール

インストール用のページを開くと、インストール可能なAppのリストが表示されます。

その中から「Xamarin.Forms.iOSプロジェクト」のAppを選択すると、以下のようなページが表示されます。
<img width="400px" alt="インストールページ.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109362/edee6018-5146-1b22-14c8-2a9be247732a.jpeg">

「INSTALL」を押すと、アプリのインストールが始まります。

# 最後に

Macを持っていなくても、.NET製iOSアプリを実機配備できる手順をお伝えしました。

しかし、画面デザインを作っている際や、iOS固有の機能をデバッグする際は、Macを持っている場合に比べると開発スピードは落ちるなぁというのが正直な感想です。

VisualStudioをMacとリンクし、Macに実機をUSB接続した状態で行う画面デザインのプレビューや、実機を使ったデバッグ実行は、ほんとにサクサク動きます。そのスピードはAndroidエミュレータの比ではないです。

すると本格的な開発となれば、やはりMacの購入を検討するほうが良いと思います。

しかし、プロトタイプ的にいろいろやってみたいという段階においては、Macを購入する前にこの記事の方法で開発してみるのも、ひとつの手ではないでしょうか。

この記事が、どなたかのiOSアプリ開発に踏み出す第一歩の助けになれば、幸いです。