Windows版VisualStudio2017で、実機iPhoneでデバッグする

VisualStudioとXamarinが統合してWindows環境でもiPhoneアプリ開発がかなり楽になってきたようなので、iPhone実機を使ったリモートデバッグの手順を調べたので、備忘録として残しておく。

前提条件

前回の投稿では、Xamarin Live Playerについて試してみたけど、まだ粗削りでできないことが多いのと、2017/9/16の時点では、ベータ版環境をそろえないといけなかったりして、「楽しみに待つ」のが得策のような気がしました。

なので、以前から実現できている「WindowsでiPhone開発」をいい機会なので、最低限の基本的な部分だけでやっておこうという趣旨です。

開発環境としては、

  • Windows環境は、Windows10 + Visual Studio2017
  • Mac環境は、macOS Sierra + Xcode8.3.3 + Visual Studio 2017 for Mac、Macbook Air(2011)を使う
  • ターゲットのiOSバージョンは10.3
  • Xamarin.iOSのバージョンは10.12.3.3で、WindowsとMac側で合わせておく
  • iOS Developer Programにはとりあえず加入してない(無料ライセンス)

基本的に開発はWindows機で行う。Mac側の仕事はiPhoneと繋ぐ、後述するプロビジョニングファイルの生成のみに徹する。なるべく開発リソースをWindows側に集中させることによって、中途半端にMac側にお金を掛けなくて済ませたい

注意点としては、Xamarin.iOSのバージョンは一致しないと連携できないので、自動バージョンアップなどはOFFにしておく。

ビルド、iPhoneシミュレータでリモートデバッグできるようにする

storyboardなどGUI編集やビルドおよび実行は、裏でMacと接続してXcodeの力を借りる必要がある。Xamarin Mac Agent機能を使ってMacとつなげる必要がある。

  • Xamarin Mac Agentを実行する

Mac側で共有システム設定を有効にしろと言われるのでそのとおりにする。
同一のネットワーク内でMacとWindowsを繋げておくと話が早い。(おそらくSSH通信しているので、外部ネットワークであっても通信可能であれば利用できるとは思う)

Macの環境設定パネルから共有設定として、リモートログインを許可する。

リモート設定が完了すると、Windows端末からXamarin Mac Agentを通じてMacのホスト名が表示される。Wクリックして接続を開始する。少々時間がかかるが、接続が成功すると、右側にリンクアイコンが表示される。

テスト用に適当なアプリを作成して確認する。まずはプロジェクトとして、[iOS]-[iPhone]-[単一ビューアプリ]を選択する。

storyboardで適当にパーツを載せて、視認できるようにしておく。画面ができたら、実行ボタンをプルダウンさせて、シミュレータを選択しておく。下図の場合、iPhone6 iOS10.3が選択されている。

実行すると、ビルドが開始してMac側でシミュレータが起動する。シミュレータが起動した後、作成したアプリが表示されれば、とりあえずMacとWindowsの開発環境の連携はOKと考えてよい。ボタンイベントのコールバックなどにブレークポイントを設定すれば、ちゃんとデバッグできるはず。ちなみにシミュレータの起動がすごい時間がかかる。

無料版ライセンスで、iPhoneの実機でデバッグする

次に実機で同様のデバッグが行えるように設定する。どうもXcode8.3から設定方法がネットにある方法と異なっているのもあって、結構ハマってしまった。ネットにある情報のほとんどは有料のプロビジョニングファイルの設定方法に関する記述が多く、無料版プロビジョニングファイル関連の話が少なかったのと、どういう仕組みで機能しているのかイメージがつかなかったのでなかなか目的のサイトに辿り着けなかったのも原因の一つ。

iPhoneの実機でアプリを動作させるまでの仕組み

iPhone(iOS)では、実行するアプリケーションが正規のものかどうかを、アプリに添付されている証明書で確認する。不正な方法でインストールされたアプリは起動できないようになっている。この証明書が**プロビジョニングファイル(Provisioning Profile)**と言われるもので、ビルド時にこの証明書がアプリに練りこまれる仕組みになる。(イメージ的には)

自分なりのイメージを図示すると以下になる。Xamarinの連携周りは正直よくわからない。Windows上では中間ファイルレベルのモジュールまでを作成して、実機にインストールされるモジュールは、Mac上でXcode付属のコンパイラで最終的にビルドされるのかもしれない。ただ、MacとWindowsの双方にXamarin関連のツールと、Mac側にXcodeをインストールしておかないと実現できない点では間違ってない。

前述したXamarin Agentで連携してMac上のシミュレータで動作させるところが、図中の(1)、(3)および(4)に相当する。Xcode付属のシミュレータで、ビルドしたアプリを起動させていた。

プロビジョニングファイルには無償版と有償版がある

前述のプロビジョニングファイルには有償版iOS7から追加された無償版がある。通常、iPhoneアプリを公開するためには、Apple Developer Programに参加して、有償版の証明書をAppleから発行してもらう。この証明書を使ってアプリをビルド&リリースする。上図でいうと、赤いファイルアイコン($99)のあたりの話になる。

有償版の証明書の期限は1年になる。この証明書を発行してもらうためには、年会費として2017年現在では$99の費用が掛かる。契約を更新しないまたは、退会するとAPPストアに登録されているアプリのバージョンアップやダウンロードができなくなるが、切れた途端全く使えなくなるわけではないらしい。(メンバーシップの更新)

無償版プロビジョニングファイルの作成

今回目的とする方法は、図中の黄色の"Free"と記載されたアイコン周りの無償版プロビジョニングファイルの作成に関する手順(2)になる。このファイルは、Apple IDを取得し、Mac端末上でXcodeを使って作成する。(実際にはAppleのサイトから裏でダウンロードしているのかもしれないが、操作上では作成になる)

まずは、Xcodeを起動して、Xcode-References...を選択する。すでにAppleIDを取得しており、そのIDに対して設定を行うのも良いし、新たにデバッグ用にIDを作成して進めるのも可能。すでにApple IDは取得していたが、デバッグ用に1つ追加して作業を進めることにする。

右下の+を選択して、Add Apple IDを実行し、Create Apple IDを選択する。

基本情報を入力したり、2段階認証やらを手順に従って、ユーザを作成する。

作成したら、XcodeのAccountsタブで追加したユーザを選択して、Manage Certificatesを実行する。

このパネルの+ボタンを押下すると、作成する証明書のタイプが表示されるので、iOS Developmentを選択して証明書を作成する。

作成後の画面が以下になる。その後、Download All Profilesを実行する。具体的に何が起こるのか不明だが、AppleのサーバーからApple IDに紐づいた証明書の元ネタをダウンロードしているような気がする。

次にXcode上で、ダミーのプロジェクトを作成する。とりあえず、シンプルなSingle View Applicationとしておく。

プロジェクト名を記入し、取得したApple IDをTermで選択する。Organization Identifierを入力する。(ほかはデフォルトで問題なし)

プロジェクトが作成できたら、プロジェクトファイルを選択すると、各種設定情報が表示される。
Bundle Identifierを好みの文字列に記入する。といっても基本的には、個人で登録した場合は<FirstName>.<SecondName>.<ProjectName>がデフォルト名になるので、それに従っておいたほうが良さそう。あとは、Automatically manage signingをチェックONして、Teamから作成したApple IDを選択する。

Automatically manage signingをOFFにすると、マニュアルでプロビジョニングファイルをダウンロードできそうな画面が出るが、有料版プロビジョニングファイルを持ってないので、何も選択できなかった。

Termすぐ下のProvisioning Profile Xcode Managed Profileの横にあるiを選択すると、プロビジョニングファイルの詳細情報が表示される。Expires in 6 daysとあり、無償版プロビジョニングファイルの有効期限が6日だとわかる。

プロビジョニングファイルの作成に関するポイントとしては、

  • Apple IDを取得しないと作成できない
  • Xcodeでのみプロビジョニングファイルを作成できる
  • 無償版プロビジョニングファイルはプロジェクト単位で生成される。
  • また、作成されるタイミングはプロジェクトを作成直後や、Bundle Identifierの名称を変更したタイミングで自動生成される。(再作成前のファイルがどうなるのかはわからない。おそらくMacの/Library以下のどこかにどんどん溜まっていく気がする。)
  • 上記プロビジョニングファイルの作成は**図中の(2)**に相当する

Windows側の開発環境から実機のiPhoneでデバッグする

まず、iPhoneをLightningケーブルでMacに接続しておく。
iTunesで音楽ファイルを出し入れしていた端末なら、問題なく認識するはず。ロック画面は解除しておく。

次にWindows機のVisual Studio側で目的のアプリのソリューションファイルを開くか、プロジェクトの新規作成を行う。今回は、前回エミュレータ上で動かしてみたプロジェクトを使用する。

プロジェクト内あるInfo.plistを選択したら、バンドル識別子を先ほどXcode上で作成したプロビジョニングファイルの識別子名と同じにする。そうすることで、Mac内にあるプロビジョニングファイルと紐づいて、モジュールが作成されるようになる。

デバッグ実行のターゲットをシミュレータから実機に変更する。Xamarin Mac Agentを通じて、接続した実機が選択できるようになっているはず。

実機を選択したらデバッグを開始する。

初回は、いつまでたっても起動しなかったり、タイムアウトで失敗するかもしれない。
その場合でもiPhoneにはアプリが転送されているので、起動してみると、以下のように信頼されてない云々のエラーが表示される。(図中(5)、(6)のチェック機構)


その場合、一般-プロファイルとデバイス管理を選択すると、キャリアの下にデベロッパAPPという項目にApple IDがあるはず。

それを選択して、「XXXを信頼」する。

その後、もう一度VisualStudioからデバッグを実行すると、無事アプリが起動し、実機でのデバッグが可能になる。2度目以降は、上記の手順は不要になり、プログラムの修正と実行のトライアル&エラーが可能になる。
(図中の(7)あたり)

予想はしていたが、最初のとっかかりがちょっと面倒だったのと、仕組みの概略をやさしく説明するようなサイトがないのが初心者にはつらい。が、開発手順が確立すれば、あとはC#のアプリ開発+αまで難易度が落ちるので、iPhone開発が捗りそう。Swift+Xcodeやるよりは楽だと思う。