MS_DotNetAndSmartphone - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

.NETずスマホ

抂芁

䞋蚘リンク先に蚘茉。

詳现

GUI開発

移行メモXamarin はサポヌト終了: Xamarin は
2024 幎 5 月 1 日にサポヌトが終了した。
珟圚の .NET でのモバむル GUI 開発は
.NET MAUIXamarin.Forms の埌継が公匏の手段である
ネむティブ vs クロスプラットフォヌム。

【.NET でのモバむル GUI の遞択肢珟圚】
   ・.NET MAUI                
 公匏。単䞀プロゞェクト構成 ★
   ・.NET MAUI Blazor Hybrid  
 UI を Blazor で曞くWeb ず共有
   ・[Uno Platform](MS_UnoPlatform) 
 XAML。Web/デスクトップも
   ・Avalonia                 
 XAML。デスクトップ䞭心

プッシュ通知

Android では FCM を、iOS では APNs を䜿甚する。

  • FCM は APNs ず連携可胜なので、ココでは、FCM ずの連携手順を曞く。

  • コヌドを芋るず、APNs ぞのプッシュ通知の実装は難易床が高そう。

  • FCM 経由にするず APNs の耇雑さも、サヌバヌ偎でブラックボックス化される。

補足この刀断は今も正しい: 「FCM 経由にするず APNs の耇雑さが
ブラックボックス化される
」——この蚭蚈刀断は劥圓である。
なぜ APNs が難しいのかを補っおおく。

【APNsApple Push Notification serviceが難しい理由】

 ① 【蚌明曞たたは認蚌キヌの管理】★
     ・p12 蚌明曞方匏 【幎 1 回の曎新が必芁】。倱効するず通知が止たる
     ・p8 認蚌キヌ方匏珟圚の掚奚 倱効しない。Team ID / Key ID が芁る

 ② 【環境が分かれる】
     開発sandboxず本番で゚ンドポむントが違う
     → 「開発では届くのに本番で届かない」の兞型的な原因

 ③ 【HTTP/2 が必須】旧バむナリ プロトコルは廃止枈み
     → クラむアント ラむブラリが HTTP/2 に察応しおいる必芁がある

 ④ ゚ラヌの扱いが独特トヌクン倱効の怜出など

【FCM 経由にするず】
   ・Firebase 偎に APNs の認蚌キヌを登録しおおけば、
     アプリからは【FCM の API だけ】を叩けばよい ★
   ・Android / iOS を【同じコヌドで】扱える
   ・トヌクン管理も統䞀される

䞀方、FCM 経由の代償も抌さえおおく。

・Google のサヌビスに䟝存する障害・仕様倉曎の圱響
・䞭囜本土の Android 端末では Google Play 開発者サヌビスが
  䜿えないこずがある ★
・通知の遅延が APNs 盎よりわずかに増える
・Firebase の利甚芏玄・デヌタの所圚デヌタ䞻暩

クラむアント偎の手順

フロント゚ンドの手順は、

  • プラットフォヌム毎に別々になる。

  • 詳しくは、個々のフロント゚ンドの項を参照。

サヌバ偎の手順

  • ここでは、.NET で実装する、サヌバ偎の実装に぀いお蚀及する。

  • 必芁なパッケヌゞを NuGet からむンストヌルFirebaseAdmin

  • FCM のコン゜ヌルから秘密鍵
    serviceAccountKey.jsonをダりンロヌド

  • プッシュ通知のプログラムを実装する。

    • 秘密鍵を読む
    • メッセヌゞの䜜成・指定
    • トヌクンの指定
    • プッシュ通知の送信

※ トヌクンは、ネむティブ・アプリのむンストヌル時に生成される。
 埓っお、サヌバは事前に、このトヌクンを入手しおおく必芁がある。

補足実装䟋ず、運甚䞊の芁点: 手順は正確なので、
コヌドず泚意点を補う。

// NuGet: FirebaseAdmin
FirebaseApp.Create(new AppOptions
{
    Credential = GoogleCredential.FromFile("serviceAccountKey.json"),
});

var message = new Message
{
    Token = deviceToken,                       // ← 端末ごずのトヌクン
    Notification = new Notification { Title = "件名", Body = "本文" },
    Data = new Dictionary<string, string> { ["orderId"] = "12345" },
};
var id = await FirebaseMessaging.DefaultInstance.SendAsync(message);

① 秘密鍵serviceAccountKey.jsonの扱い★

【これは極めお機埮な情報である】
   ・持っおいれば【誰にでも通知を送れる】
   ・Firebase の他の機胜にもアクセスできうる

【やっおはいけない】
   ・リポゞトリにコミットする
   ・アプリず䞀緒に配垃するクラむアントに眮かない

【正しい眮き堎】
   ・【Key Vault / Secrets Manager】★
   ・マネヌゞド IDGoogle なら Workload Identity
   → [*.configの暗号化](MS_ConfigEncryption) /
     [FaaS config](MS_FaaSConfig) ず同じ指針

② トヌクンの管理が実務䞊の䞻芁な課題

【トヌクンは倉わる】★ 原文の※の補足
   ・アプリの再むンストヌル
   ・端末の初期化
   ・䞀定期間の未䜿甚
   ・アプリ デヌタの削陀
     → 【叀いトヌクンに送るず倱敗する】

【蚭蚈】
   ・アプリ起動時に毎回トヌクンを取埗し、サヌバぞ送る
   ・サヌバは【ナヌザヌ × 端末】でトヌクンを保持する
      → 1 ナヌザヌが耇数端末を持぀
   ・送信結果が Unregistered / InvalidArgument なら
     【DB から削陀する】★
      → 溜め蟌むず、送信のたびに無駄な゚ラヌが積み䞊がる
   ・ログアりト時はトヌクンを無効化する
      → しないず【他人の端末に通知が届く】情報挏掩★

③ 通知の内容に個人情報を入れない

【ロック画面に衚瀺される】こずを前提にする
   ✗ 「田䞭様の怜査結果が出たした陜性」
   ○ 「新しいお知らせがありたす」 data で ID だけ枡し、
      アプリを開いおから API で取埗する ★

④ 倧量送信

・FCM には【マルチキャスト送信】がある最倧 500 トヌクン/回
   SendEachForMulticastAsync
・トピック配信賌読者党員ぞも䜿える
・レヌト制限・リトラむ指数バックオフを実装する
・【送信は非同期のバックグラりンド凊理にする】★
   → Web リク゚ストの䞭で同期送信しない

OTA アップデヌトをサポヌトするためのプラットフォヌム

移行メモCodePush / App Center は終了: Microsoft の
Visual Studio App Center は 2025 幎 3 月 31 日にサヌビスを終了
した。
App Center 䞊で提䟛されおいた CodePush も同時に終了しおいる
Visual Studio App Center。

【珟圚の代替】
   ・React Native  → 【Expo Updates】、たたはセルフホスト版 CodePush
   ・Capacitor     → Capacitor Live UpdatesIonic Appflow
   ・.NET MAUI     → 【OTA の仕組みは暙準にない】★
                      → ストア経由の曎新が基本

【留意点】[ネむティブ vs クロスプラットフォヌム](MS_NativeVsCrossPlatform) にも蚘茉
   ・OTA でアプリの䞻芁な機胜を倉えるこずは
     ストアの芏玄䞊リスクがある
   ・バグ修正・コンテンツ曎新の範囲に留める

参考

プッシュ通知

FCM

APNs

移行メモAPNs の参考リンクは叀い: 挙げられおいる 2 ぀は
2013 幎頃の蚘事であり、
圓時の「バむナリ プロバむダ API」は 2021 幎に廃止されおいる。
珟圚 APNs ぞ盎接送るなら、
HTTP/2 ベヌスの Provider API + p8 認蚌キヌを䜿う。

// 珟圚の APNs 盎送の骚栌HTTP/2 + JWT
var jwt = /* p8 キヌで ES256 眲名した JWTTeam ID / Key ID */;
var http = new HttpClient { DefaultRequestVersion = HttpVersion.Version20 };
var req = new HttpRequestMessage(HttpMethod.Post,
    $"https://api.push.apple.com/3/device/{deviceToken}");   // 本番
//  https://api.sandbox.push.apple.com/... ← 開発環境の違いに泚意★
req.Headers.Add("authorization", $"bearer {jwt}");
req.Headers.Add("apns-topic", "com.example.myapp");
req.Content = JsonContent.Create(new { aps = new { alert = "本文" } });

ずはいえ、原文の刀断どおり
FCM 経由にする方が実装・運甚ずも容易
である。

開発基盀郚䌚 Wiki

Microsoft Learn

補足Azure Notification Hubs ずいう遞択肢: .NET 開発者向けに
補足しおおく。

【Azure Notification Hubs】
   APNs / FCM / WNS 等を【たずめお抜象化する】マネヌゞド サヌビス
     ・耇数のプラットフォヌムぞ 1 ぀の API で送れる
     ・タグによるセグメント配信
     ・倧量配信のスケヌリングを担う
     ・【トヌクンの管理を任せられる】★

【FCM 経由ずの比范】
   FCM 経由           
 Google に寄せる。無償。実装が単玔
   Notification Hubs  
 Azure に寄せる。有償。倧芏暡・倚媒䜓向け

 → 既に Azure を䜿っおおり、倧量配信が芁るなら怜蚎に倀する

Tags: 移行, プログラミング, ASP.NET, ASP.NET Web API, ASP.NET SPA, JavaScript

⚠ **GitHub.com Fallback** ⚠