WindowsのVisual Studioで.NET MAUI iOSのTestFlight用IPAを作成しApp Store Connectへアップロードする手順

Windows+Visual Studio(.NET MAUI)環境でも、iOSの新しいビルドを作り直してApp Store Connectへアップロードし、TestFlightで再配布できます。重要なのは「Releaseでアーカイブ」「Apple Distribution+App Store用プロビジョニングで署名」「アップロード経路を正しく選ぶ」こと。本記事では.ipa作成からTransporter(Windows)利用、`altool exited with code 1`の切り分けまで実務目線で整理します。

目次

まず押さえるべき全体像(WindowsでiOSビルドする時の前提)

結論から言うと、Windows単体でiOSの最終成果物(配布用の署名付き.ipa)を完結させることはできません。iOSのビルド/署名にはAppleのビルドツールが必要で、これらはMac上で動きます。そのためWindowsのVisual Studioは、ネットワーク上のMac(ビルドホスト)に接続して、Mac側でビルド&署名する形になります。

またTestFlightで配布していたビルドが期限切れになった場合、基本的には新しいビルド(Build番号を増やしたもの)を再アップロードすればOKです。TestFlightのビルドは一定期間で利用できなくなる仕様なので、再アップロードの流れ自体はよくある運用になります。

よくある誤解:Debugで作った.ipaを上げればいい?(→基本NG)

TestFlight/App Store Connectに上げるビルドは「配布(Distribution)」のルールで署名されている必要があります。Debugビルド(開発用署名)で作った.ipaは、TestFlight用としては不適切になりがちです。

目的推奨ビルド構成署名(証明書)プロビジョニングプロファイル典型的な用途
開発中の端末実機テストDebugApple DevelopmentDevelopment(開発用)自分のiPhoneで動作確認
TestFlight(内部/外部テスト)ReleaseApple DistributionApp Store(配布用)社内・テスターへ配布
App Store公開ReleaseApple DistributionApp Store(配布用)審査→ストア公開

要するに、質問にあった「Apple Developmentでいいのか?」は、TestFlight目的なら基本的にNG(Apple Distributionを使う)が実務上の正解です。

事前チェックリスト(ここが揃っていないと必ず詰まる)

App Store Connect側(アプリの箱)

  • 対象アプリのApp Store Connect上のレコードが存在する(過去に作成済みならOK)
  • Bundle Identifier(Application ID)が、プロジェクトの設定と一致している
  • アップロードするたびにBuild番号が増えている(同じBuild番号は再アップロード不可)

Apple Developer側(署名の材料)

  • Apple Distribution証明書が用意できている
  • App Store用のプロビジョニングプロファイルを作成済み(Distribution+該当App ID)
  • App Store Connectへアップロードするには、明示的なApp ID(explicit)が必要になるケースが多い(特に機能を有効化しているアプリ)

App Store Connectにアップロードするためのプロビジョニングプロファイル作成は、Apple公式ヘルプにも手順としてまとまっています。

Macビルドホスト側(Windows移行で見落としがち)

  • Xcodeをインストール済み(Pair to MacはXcodeを勝手に入れてくれません)
  • Xcodeを一度起動し、必要な初期設定(ライセンス同意等)を完了
  • Distribution証明書の秘密鍵がMacのキーチェーンに存在(Windows側で作成しても、ペアリング状況によってはMacへ反映されます)

Visual StudioのPair to Macは前提の準備を手伝ってくれますが、Xcode自体は手動で入れる必要がある点は要注意です。

Windows+Visual Studioでの正攻法:Release+配布署名でアーカイブ(.ipa生成)

ステップ1:Pair to Mac(接続が無いと始まらない)

WindowsのVisual Studioで、Tools > iOS > Pair to Mac(またはiOSツールバー)からMacビルドホストに接続します。接続後は、iOSのビルドやアーカイブが可能になります。

ステップ2:構成マネージャーでReleaseへ切り替え

ツールバーの構成をDebug → Releaseに変更します。TestFlight用はReleaseが前提です。

ステップ3:iOS Bundle Signing(署名設定)を配布用に合わせる

Visual Studioではプロジェクトのプロパティ内に、iOS署名設定(iOS Bundle Signing)が用意されています。ここで重要なのは次の3点です。

  • Scheme:Manual Provisioning(手動指定)
  • Signing identity:Distribution(Distribution(Automatic)でも可)
  • Provisioning profile:App Store用(Automaticでも可/問題が出る場合は明示選択)

この流れはMicrosoft Learnでも「App Store配布のPublish手順」として明記されています。

ステップ4:Publish(Archive Manager)でアーカイブし、.ipaを生成

Visual Studioでは、右クリックのPublish…からアーカイブを作成し、Archive Managerで配布パッケージ(.ipa)を作れます。ざっくり以下の流れです。

  1. プロジェクトを右クリック → Publish…
  2. Archive Managerが開き、Archive(アーカイブ)が作成される
  3. アーカイブ選択 → Distribute…
  4. チャネル選択でApp Store
  5. 署名(Distribution+App Storeプロファイル)を選ぶ
  6. Save As(.ipaをファイルとして出力)またはUpload to Store(そのままアップロード)

Save As/Upload to Storeの選択肢がある点、Upload時にApple IDとapp-specific password(アプリ用パスワード)が必要になる点も、Microsoftの手順に沿っています。

補足:CLIで.ipaを作りたい場合(dotnet publish)

GUIではなくCLIで揃えたい場合は、.NET MAUIのiOSターゲットに対してReleaseでpublishするやり方もあります。ただし環境(.NET SDKのバージョン、ワークロード、Mac側の状態)で挙動が変わりやすいため、まずはVisual StudioのArchive/Distributeで成功させてからCLIに寄せるのが現実的です。

dotnet publish -f net8.0-ios -c Release -p:ArchiveOnBuild=true -p:BuildIpa=true

CLI運用に寄せる場合でも、署名(Distribution証明書+App Storeプロファイル)とBuild番号の管理は避けて通れません。

アップロード方法は2通り:Visual Studio直アップロード or Transporter

「作った.ipaをTransporter / Visual Studioのどちらでどうアップロードするのか」は、実務上は次の2択です。

方法メリットデメリットおすすめ度
Visual Studio(Upload to Store)IDEから完結しやすい失敗時に情報が少なく「altool code 1」などで止まりやすい普段は便利、詰まったら別手段へ
Transporterアップロードと検証に強く、ログで原因を追いやすいWindowsはGUIではなくコマンド中心になりがちトラブルシュートに強い

A) Visual Studioからアップロード(Upload to Store)する手順

  1. ReleaseでArchive作成
  2. Distribute… → App Store
  3. 署名(Apple Distribution+App Storeプロファイル)を選択
  4. Upload to Storeを選択
  5. Apple IDとapp-specific passwordを入力してアップロード

このapp-specific passwordが必要になる点は、Microsoft Learnでも明確に案内されています。

B) Transporterでアップロードする手順(macOSとWindowsで考え方が違う)

macOS:Transporter(GUIアプリ)でアップロード

Macが手元にある(あるいはMacビルドホストをGUI操作できる)なら、macOSのTransporterアプリで.ipaをアップロードするのが直感的です。Visual StudioでSave Asして.ipaを出力 → Transporterでアップロード、が分かりやすい王道です。

Windows:Transporterは「GUIアプリ」ではなくコマンドライン中心

質問にあった「Windowsに入れたTransporterがGUIアプリとして起動できない」は、かなり典型的です。AppleのTransporter User Guideでは、Windows版はインストール先(例:C:\Program Files\itms)にツール一式が入り、コマンドで実行する前提で説明されています。

つまりWindowsでは、スタートメニューから“アプリ起動”というより、PowerShell/コマンドプロンプトでiTMSTransporterを叩く運用になりがちです。

WindowsでのiTMSTransporter実行例(.ipaアップロード)

Apple公式ガイドでは、upload modeで.ipaを送る場合、-assetFile(.ipa)を使い、Windows/Linuxでは-assetDescription(AppStoreInfo.plist)が必須とされています。

例として、インストールが既定の場所に入っている場合は次のような形になります(パスは環境に合わせて読み替えてください)。

cd "C:\Program Files\itms\bin"

.\iTMSTransporter.cmd -m upload ^
  -assetFile "D:\drop\MyApp.ipa" ^
  -assetDescription "D:\drop\AppStoreInfo.plist" ^
  -u "[email protected]" ^
  -p "xxxx-xxxx-xxxx-xxxx" ^
  -v eXtreme
  • -v eXtreme:ログを増やして原因調査しやすくする
  • -p:2要素認証を有効にしている場合は、通常のパスワードではなくapp-specific passwordを使う(Apple公式ガイドで推奨)

2要素認証とapp-specific passwordの関係はTransporter User Guideにも記載されています。

AppStoreInfo.plistはどこから用意する?

Windows/Linuxで必要になるAppStoreInfo.plistは、Transporter User Guide上「XcodeでArchiveをExportしたときに生成されるファイル」として説明されています。

現場での割り切りとしては、次のどちらかがスムーズです。

  • 割り切り案1(おすすめ):Mac側でTransporter(GUI)を使う
    Windowsで無理に完結させず、Macでアップロードしてしまう(作業が短い)
  • 割り切り案2:Mac側で一度Export(App Store向け)してAppStoreInfo.plistを生成
    生成されたAppStoreInfo.plistと.ipaをWindowsへ持ってきてiTMSTransporterで送る

アップロード後にTestFlightで配布できる状態になるまで

「アップロードしたら自動でTestFlightに出る?」という疑問はよく出ます。整理すると次の通りです。

  • アップロード先はApp Store Connect
  • アップロード後、Apple側でProcessing(処理)が走る
  • 処理が終わると、App Store ConnectのTestFlightタブでビルドが選べるようになる
  • 外部テスト(External Testing)は、状況によってTestFlight App Reviewが必要

なおTestFlightのビルドにはステータスがあり、期限切れ(Expired)なども含めてApp Store Connect上で確認できます。

Windows Transporterが「起動できない」問題の実務的な答え

Windows版Transporterは、Appleの案内上も「Windowsにインストールして実行できる」ことは明記されていますが、macOSのTransporterのような“ドラッグ&ドロップ前提GUIアプリ”として期待するとズレます。インストール先(既定:C:\Program Files\itms)にツールが入り、そこでiTMSTransporterを実行して使うのが基本です。

もし「どうしてもGUIでアップロードしたい」なら、素直にMac側のTransporterアプリを使う(またはXcode Organizerでアップロードする)のが、トータルで早いことが多いです。

`altool exited with code 1` で失敗する時の切り分け(原因を“層”で分ける)

Visual Studioから直接Upload to Storeしたときに、`altool exited with code 1`のような抽象的なエラーで止まるケースがあります。ここで大事なのは、「Windows側」ではなく「Macビルドホスト側のXcode状態」や「署名・プロファイルの整合性」に問題があることが多い、という点です(VSは裏でMacのツールチェーンを呼び出しているため)。

症状よくある原因確認ポイント対処
Upload to Storeでaltool code 1Mac側のXcode/ツールが不整合Pair to Macは接続できているか/Xcodeは最新系かXcode更新、初回起動、必要ならCommand Line Tools見直し
アップロードは通るがTestFlightに出ないProcessing中/ビルド番号重複App Store Connectのビルド一覧と処理状態処理完了を待つ、Build番号を増やして再アップ
署名エラー/検証エラーDevelopment署名、プロファイル違いSigning identityがDistributionかRelease+Apple Distribution+App Storeプロファイルへ統一
Transporterで詳細なエラーが出るパッケージ内容不備(設定/メタデータ/要件)ログの具体的なエラー文エラー文に応じて修正(権限、Bundle ID、Entitlements等)

まずやるべき「最短の確認」

  • Releaseになっているか
  • Apple Distributionで署名しているか
  • App Store用プロビジョニングプロファイルか
  • Build番号(iOSのVersion/Build)が増えているか
  • MacビルドホストのXcodeが動く状態か(Pair to Macだけでは不足のことがある)

「VSのアップロードが分かりにくい」と感じたらTransporterへ切り替える

Microsoftのドキュメントでも、Transporterはパッケージエラーの特定に役立つとされています。VSからのアップロードが曖昧に落ちるときは、Transporter(特にログを増やす)へ切り替えるのが、結果的に最短になることが多いです。

運用のコツ:TestFlightが切れないために「90日」を前提にする

TestFlightは「一度上げたらずっと配れる」ものではありません。ビルドは一定期間で利用できなくなるため、継続テストするなら定期的に新ビルドを上げる運用が必要です。

  • プロジェクト側でBuild番号を上げる手順を固定する(誰がやっても同じになるように)
  • 配布用証明書・秘密鍵は紛失しない(失うと証明書の失効→プロファイル再作成→全体やり直しになりやすい)
  • Macビルドホストは「iOSビルド専用機」的に安定運用する(OS/Xcodeを頻繁に触るほど壊れやすい)

最後に:.NET MAUI特有の“最近の審査落ち”も一応チェック

iOSの配布要件は年々更新されます。.NET MAUIのドキュメントでも、App Store向けではプライバシーマニフェストなどの要件に触れられており、条件によっては審査で弾かれる可能性があります。アップロード自体は通っても、後段で止まる場合はこの手の要件も疑ってください。


この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次