dotnet-uno-targets について
Uno Platform アプリ開発者向けに、Web/WASM、モバイル、デスクトップ、組み込み環境へのデプロイを対象別に解説します。セットアップ、デバッグ、パッケージ化、配布、各プラットフォーム固有の注意点を扱います。
主な機能
- 01ターゲット別のプロジェクト設定
- 02デバッグ手順とツール
- 03パッケージ化と配布のガイド
- 04AOT とトリミングの影響
- 05プラットフォーム固有の制約と差異
活用シーン
- 01Uno アプリのデプロイ先を設定
- 02プラットフォーム別のデバッグや実行問題の調査
- 03アプリのパッケージ化と配布の準備
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ wshaddix/ dotnet-skills --skill dotnet-uno-targetsインストール後、Claude Code で/dotnet-uno-targetsを入力して読み込まれたか確認します。
詳細
dotnet-uno-targets
Uno Platform アプリケーションのターゲットごとのデプロイガイダンス:Web/WASM、iOS、Android、macOS (Catalyst)、Windows、Linux (Skia/GTK)、Embedded (Skia/Framebuffer)。各ターゲットのセクションでは、プロジェクトのセットアップ、デバッグのワークフロー、パッケージング/配布、プラットフォーム固有の注意点、AOT/トリミングの影響、他のターゲットとの動作の違いを説明します。
対象範囲の境界: このスキルは、ターゲットごとのデプロイ、デバッグ、パッケージング、プラットフォーム固有の注意点を扱います。Uno Platform のコア開発(Extensions、MVUX、Toolkit、テーマ)は [skill:dotnet-uno-platform] が担当します。ライブドキュメントとの MCP 統合は [skill:dotnet-uno-mcp] が担当します。
対象外: Uno Platform のテスト(WASM 用の Playwright、プラットフォームの Appium テスト)については [skill:dotnet-uno-testing] を参照してください。一般的な AOT/トリミングのパターンについては [skill:dotnet-aot-wasm] を参照してください。UI フレームワークの選定については [skill:dotnet-ui-chooser] を参照してください。
相互参照:[skill:dotnet-uno-platform] はコア開発、[skill:dotnet-uno-mcp] は MCP 統合、[skill:dotnet-uno-testing] はテスト、[skill:dotnet-aot-wasm] は一般的な WASM AOT パターン、[skill:dotnet-ui-chooser] はフレームワークの選定を扱います。
ターゲットプラットフォームの概要
| ターゲット | TFM | ツール | パッケージング | 主な制約 |
|---|---|---|---|---|
| Web/WASM | net8.0-browserwasm | ブラウザー DevTools | 静的ホスティング / Azure SWA | ファイルシステムにアクセスできない、AOT を推奨、スレッド機能に制限あり |
| iOS | net8.0-ios | Xcode / VS Code / Rider | App Store / TestFlight | プロビジョニングプロファイル、エンタイトルメント、JIT 不可 |
| Android | net8.0-android | Android SDK / Emulator | Play Store / APK のサイドロード | SDK バージョンのターゲティング、権限 |
| macOS (Catalyst) | net8.0-maccatalyst | Xcode | Mac App Store / 公証 | サンドボックスの制約、エンタイトルメント |
| Windows | net8.0-windows10.0.19041 | Visual Studio | MSIX / Windows Store | WinAppSDK バージョンの整合性 |
| Linux | net8.0-desktop | Skia/GTK ホスト | AppImage / Flatpak / Snap | GTK の依存関係、Skia によるレンダリング |
| Embedded | net8.0-desktop | Skia/Framebuffer | 直接デプロイ | ウィンドウシステムがない、ヘッドレスレンダリング |
TFM に関する注意: 古い TFM や新しい TFM での誤検出を避けるため、プログラムでプラットフォームターゲットを検出する際は、バージョンに依存しないグロブ(net*-ios、net*-android)を使用してください。
Web/WASM
プロジェクトのセットアップ
# Run the WASM target
dotnet run -f net8.0-browserwasm --project MyApp/MyApp.csproj
WASM ターゲットは、ブラウザーで XAML コントロールをレンダリングします。レンダラーはプロジェクトの構成に依存します。Skia(canvas/WebGL)またはネイティブ HTML マッピングを使用します。アプリは、.NET WASM ランタイムを初期化する JavaScript ブートストラップ(uno-bootstrap.js)を介して読み込まれます。
デバッグ
- ブラウザー DevTools: Chrome/Edge で F12 キーを押し、DOM、ネットワーク、コンソール出力を調べます
- .NET のデバッグ: Visual Studio と VS Code は、ブラウザー CDP 経由で .NET WASM ランタイムをデバッグできます
- Uno DevServer:
dotnet runを実行すると、ライブリロードに対応した開発サーバーが起動します - コンソールログ:
ILoggerの出力はブラウザーコンソールに表示されます
パッケージング/配布
# Publish for production
dotnet publish -f net8.0-browserwasm -c Release --output ./publish
# Output is a static site (HTML/JS/WASM)
# Deploy to: Azure Static Web Apps, GitHub Pages, Netlify, any static host
発行された出力は、自己完結型の静的サイトです。サーバー側のランタイムは必要ありません。
プラットフォーム固有の注意点
- ファイルシステムにアクセスできない: JS 相互運用または Uno.Storage を介して、ブラウザーストレージ API(IndexedDB、localStorage)を使用してください
- スレッド機能の制限: Web Workers によるマルチスレッドには制限があります。WASM では
Task.Runによって並列化されない場合があります - CORS の制約: WASM からの HTTP リクエストは、ブラウザーの CORS ポリシーの対象となります
- 初回読み込み時間: アプリを使用できるようになる前に、.NET WASM ランタイムとアセンブリをダウンロードする必要があります。ダウンロードサイズを小さくするには、アセンブリのトリミングを使用してください。AOT によってランタイムの実行速度は向上しますが、成果物のサイズは大きくなります
- ディープリンク: ブラウザーの URL バーからのナビゲーションに対応するには、Uno Navigation Extensions で URL ルーティングを構成してください
AOT/トリミング
トリミングは、未使用のコードを削除してダウンロードサイズを小さくします。AOTはILをWebAssemblyに事前コンパイルし、実行時の速度を向上させますが、成果物のサイズは大きくなります。両方を併用し、アプリにとってのトレードオフを測定してください。
<PropertyGroup Condition="'$(TargetFramework)' == 'net8.0-browserwasm'">
<WasmShellMonoRuntimeExecutionMode>InterpreterAndAOT</WasmShellMonoRuntimeExecutionMode>
<RunAOTCompilation>true</RunAOTCompilation>
</PropertyGroup>
**トリミングはWASMで非常に重要です。**トリミングされていないアプリは30MBを超えることがあります。トリミングを行うと、一般的なアプリのサイズは5~15MBになります。AOTによって成果物のサイズは大きくなりますが、実行時のインタープリターのオーバーヘッドはなくなります。対象環境でダウンロード時間と実行速度の両方をプロファイルしてください。
Uno固有のAOTに関する注意点(リンカーディスクリプター、Unoソースジェネレーター)については、AOTのセクションを参照してください。一般的なWASMのAOTパターンについては、[スキル:dotnet-aot-wasm]を参照してください。
動作の違い
- **ナビゲーション:**URLベースのディープリンクはネイティブで機能します。ルートマップではURLパターンを定義してください
- **認証:**OAuthフローではブラウザーへのリダイレクト(ポップアップまたはリダイレクト)を使用します。ネイティブブラウザーは利用できません。トークンの保存にはブラウザーのセキュアストレージを使用します
- **デバッグ:**CDP経由で完全な.NETデバッガーを利用できます。ブレークポイントはVisual Studio/VS Codeで機能します
- **ファイルピッカー:**ブラウザーのファイル入力APIを使用します。
FileOpenPickerは<input type="file">に対応します
iOS
プロジェクトのセットアップ
# Build for iOS simulator
dotnet build -f net8.0-ios
# Run on simulator
dotnet run -f net8.0-ios
macOSにXcodeがインストールされている必要があります。レンダラー(Skiaまたはネイティブ)はプロジェクトの構成とUnoのバージョンによって異なります。
デバッグ
- **Visual Studio(Pair to Mac)/VS Code + C# Dev Kit/Rider:**iOSシミュレーターまたはデバイスに接続します
- **Xcode Instruments:**CPU、メモリ、エネルギー使用量をプロファイルします
- ホットリロード:
DOTNET_MODIFIABLE_ASSEMBLIES=debugを介してサポートされています
パッケージ化/配布
# Publish for App Store
dotnet publish -f net8.0-ios -c Release \
/p:CodesignKey="Apple Distribution: MyCompany" \
/p:CodesignProvision="MyApp Distribution Profile"
配布方法:App Store(Apple Developerアカウントが必要)、TestFlight(ベータテスト)、Ad Hoc(エンタープライズ)。
**必須:**プロビジョニングプロファイル、署名証明書、機能(プッシュ通知、HealthKitなど)用のエンタイトルメントファイル。
プラットフォーム固有の注意点
- **JITコンパイル不可:**iOSではJITが禁止されています。すべてのコードをAOTコンパイルするか、インタープリターで実行する必要があります。.NETランタイムはデフォルトでMonoインタープリターを使用します
- **プロビジョニングプロファイル:**バンドルID、チームID、エンタイトルメントと一致している必要があります。プロファイルの有効期限が切れると、原因の分かりにくいビルドエラーが発生します
- **バックグラウンド実行:**iOSではバックグラウンド処理が制限されています。バックグラウンドでの作業には
BGTaskSchedulerを使用してください - **App Transport Security(ATS):**デフォルトでHTTPSが必須です。HTTPを使用するには、
Info.plistにNSAppTransportSecurityの例外が必要です - **メモリプレッシャー:**iOSはバックグラウンドアプリを積極的に終了します。
MemoryWarningイベントを処理してください
AOT/トリミング
iOSではデフォルトでAOTが必須です(JITは使用できません)。.NETランタイムはネイティブARM64コードにコンパイルします。
<PropertyGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">
<PublishTrimmed>true</PublishTrimmed>
<TrimMode>link</TrimMode>
</PropertyGroup>
**注意点:**リフレクションを多用するコードはiOSで警告なく失敗します。リリースビルドだけでなく、開発中にもトリミングを有効にしてテストしてください。
動作の違い
- **ナビゲーション:**Uno Navigationでは、ジェスチャーによる戻る操作(左端からのスワイプ)が自動的に機能します
- **認証:**OAuthには
ASWebAuthenticationSessionを使用します。生体認証にはLocalAuthenticationフレームワークを使用します - **デバッグ:**シミュレーターは高速です。デバイスのデバッグにはUSB接続とプロビジョニングが必要です。ホットリロードによるリモートデバッグがサポートされています
Android
プロジェクトのセットアップ
# Build for Android
dotnet build -f net8.0-android
# Deploy to connected device or emulator
dotnet run -f net8.0-android
Android SDKが必要です(dotnet workload install androidまたはAndroid Studioを使用してインストールします)。
デバッグ
- **Android Emulator:**Android Studioのエミュレーターまたはコマンドラインの
emulatorを使用します - **ADB(Android Debug Bridge):**実行時ログには
adb logcatを、接続の確認にはadb devicesを使用します - **Visual Studio/VS Code:**エミュレーターまたはデバイス上でブレークポイントを使った完全なデバッグが可能です
パッケージ化/配布
# Publish signed APK/AAB (use env vars or CI secrets for passwords — never hardcode)
dotnet publish -f net8.0-android -c Release \
/p:AndroidKeyStore=true \
/p:AndroidSigningKeyStore=mykey.keystore \
/p:AndroidSigningStorePass="$ANDROID_KEYSTORE_PASS" \
/p:AndroidSigningKeyAlias=myalias \
/p:AndroidSigningKeyPass="$ANDROID_KEY_PASS"
Google PlayではAndroid App Bundle(AAB)形式が必要です。サイドローディングにはAPKを使用します。
プラットフォーム固有の注意点
- SDK バージョンのターゲット設定:
<SupportedOSPlatformVersion>は最小 API レベルを制御します。Google Play の要件に準拠するには、API 34 以降をターゲットにしてください - 実行時の権限: カメラ、位置情報、ストレージなどの危険な権限は、実行時にリクエストする必要があります。マニフェストに記載するだけでなく、コード内で確認してリクエストしてください
- アクティビティのライフサイクル: Android はデフォルトで、画面の回転時にアクティビティを破棄します。Uno はこれに対応していますが、カスタムのネイティブコードではライフサイクルを考慮する必要があります
- ProGuard/R8: コードの縮小により、リフレクションの対象が削除される場合があります。ネイティブ相互運用型には
@Keep注釈またはリンカー設定を使用してください
AOT/トリミング
<PropertyGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">
<PublishTrimmed>true</PublishTrimmed>
<RunAOTCompilation>true</RunAOTCompilation>
</PropertyGroup>
Android の AOT は起動時間を短縮します。iOS とは異なり、トリミングされていないコードパスでは JIT をフォールバックとして利用できます。
動作の違い
- ナビゲーション: ハードウェア/ソフトウェアの戻るボタンを押すと、Uno のナビゲーションで戻ります。
BackRequestedイベントは自動的に発生します - 認証: OAuth には
CustomTabs(Chrome)を使用し、生体認証にはAndroidX.Biometricを使用します - デバッグ: エミュレーターは iOS Simulator より低速ですが、より多くの API レベルに対応しています。パフォーマンス向上のため、ハードウェアアクセラレーション(HAXM/KVM)を使用してください
macOS(Catalyst)
プロジェクトの設定
# Build for macOS
dotnet build -f net8.0-maccatalyst
# Run on macOS
dotnet run -f net8.0-maccatalyst
Mac Catalyst(macOS 向けに適応された iOS API)を使用します。macOS 上の Xcode が必要です。
デバッグ
- Visual Studio(Pair to Mac)/VS Code + C# Dev Kit/Rider: ネイティブ macOS デバッグ
- Xcode Instruments: パフォーマンスとメモリをプロファイリングします
- Console.app: アプリプロセスのシステムログを表示します
パッケージ化/配布
# Publish for distribution
dotnet publish -f net8.0-maccatalyst -c Release \
/p:CodesignKey="Developer ID Application: MyCompany" \
/p:CodesignProvision="MyApp Mac Profile"
配布方法:Mac App Store、Notarization を利用した直接ダウンロード、エンタープライズ展開。
Notarization が必要です: macOS Gatekeeper では、App Store 外で配布するアプリに Notarization が必要です。xcrun notarytool を使用して申請してください。
プラットフォーム固有の注意点
- サンドボックスの制限: Mac App Store アプリはサンドボックス内で実行されます。ファイルへのアクセスには、エンタイトルメントとユーザーの許可が必要です
- Catalyst の制限事項: すべての iOS API が macOS に対応するわけではありません。
SupportedOSPlatform属性を確認してください - メニューバー: macOS では適切なメニューバーが必要です。Uno はデフォルトのメニューを提供します。プラットフォーム固有のコードでカスタマイズしてください
- ウィンドウ管理: macOS アプリは複数のウィンドウに対応しています。Uno のシングルウィンドウモデルは、マルチウィンドウが必要な場合に調整が必要になることがあります
AOT/トリミング
iOS と同じプロファイルです(Catalyst ではデフォルトで AOT)。配布ビルドではトリミングを推奨します。
動作の違い
- ナビゲーション: スワイプで戻るジェスチャーはありません。ツールバーの戻るボタンまたはキーボードショートカット(Cmd+[)を使用します
- 認証: iOS と共通の
ASWebAuthenticationSessionを使用します。Secure Enclave 経由の Touch ID に対応しています - デバッグ: ネイティブ macOS プロセスです。標準の .NET デバッグツールを使用できます。シミュレーターはなく、ネイティブアプリとして実行されます
Windows
プロジェクトの設定
# Build for Windows
dotnet build -f net8.0-windows10.0.19041
# Run on Windows
dotnet run -f net8.0-windows10.0.19041
Windows ターゲットでは、Skia レンダラーとネイティブの WinAppSDK/WinUI 3 レンダリングのどちらも使用できます。
デバッグ
- Visual Studio: XAML Hot Reload、Live Visual Tree、Live Property Explorer を使った完全なデバッグ
- WinUI diagnostics: レイアウトを調査するための組み込み診断オーバーレイ
パッケージ化/配布
# Package as MSIX
dotnet publish -f net8.0-windows10.0.19041 -c Release \
/p:PackageOutputPath=./packages
配布方法:Microsoft Store(MSIX)、サイドローディング(証明書付き MSIX)、ClickOnce、または EXE の直接配布。
プラットフォーム固有の注意点
- WinAppSDK バージョンの整合性: Windows の TFM バージョンは、Windows の最小バージョンと一致している必要があります。
10.0.19041は Windows 10 2004 以降を示します - UAC と昇格: アプリは自身の権限を昇格できません。標準ユーザーの権限で動作するよう設計してください
- Windows 固有の API:
Windows.Storage、Windows.NetworkingAPI は Windows ターゲットでのみ使用できます。条件付きコンパイルまたは Uno の抽象化を使用してください - MSIX の署名: MSIX パッケージのインストールには署名が必要です。配布にはコード署名証明書を使用してください
AOT/トリミング
<PropertyGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">
<PublishTrimmed>true</PublishTrimmed>
<PublishAot>true</PublishAot>
</PropertyGroup>
Windows は JIT と AOT の両方に対応しています。AOT では単一のネイティブ EXE が生成され、起動が速くなります。
動作の違い
- ナビゲーション: 標準的な Windows ナビゲーション(戻るには Alt+Left、タイトルバーの戻るボタン)
- 認証: Microsoft アカウントの SSO には、システムブラウザーまたは WAM(Web Account Manager)を使用します
- デバッグ: Visual Studio Live Visual Tree と XAML Hot Reload による、最も充実したデバッグ環境です
Linux(Skia/GTK)
プロジェクトのセットアップ
# Build for Linux desktop
dotnet build -f net8.0-desktop
# Run on Linux
dotnet run -f net8.0-desktop
Linux ターゲットでは、GTK ホストウィンドウとともに Skia レンダラーを使用します。XAML のレンダリングはすべて Skia が行い、GTK はウィンドウと入力処理のみを提供します。
デバッグ
- C# Dev Kit を使用した VS Code: Linux でのリモートデバッグ
- JetBrains Rider: Linux の完全なデバッグサポート
- コンソールログ:
dotnet runの出力はターミナルに表示されます
パッケージング/配布
# Publish self-contained for Linux
dotnet publish -f net8.0-desktop -c Release \
--self-contained \
-r linux-x64
# Package as AppImage, Flatpak, or Snap
配布形式:AppImage(ポータブル、インストール不要)、Flatpak(サンドボックス化)、Snap(Ubuntu Store)、DEB/RPM パッケージ。
プラットフォーム固有の注意点
- GTK 依存関係: アプリの実行時には GTK3 ライブラリが必要です。依存関係をパッケージに含めるか、文書に記載してください:
libgtk-3-0、libskia* - Skia レンダリング: レンダリングはすべて Skia ベースです。ネイティブの GTK ウィジェットは使用しません。これにより、ピクセル単位で正確なクロスプラットフォームレンダリングを実現しますが、アプリはホストの GTK テーマに従いません
- フォントのレンダリング: 対象システムでフォントを利用できることを確認してください。フォントをアプリに埋め込むか、フォントの依存関係を宣言してください
- ディスプレイのスケーリング: Skia による HiDPI サポートが利用できます。
GDK_SCALE=2環境変数を設定してテストしてください
AOT/トリミング
<PropertyGroup Condition="'$(TargetFramework)' == 'net8.0-desktop'">
<PublishTrimmed>true</PublishTrimmed>
<PublishAot>true</PublishAot>
</PropertyGroup>
Linux での AOT により、ネイティブバイナリが生成されます。セルフコンテインドデプロイにすると、システム全体への .NET ランタイムのインストールが不要になります。
動作の違い
- ナビゲーション: キーボード操作(戻るには Alt+Left)。ジェスチャーベースのナビゲーションはありません
- 認証: OAuth フローにはシステムブラウザーを使用します。プラットフォーム固有の認証 API はありません
- デバッグ: 標準の .NET デバッグを使用します。プラットフォーム固有のデバッガーツールはありません
組み込み(Skia/Framebuffer)
プロジェクトのセットアップ
組み込みターゲットでは、フレームバッファーバックエンドとともに Skia レンダラーを使用し、ウィンドウシステムなしでヘッドレスまたはキオスク形式のレンダリングを実現します。
# Build for embedded (same TFM as desktop)
dotnet build -f net8.0-desktop -r linux-arm64
# Run directly on embedded device
dotnet run -f net8.0-desktop
組み込みターゲットでは、Linux デスクトップと同じ net8.0-desktop TFM を使用します。プラットフォーム固有の構成によってフレームバッファーバックエンドを選択します。
// Program.cs -- framebuffer host configuration
public static void Main(string[] args)
{
SkiaHostBuilder.Create()
.UseFrameBuffer() // Use framebuffer instead of GTK
.App(() => new App())
.Build()
.Run();
}
デバッグ
- SSH リモートデバッグ: VS Code Remote または
dotnet-traceを使用して、リモートでプロファイリングします - シリアルコンソール: ヘッドレスデバッグ用にログをシリアル出力へリダイレクトします
- リモートロギング: ネットワークシンクを使用するよう Serilog を構成し、リモートでログを集約します
パッケージング/配布
# Publish self-contained for ARM64
dotnet publish -f net8.0-desktop -c Release \
--self-contained \
-r linux-arm64
# Deploy binary directly to device filesystem
scp -r ./publish/* pi@device:/opt/myapp/
デバイスのファイルシステムに直接デプロイします。アプリストアやパッケージマネージャーはありません。
プラットフォーム固有の注意点
- ウィンドウシステムなし: X11/Wayland はありません。アプリは Linux フレームバッファー(
/dev/fb0)に直接レンダリングします - 入力処理: タッチ入力には Linux 入力イベント(
/dev/input/event*)を使用します。既定ではマウスカーソルはありません - リソースの制約: 組み込みデバイスでは、RAM や CPU が制限されていることがよくあります。メモリ使用量を慎重にプロファイリングしてください
- ブラウザーなし: ブラウザーを必要とする OAuth フローは利用できません。デバイスコードフローまたは事前にプロビジョニングしたトークンを使用してください
- ディスプレイ解像度: フレームバッファーの解像度と一致させる必要があります。カーネルのブートパラメーターまたは
fbsetで設定してください
AOT/トリミング
リソースの制約と起動時間の要件があるため、組み込み環境では AOT を強く推奨します。
<PropertyGroup Condition="'$(RuntimeIdentifier)' == 'linux-arm64'">
<PublishTrimmed>true</PublishTrimmed>
<PublishAot>true</PublishAot>
<InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>
InvariantGlobalization は ICU データ(約 28 MB)を削除してバイナリサイズを縮小します。アプリでロケール固有の書式設定が不要な場合にのみ使用してください。
動作の違い
- ナビゲーション: タッチまたはハードウェアボタンのみ。キーボードショートカットやジェスチャーバーはありません
- 認証: デバイスコードフローまたは事前にプロビジョニングした認証情報を使用します。ブラウザーベースの OAuth はありません
- デバッグ: リモートのみです。ローカル IDE はありません。SSH デバッグまたはリモートロギングを使用してください
ターゲット間の動作の違い
ナビゲーション
| ターゲット | 戻るナビゲーション | ディープリンク | ジェスチャーナビゲーション |
|---|---|---|---|
| Web/WASM | ブラウザーの戻るボタン / Alt+Left | URL ベースのルーティング | なし |
| iOS | 画面左端からスワイプ | URL スキーム / Universal Links | 完全なジェスチャーサポート |
| Android | ハードウェア/ソフトウェアの戻るボタン | Intent フィルター / App Links | システムの戻るジェスチャー(Android 13 以降) |
| macOS | Cmd+[ / ツールバーの戻るボタン | URL スキーム | なし |
| Windows | Alt+Left / タイトルバーの戻るボタン | プロトコルのアクティブ化 | なし |
| Linux | Alt+Left / キーボード | なし | なし |
| 組み込み | ハードウェアボタンのみ | なし | タッチのみ |
認証
| ターゲット | OAuth フロー | トークンの保存先 | 生体認証 |
|---|---|---|---|
| Web/WASM | ブラウザーのリダイレクト/ポップアップ | ブラウザーのセキュアストレージ | WebAuthn(限定的) |
| iOS | ASWebAuthenticationSession | Keychain | Touch ID / Face ID |
| Android | Chrome Custom Tabs | Android Keystore | BiometricPrompt |
| macOS | ASWebAuthenticationSession | Keychain | Touch ID |
| Windows | システムブラウザー / WAM | Credential Manager | Windows Hello |
| Linux | システムブラウザー | Secret Service API | なし |
| 組み込み | デバイスコードフロー | ファイルベース(暗号化) | なし |
デバッグツール
| ターゲット | IDE デバッガー | ホットリロード | プロファイリング |
|---|---|---|---|
| Web/WASM | VS / VS Code (CDP) | はい | ブラウザー DevTools |
| iOS | VS(Mac とペアリング) / VS Code / Rider | はい | Xcode Instruments |
| Android | VS / VS Code | はい | Android Profiler |
| macOS | VS(Mac とペアリング) / VS Code / Rider | はい | Xcode Instruments |
| Windows | Visual Studio | はい(+ Live Visual Tree) | VS Diagnostic Tools |
| Linux | VS Code / Rider | はい | dotnet-counters / dotnet-trace |
| 組み込み | VS Code Remote | はい(SSH) | dotnet-trace(リモート) |
エージェントに関する注意点
- 検出ロジックで TFM のバージョンをハードコードしないでください。 .NET 8 と将来の .NET バージョンの両方に対応できるよう、バージョンに依存しない glob(
net*-ios、net*-android)を使用してください。 - すべてのターゲットで同じデバッグワークフローが使えると想定しないでください。 iOS ではプロビジョニングが必要で、Android では ADB が必要です。WASM ではブラウザー DevTools を使用します。ターゲットごとにツールは異なります。
- iOS で JIT に依存するパターンを使用しないでください。 iOS では JIT コンパイルが禁止されています。
Reflection.Emit、Expression.Compile()、動的アセンブリの読み込みを使用するコードは、実行時に失敗します。 - プラットフォーム固有の権限を忘れないでください。 Android の実行時権限、iOS のエンタイトルメント、macOS のサンドボックス権限、WASM の CORS ポリシーはそれぞれ異なるため、ターゲットごとに対処する必要があります。
- トリミングされていない WASM アプリをデプロイしないでください。 トリミングされていない WASM バンドルは 30MB を超えます。必ずトリミングを有効にし、本番環境の WASM デプロイでは AOT の使用も検討してください。
- すべてのターゲットでファイルシステムにアクセスできると想定しないでください。 WASM にはファイルシステムがなく、iOS/macOS にはサンドボックスによる制限があり、組み込み環境ではストレージが読み取り専用の場合があります。Uno Storage の抽象化を使用してください。
- すべてのターゲットに同じ認証フローを使用しないでください。 WASM ではブラウザーのリダイレクト、モバイルではネイティブの認証セッション、組み込み環境ではデバイスコードフローを使用します。認証はターゲットごとに構成する必要があります。
前提条件
- .NET 8.0+ とプラットフォームワークロード:
dotnet workload install ios android maccatalyst wasm-tools - プラットフォーム SDK:Xcode(iOS/macOS)、Android SDK(Android)、GTK3(Linux)
- Uno Platform 5.x+