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

Ruby×iOSアプリ開発 ~共に歩んだエコシステムの物語~

Ruby×iOSアプリ開発 ~共に歩んだエコシステムの物語~

ながらRuby会議01で発表した資料です
https://regional.rubykaigi.org/nagara01/

Avatar for Tomoki Kobayashi

Tomoki Kobayashi

September 06, 2025
Tweet

More Decks by Tomoki Kobayashi

Other Decks in Programming

Transcript

  1. Tomoki Kobayashi @temoki 📱 iPhone 3 G 日 本上陸 (2008年)

    とほぼ同時に iPhone アプリ開発を始めた  信者 @nagara.rb https://bento.me/temoki • 自 動 車 メーカー系 SIer (新卒 入 社) • モバイルアプリ中 心 の受託開発 • スタートアップでモバイルアプリ開発 • 自 動 車 メーカーでモバイルアプリ開発 経歴 Matz 氏 とのご縁
  2. Ruby × iOS 年表 1995年   Ruby を発表 2001年  

    Mac OS X を発表 2004年   Ruby on Rails を発表 2007年   iPhone と iPhoneOS を発表 2008年   iPhone 3 G と iPhoneOS 2 そして App Store を発表
  3. iPhone 3 G と iPhoneOS 2 そして App Store デベロッパーの強い要望により

    iPhone のアプリを開発できるようになった! iPhone 3 G iPhone 2 代 目 、3G通信に対応(🇯🇵に上陸した最初のiPhone) iPhoneOS 2 iPhone 3 G に初期搭載された OS(現在のiOS) App Store iPhoneOS アプリ配信サービス(当初 Jobs は懐疑的) Cocoa Touch iPhoneOS のアプリ開発環境 Foundation/UIKitフレームワーク、Objective-Cランタイム Xcode Apple提供の統合開発環境、Interface Builder とセット
  4. Objective-C Appleプラットフォームを 支 えるオブジェクト指向 言 語 • 静的な C 言

    語に Smalltalk の思想を加えた動的なオブジェクト指向 言 語 • 動的ディスパッチ(実 行 時にメソッドを解決)による拡張性 • メッセージパッシング(オブジェクトにメッセージを送る) • [receiver message: arg] … 🤔 これってRuby? • Matz 「 言 語を設計する上での影響は、 大 きな順からC、 Lisp、 Smalltalk … 」 * ( R u b y ) * Biancuzzi, F., & Warden, S.『 言 語設計者たちが考えること』オライリー ・ ジャパン, 2010.
  5. (今後のOS名の表記について) 最新の名称に表記を統 一 します iOS (iPhone/iPad 用 OS) • iPhoneOS

    👉 2011年に iPad の発表に伴い iOS に改名 • 2016年に iPad 向けのものを iOS から分離 👉 iPadOS macOS (Mac 用 OS) • Mac OS X 👉 OS X に改名 (2011年) 👉 macOS に改名 (2016年)
  6. 2010年頃のiOSアプリ開発者の悩み 3 rd Party ライブラリのインストールが 大 変… • Objective-C =

    C 言 語の拡張 • C 言 語で 3rd Party ライブラリをインストールする 大 変さと同じ • ライブラリによって導 入方 法がまちまち • ビルド済み static リンクライブラリとヘッダーファイル • もしくはソースコード丸ごと、など • 統合開発環境 Xcode に GUI で設定しなければならない
  7. 統合開発環境 Xcode https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CocoaFundamentals/WhatIsCocoa/WhatIsCocoa.html 左図: “Cocoa Fundamentals Guide / What is

    Cocoa?” より引 用 右図: “Tools for iOS Development” より引 用 https://developer.apple.com/library/archive/referencelibrary/GettingStarted/URL_Tools_for_iPhone_OS_Development/_index.html コードエディタ Interface Builder
  8. 統合開発環境 Xcode 図: “Xcode 4 Transition Guide / Orientation to

    Xcode 4 ” より https://developer.apple.com/library/archive/documentation/IDEs/Conceptual/Xcode 4 TransitionGuide/Orientation/Orientation.html 図: “Xcode 4 Transition Guide / Orientation to Xcode 4 ” より引 用 Xcodeプロジェクトファイルの中 身 Xcodeプロジェクトのビルド設定 独 自 フォーマット 仕様が 非 公開
  9. CocoaPods 誕 生 待望のiOS/macOSアプリ 用 パッケージマネージャー • 2011年に Eloy Durán

    が Ruby で開発、発表 • 3 rd Party ライブラリのソースコード配布(中央集権型) • pod install コマンドだけで依存関係解決、ライブラリのダウンロード、 そして Xcode プロジェクトへの統合までを 自 動化 (Xcode プロジェクトを 自 在に操る Gem xcodeproj も CocoaPodsの 一 部) • iOS/macOSアプリ 用 パッケージマネージャーのデファクトスタンダードへ • Cocoa = iOS/macOSアプリ開発環境のこと
  10. CocoaPods ↔︎ RubyGems + Bundler CocoaPods は RubyGems + Bundler

    に 大 きな影響を受けて開発された CocoaPods RubyGems + Bundler 役割 iOS/macOSアプリの ライブラリ管理 Rubyのライブラリ管理 依存設定/ロック ファイル Pod fi le / Pod fi le.lock Gem fi le / Gem fi le.lock ライブラリの呼び名 Pod Gem ライブラリの仕様ファイル .podspec .gemspec 中央リポジトリ CocoaPods.org rubygems.org インストール/更新 コマンド pod install / update bundle install / update ファイルの記述 言 語 Ruby DSL Ruby DSL
  11. Ruby × iOS 年表 1995年   Ruby を発表 2003年  

    RubyGems を発表 2008年   iPhone 3 G と iPhoneOS 2 そして App Store を発表 2009年   RubyGems.org を開設 2011年   CocoaPods 開発スタート 2012年   nomad-cli 開発スタート 2014年   fastlane 開発スタート Ruby製のiOSアプリ開発 支 援 ツールが続々と 生 まれる }
  12. nomad-cli iOSアプリ開発のためのコマンドライン ・ ユーティリティ群 • 開発者 Mattt Thompson (@mattt) •

    nomad-cli.com • Shenzhen iOSアプリのビルドと配布 • Cupertino Apple Developer Center での開発 用 デバイス管理 • Houston Apple Push Noti fi cation Service によるプッシュ通知配信 • など…
  13. fastlane iOSアプリのベータ配信とリリースに関するあらゆる作業を 自 動化 • 開発者 Felix Krause (@KrauseFx) •

    fastlane.tools • nomad-cli の実質的な後継ツール • iOSアプリのビルド、コード署名、ベータ配信、App Store配信 • 特に iOS アプリの複雑なコード署名を CI/CD ツール上で 行 うために必須 • ワークフローを Ruby DSL (Fast fi le) で 自 由に記述できる
  14. なぜ Ruby で作られたのか? 開発者はなぜ Ruby を選んだのか • CocoaPods (Eloy Durán)

    • 開発者は Ruby のエンジニア、RubyGems + Bundler の影響 • nomad-cli (Mattt Thompson) • 開発者 は元 Rails のエンジニアで、iOSアプリ開発をはじめた • fastlane (Felix Krause) • nomad-cli の影響、CocoaPodsの機能活 用 、CocoaPods との統合 ✍ macOS にはシステム Ruby が標準搭載されてきた
  15. Molinillo モリニージョ CocoaPods の依存関係リゾルバー • CocoaPods 0 . 3 5

    (2014年) から搭載された依存関係リゾルバー • 開発者 Samuel Giddins (@ segiddins) • Stripe社のオープンソース 支 援プログラムを受けて CocoaPods のために開発 • 依存ライブラリ間のバージョンの 制約充 足 問題 の効率的な解決のために バックトラッキングというアルゴリズムを採 用 • 泡 立 て器がいくつかの材料をうまく混ぜ合わせて美味しい飲み物にしてくれるように、 依存関係をうまく混ぜ合わせて利 用 できるように助けてくれる
  16. Molinillo の逆輸 入 Bundler と RubyGems に Molinillo が搭載される! •

    Bundler 1 . 9 (2015年3 月 ) • Bundler Blog: Hello, Bundler 1 . 9 ! by Samuel Giddins • RubyGems 2 . 5 (2015年11 月 ) 👉 Rubyエンジニアを悩ませてきた Dependency Hell 問題を 大 きく改善 ✍ Molinillo は CocoaPods 専 用 ではなく汎 用 的な設計で作られていた https://bundler.io/blog/ 2 0 1 5 / 0 3 / 2 1 /hello-bundler- 1 9 .html
  17. Molinillo による依存関係解決 バックトラッキング アルゴリズム • 依存関係のツリーを探索し、制約のコンフリクトが発 生 した場合は、 前の選択に戻って別の可能性を試す、という動作を繰り返す •

    コンフリクトが発 生 した際、どの依存関係が原因であるかを特定し、 無駄な探索を省略して効率的に正しい組み合わせを発 見 できる
  18. Molinillo による依存関係解決 バックトラッキング アルゴリズム my_app • 1 . 0 .

    0 - network_lib ~> 2 . 0 - ui_kit ~> 1 . 0 json_parser • 2 . 0 . 0 • 1 . 1 . 0 • 1 . 0 . 0 network_lib • 2 . 1 . 0 - json_parser ~> 1 . 1 • 2 . 0 . 0 - json_parser = 1 . 0 . 0 ui_kit • 1 . 1 . 0 - json_parser ~> 2 . 0 . 0 • 1 . 0 . 0 - json_parser >= 1 . 0 . 0
  19. Molinillo による依存関係解決 バックトラッキング アルゴリズム my_app • 1 . 0 .

    0 - network_lib ~> 2 . 0 - ui_kit ~> 1 . 0 json_parser • 2 . 0 . 0 • 1 . 1 . 0 • 1 . 0 . 0 network_lib • 2 . 1 . 0 - json_parser ~> 1 . 1 • 2 . 0 . 0 - json_parser = 1 . 0 . 0 ui_kit • 1 . 1 . 0 - json_parser ~> 2 . 0 . 0 • 1 . 0 . 0 - json_parser >= 1 . 0 . 0
  20. Molinillo による依存関係解決 バックトラッキング アルゴリズム my_app • 1 . 0 .

    0 - network_lib ~> 2 . 0 - ui_kit ~> 1 . 0 json_parser • 2 . 0 . 0 • 1 . 1 . 0 • 1 . 0 . 0 network_lib • 2 . 1 . 0 - json_parser ~> 1 . 1 • 2 . 0 . 0 - json_parser = 1 . 0 . 0 ui_kit • 1 . 1 . 0 - json_parser ~> 2 . 0 . 0 • 1 . 0 . 0 - json_parser >= 1 . 0 . 0
  21. Molinillo による依存関係解決 バックトラッキング アルゴリズム my_app • 1 . 0 .

    0 - network_lib ~> 2 . 0 - ui_kit ~> 1 . 0 json_parser • 2 . 0 . 0 • 1 . 1 . 0 • 1 . 0 . 0 network_lib • 2 . 1 . 0 - json_parser ~> 1 . 1 • 2 . 0 . 0 - json_parser = 1 . 0 . 0 ui_kit • 1 . 1 . 0 - json_parser ~> 2 . 0 . 0 • 1 . 0 . 0 - json_parser >= 1 . 0 . 0
  22. Molinillo による依存関係解決 バックトラッキング アルゴリズム my_app • 1 . 0 .

    0 - network_lib ~> 2 . 0 - ui_kit ~> 1 . 0 json_parser • 2 . 0 . 0 • 1 . 1 . 0 • 1 . 0 . 0 network_lib • 2 . 1 . 0 - json_parser ~> 1 . 1 • 2 . 0 . 0 - json_parser = 1 . 0 . 0 ui_kit • 1 . 1 . 0 - json_parser ~> 2 . 0 . 0 • 1 . 0 . 0 - json_parser >= 1 . 0 . 0
  23. Molinillo による依存関係解決 バックトラッキング アルゴリズム my_app • 1 . 0 .

    0 - network_lib ~> 2 . 0 - ui_kit ~> 1 . 0 json_parser • 2 . 0 . 0 • 1 . 1 . 0 • 1 . 0 . 0 network_lib • 2 . 1 . 0 - json_parser ~> 1 . 1 • 2 . 0 . 0 - json_parser = 1 . 0 . 0 ui_kit • 1 . 1 . 0 - json_parser ~> 2 . 0 . 0 • 1 . 0 . 0 - json_parser >= 1 . 0 . 0
  24. Molinillo による依存関係解決 バックトラッキング アルゴリズム my_app • 1 . 0 .

    0 - network_lib ~> 2 . 0 - ui_kit ~> 1 . 0 json_parser • 2 . 0 . 0 • 1 . 1 . 0 • 1 . 0 . 0 network_lib • 2 . 1 . 0 - json_parser ~> 1 . 1 • 2 . 0 . 0 - json_parser = 1 . 0 . 0 ui_kit • 1 . 1 . 0 - json_parser ~> 2 . 0 . 0 • 1 . 0 . 0 - json_parser >= 1 . 0 . 0 🔥 コンフリクト!
  25. Molinillo による依存関係解決 バックトラッキング アルゴリズム my_app • 1 . 0 .

    0 - network_lib ~> 2 . 0 - ui_kit ~> 1 . 0 json_parser • 2 . 0 . 0 • 1 . 1 . 0 • 1 . 0 . 0 network_lib • 2 . 1 . 0 - json_parser ~> 1 . 1 • 2 . 0 . 0 - json_parser = 1 . 0 . 0 ui_kit • 1 . 1 . 0 - json_parser ~> 2 . 0 . 0 • 1 . 0 . 0 - json_parser >= 1 . 0 . 0 原因となった 選択まで戻る
  26. Molinillo による依存関係解決 バックトラッキング アルゴリズム my_app • 1 . 0 .

    0 - network_lib ~> 2 . 0 - ui_kit ~> 1 . 0 json_parser • 2 . 0 . 0 • 1 . 1 . 0 • 1 . 0 . 0 network_lib • 2 . 1 . 0 - json_parser ~> 1 . 1 • 2 . 0 . 0 - json_parser = 1 . 0 . 0 ui_kit • 1 . 1 . 0 - json_parser ~> 2 . 0 . 0 • 1 . 0 . 0 - json_parser >= 1 . 0 . 0
  27. Molinillo による依存関係解決 バックトラッキング アルゴリズム my_app • 1 . 0 .

    0 - network_lib ~> 2 . 0 - ui_kit ~> 1 . 0 json_parser • 2 . 0 . 0 • 1 . 1 . 0 • 1 . 0 . 0 network_lib • 2 . 1 . 0 - json_parser ~> 1 . 1 • 2 . 0 . 0 - json_parser = 1 . 0 . 0 ui_kit • 1 . 1 . 0 - json_parser ~> 2 . 0 . 0 • 1 . 0 . 0 - json_parser >= 1 . 0 . 0 👍
  28. Ruby × iOS 年表 2014年   Swift 発表 2015年  

    CocoaPods 0 . 3 6 で Swift 製ライブラリのサポート 2015年   Swift Package Manager (SPM) 発表 2017年   fastlane 2 . 6 9 . 0 で Swift サポート (Fast fi le が Swift で書けるように)
  29. Ruby × iOS 年表 2019年   将来的にmacOSからRubyが搭載されなくなるという発表 ‣ Ruby だけではなく

    Python などのスクリプト 言 語全般 ‣ 現在は互換性のために残っているだけ 2021年   Xcode Cloud および Cloud signing の発表 ‣ Xcode Cloud は Apple 製の CI/CD ツール( 面 倒なコード署名も 自 動) ‣ Cloud signing はクラウド上でアプリのコード署名を 行 う仕組み(CI/CD上でも) ‣ コード署名が重宝されていた fastlane のメリットが薄れる
  30. Ruby × iOS 年表 2023年   Bundler 2 . 4

    で依存関係リゾルバー Molinillo が引退 ‣ Dart (Flutter) 用 パッケージマネージャー pub のために Rust で開発された PubGrub を Ruby に移植したものにバトンタッチ ‣ なお、RubyGems は現在も Molinillo を使 用 2024年   CocoaPods のメンテナンスプラン発表 ‣ 主要ライブラリの SPM 対応で CocoaPods 剥がしが進む ‣ しかし Flutter と React Native により CocoaPods のトラフィックは増加傾向 ‣ 2016年12 月 をもって CocoaPods がリードオンリー化(新規登録 ・ 更新不可)
  31. まとめ Big thanks to Ruby!!! • Ruby のおかげで iOS アプリ開発のエコシステムは

    支 えられてきた • iOS アプリ開発のために 生 まれた CocoaPods の依存関係リゾルバー Molinillo により、Ruby のエコシステム(RubyGems, Bundler)が 大 きく改善された • Ruby × iOS のエコシステムのこの共 生 関係は、Swift の登場により縮 小 の道へ • すべての iOS アプリ開発者は Ruby がもたらしてくれた恩恵を忘れないでしょう!
  32. iOSDC Japan 2 0 2 5 のパンフ記事もぜひ(noteにも公開予定) https://fortee.jp/iosdc-japan- 2 0

    2 5 /proposal/ 9 0 e 5 9 0 1 4 - 6 9 7 8 - 4 9 5 3 - 8 be 9 -c 6 1 3 8 0 4 3 eef 6