Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ServerSideSwiftAndContainerMachine - アプリ実装そのままクラウド

ServerSideSwiftAndContainerMachine - アプリ実装そのままクラウド

iPhone Dev Sapporo 2026年8月30日向けのプレゼンテーション資料

Avatar for notoroid

notoroid

August 29, 2026

More Decks by notoroid

Other Decks in Programming

Transcript

  1. 話す内容 • サーバーサイドSwift を支える技術について • gRPCとProtocol Bu er(Protobuf) • Container

    machine (macOS27〜) • Googl Cloud • アプリ側機能をサーバーサイドへの切り出しデモンストレーション ff • ローカルでテストできたコンテナはGoogle Cloud にでdeploy可能か?
  2. 自己紹介: 能登 要 • iPhoneアプリ開発者( X: @notoroid) • アプリ開発者歴(2008〜) •

    アプリ作って四半世紀(Windowsアプリ〜iOS) • 趣味はゲーム(反射神経が衰えと目の疲れが抜けない) • 最近遊んだゲーム • Splatoon Raiders (新作)は面白かったです
  3. googleの課題を解決したネットワークスタックが利用可能に① • Gooleのサービスは標準的なRequestやResponseフォーマットで は即応性が求められる自社サービスに使用できない • 自前で開発 • 通信プロトコルとしてhttp/2 (QUIC) •

    通信そのものを効率的に行うためのgRPC • gRPC上でのデータシリアライズとして ProtocolBuffer(Protobuf)を採用 • Google Cloudでのサポートおよび多プログラミング言語対応
  4. 唯一の信頼できる情報源(A Single Source of Truth)をどのように実現? ① .protoファイルでインターフェイスを定義 ネットワーク呼び出し定義 .proto ファイル

    ② Generatorでpackage生成 ④ Generatorで Stub生成 ③ アプリ(Xcode, VSCode)で API参照 ③ サーバーにStub組み込み GRPCProtobufGenerator サービスAPI サービスAPI SwiftPackage Stub iOS, iPadOS, macOSで動作 Google Cloud Cloud Run macOS arm64/linux(コンテナ) amd64/linux(コンテナ),etc
  5. SwiftNIO の技術スタック • サポートするOS GRPCNIOTransportHTTP2Posix • iOS GRPCNIOTransportCore NIOPosix NIOHTTP2

    NIOExtras NIOCore NIOSSL • macOS X509 SwiftASN1 • linux(arm64, amd64) • Windows11 クライアントからサーバーまでサポート
  6. ネットワークスタックの依存関係 TiledFlipperAPI サービス app target 共通コア(GRPCCore)を再利用 GRPCCore GRPCProtobuf GRPCNIOTransportHTTP2Posix grpc-swift-2

    · 2.4.2 grpc-swift-protobuf · 2.4.1 grpc-swift-nio-transport · 2.9.1 SwiftNIO 非依存 シリアライズのみ 実際にリンクされる唯一の枝 …TransportServices Network.framework版・未使用 POSIX ソケット (NIOPosix) GRPCNIOTransportCore SwiftProtobuf swift-protobuf · 1.38.1 TLS 証明書検証 内部共有ターゲット HTTP/2 フレーミング swift-nio-extras · 1.34.3 NIOPosix NIOHTTP2 swift-nio · 2.101.3 swift-nio-http2 · 1.45.0 NIOExtras NIOCertificateReloading NIOSSL X509 swift-nio-ssl · 2.37.2 swift-certificates · 1.19.4 ASN.1 NIOCore swift-nio · 2.101.3 (基盤) SwiftASN1 swift-asn1 · 1.7.1
  7. Swiftでのリアルタイムデータストリームの受け取り基盤 AsyncStream - Swift Concurrency • WWDC21で公開 • async/await/actor 向けのデータストリーム入力

    • エラーthrow付きAsyncThrowingStreamもあり AsyncStreamの使う場所が少なかったので 印象に薄かった
  8. AsyncStreamの例: 購読停止まで繰り返し /// 差し替え指示を一定間隔で流し続けるストリームを作る。 /// /// 止められるまで、落ちている列を 1 行ずつ下げながら新しい列を足し続ける。 ///

    受け取り側が読むのをやめるとストリームの終了が通知され、生成側のループも止まる。 func flips() -> AsyncStream<TileFlip> { AsyncStream { continuation in guard rows > 0, columns > 0 else { continuation.finish() return } } } Taskを作成し繰り返す let task = Task { while !Task.isCancelled { for flip in nextFlips() { continuation.yield(flip) } try? await Task.sleep(for: stepInterval) } continuation.finish() } continuation.onTermination = { _ in task.cancel() } Taskのsleep() を使って待つ。 購読停止でTaskを終了
  9. コンテナマシン(macOS27 later) https://developer.apple.com/jp/videos/play/wwdc2026/389 • Containerization framework を基盤 • 軽量の永続的なLinux環境を提供 •

    mac上のストレージをコンテナに割り当 て • macOS上アカウントをコンテナへコピー • ブリッジドネットワーキングは標準ではサ ポートせず
  10. Google Cloudとの相性 macOS上のlinuxコンテナでビルドできればGoogle Cloud にdeploy可能 ローカル環境(macOS) iOSアプリ クラウド環境(macOS) サーバー http/2,

    gRPC,非セキュア ローカル上のコンテナ iOSアプリ サーバー http/2, gRPC,非セキュア iOSアプリ Google Cloud上のコンテナ サーバー http/2, gRPC,セキュア通信
  11. クラウドにコンテナをデプロイする https://github.com/notoroid/TiledFlipper/tree/feature/support̲cloud̲container •Pros •Google CloudのCloud Runと相性が良い •コンテナで(amd64/linux) で動作 •Cons •macOSから直接deployはできなかった

    •Cloud Deploy経由でdeploy •ビルド時にSwift6.3 からSwift6.2 に変更しないとビルドが中断 •AI側でコンテナの結果を待ち受け方法が安定していない
  12. ローカル/クラウドでの相違 ソースコード ツールチェイン ローカル macOS27 arm/Linux クラウド Googl Cloud Cloud

    Run 同一 同一 Swift6.2 Swift6.3 通信 http/2 非セキュア Deploy - amd86/linx向 けに http/2 ビルドできず セキュア通信 Cloud Runを使 用
  13. notoroid - Speaker Deck 参考 • gRPCとSwiftによるリアルタイム のアプリやサービスの構築 • https://developer.apple.com/

    jp/videos/play/ wwdc2026/265 • コンテナマシンの詳細 • https://developer.apple.com/ jp/videos/play/ wwdc2026/389 • Platforms State of the Union • https://developer.apple.com/ jp/videos/play/ wwdc2026/102 • Swift Concurrency AsyncStreamを使ってみる • https://qiita.com/ tomoyuki̲HAYAKAWA/items/ 8b5a3a3b801fc622553f