Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ruby×iOSアプリ開発 ~共に歩んだエコシステムの物語~
Search
Tomoki Kobayashi
September 06, 2025
Programming
2.9k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Ruby×iOSアプリ開発 ~共に歩んだエコシステムの物語~
ながらRuby会議01で発表した資料です
https://regional.rubykaigi.org/nagara01/
Tomoki Kobayashi
September 06, 2025
More Decks by Tomoki Kobayashi
See All by Tomoki Kobayashi
Liquid Glass を Metal Shader で描きたいだけの人生だった…
temoki
0
210
Skip Skip Run Run Run ♫
temoki
0
970
さようならRxSwift こんにちは*****
temoki
1
590
Androidで不安定なPlatform Viewsとの闘い
temoki
0
1.1k
iOSパッケージマネージャー奮闘記 完結編
temoki
2
740
事業譲渡を受けたアプリとの統合で失敗、 そしてユーザーからの評価回復に至るまで
temoki
1
790
Apple Vision Proデベロッパラボに参加してきた
temoki
0
610
年末年始の成果、そして現状の紹介
temoki
0
310
Apple HIGのススメ
temoki
0
420
Other Decks in Programming
See All in Programming
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
120
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.3k
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
690
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
220
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
260
Oxlintのカスタムルールの現況
syumai
6
1k
Agentic UI
manfredsteyer
PRO
0
120
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
740
Swiftのレキシカルスコープ管理
kntkymt
0
220
CSC307 Lecture 17
javiergs
PRO
0
320
Spec-Driven Development with AI-Agents: From High-Level Requirements to Working Software
antonarhipov
2
480
Featured
See All Featured
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
200
4 Signs Your Business is Dying
shpigford
187
22k
Rails Girls Zürich Keynote
gr2m
96
14k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
330
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
940
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
480
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
380
Music & Morning Musume
bryan
47
7.2k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
250
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
200
Transcript
Tomoki Kobayashi 著 Ruby×iOSアプリ開発 共に歩んだエコシステムの物語 ながらRuby会議01
Tomoki Kobayashi @temoki 📱 iPhone 3 G 日 本上陸 (2008年)
とほぼ同時に iPhone アプリ開発を始めた 信者 @nagara.rb https://bento.me/temoki • 自 動 車 メーカー系 SIer (新卒 入 社) • モバイルアプリ中 心 の受託開発 • スタートアップでモバイルアプリ開発 • 自 動 車 メーカーでモバイルアプリ開発 経歴 Matz 氏 とのご縁
Ruby iOS
Ruby × iOS 年表 1995年 Ruby を発表 2001年
Mac OS X を発表 2004年 Ruby on Rails を発表 2007年 iPhone と iPhoneOS を発表 2008年 iPhone 3 G と iPhoneOS 2 そして App Store を発表
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 とセット
Objective-C Appleプラットフォームを 支 えるオブジェクト指向 言 語 • 静的な C 言
語に Smalltalk の思想を加えた動的なオブジェクト指向 言 語 • 動的ディスパッチ(実 行 時にメソッドを解決)による拡張性 • メッセージパッシング(オブジェクトにメッセージを送る) • [receiver message: arg] … 🤔 これってRuby? • Matz 「 言 語を設計する上での影響は、 大 きな順からC、 Lisp、 Smalltalk … 」 * ( R u b y ) * Biancuzzi, F., & Warden, S.『 言 語設計者たちが考えること』オライリー ・ ジャパン, 2010.
MyObject.h MyObject.m
https://speakerdeck.com/temoki/swift-playgroundsdetatorugurahuitukususiyou?slide= 4 5 iOSDC Japan 2 0 1 9 発表資料より
(今後のOS名の表記について) 最新の名称に表記を統 一 します iOS (iPhone/iPad 用 OS) • iPhoneOS
👉 2011年に iPad の発表に伴い iOS に改名 • 2016年に iPad 向けのものを iOS から分離 👉 iPadOS macOS (Mac 用 OS) • Mac OS X 👉 OS X に改名 (2011年) 👉 macOS に改名 (2016年)
Ruby iOS
2010年頃のiOSアプリ開発者の悩み 3 rd Party ライブラリのインストールが 大 変… • Objective-C =
C 言 語の拡張 • C 言 語で 3rd Party ライブラリをインストールする 大 変さと同じ • ライブラリによって導 入方 法がまちまち • ビルド済み static リンクライブラリとヘッダーファイル • もしくはソースコード丸ごと、など • 統合開発環境 Xcode に GUI で設定しなければならない
統合開発環境 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
統合開発環境 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プロジェクトのビルド設定 独 自 フォーマット 仕様が 非 公開
救世主 CocoaPods 誕 生 🐣
CocoaPods 誕 生 待望のiOS/macOSアプリ 用 パッケージマネージャー • 2011年に Eloy Durán
が Ruby で開発、発表 • 3 rd Party ライブラリのソースコード配布(中央集権型) • pod install コマンドだけで依存関係解決、ライブラリのダウンロード、 そして Xcode プロジェクトへの統合までを 自 動化 (Xcode プロジェクトを 自 在に操る Gem xcodeproj も CocoaPodsの 一 部) • iOS/macOSアプリ 用 パッケージマネージャーのデファクトスタンダードへ • Cocoa = iOS/macOSアプリ開発環境のこと
CocoaPods の重要なファイル Pod fi le アプリが依存するライブラリを Ruby DSL で記述する .podspec
ライブラリの仕様を Ruby DSL で記述する Podfile .podspec
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
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アプリ開発 支 援 ツールが続々と 生 まれる }
nomad-cli iOSアプリ開発のためのコマンドライン ・ ユーティリティ群 • 開発者 Mattt Thompson (@mattt) •
nomad-cli.com • Shenzhen iOSアプリのビルドと配布 • Cupertino Apple Developer Center での開発 用 デバイス管理 • Houston Apple Push Noti fi cation Service によるプッシュ通知配信 • など…
fastlane iOSアプリのベータ配信とリリースに関するあらゆる作業を 自 動化 • 開発者 Felix Krause (@KrauseFx) •
fastlane.tools • nomad-cli の実質的な後継ツール • iOSアプリのビルド、コード署名、ベータ配信、App Store配信 • 特に iOS アプリの複雑なコード署名を CI/CD ツール上で 行 うために必須 • ワークフローを Ruby DSL (Fast fi le) で 自 由に記述できる
なぜ Ruby で作られたのか? 開発者はなぜ Ruby を選んだのか • CocoaPods (Eloy Durán)
• 開発者は Ruby のエンジニア、RubyGems + Bundler の影響 • nomad-cli (Mattt Thompson) • 開発者 は元 Rails のエンジニアで、iOSアプリ開発をはじめた • fastlane (Felix Krause) • nomad-cli の影響、CocoaPodsの機能活 用 、CocoaPods との統合 ✍ macOS にはシステム Ruby が標準搭載されてきた
Ruby iOS
Molinillo モリニージョ メキシコの伝統的な泡 立 て器(ホットチョコレートなど) https://en.wikipedia.org/wiki/Molinillo_(whisk) 写真: Wikipedia Molinillo (whisk)
より引 用
Molinillo モリニージョ CocoaPods の依存関係リゾルバー • CocoaPods 0 . 3 5
(2014年) から搭載された依存関係リゾルバー • 開発者 Samuel Giddins (@ segiddins) • Stripe社のオープンソース 支 援プログラムを受けて CocoaPods のために開発 • 依存ライブラリ間のバージョンの 制約充 足 問題 の効率的な解決のために バックトラッキングというアルゴリズムを採 用 • 泡 立 て器がいくつかの材料をうまく混ぜ合わせて美味しい飲み物にしてくれるように、 依存関係をうまく混ぜ合わせて利 用 できるように助けてくれる
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
Molinillo による依存関係解決 バックトラッキング アルゴリズム • 依存関係のツリーを探索し、制約のコンフリクトが発 生 した場合は、 前の選択に戻って別の可能性を試す、という動作を繰り返す •
コンフリクトが発 生 した際、どの依存関係が原因であるかを特定し、 無駄な探索を省略して効率的に正しい組み合わせを発 見 できる
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
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
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
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
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
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
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 🔥 コンフリクト!
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 原因となった 選択まで戻る
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
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 👍
Ruby iOS
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 で書けるように)
Ruby × iOS 年表 2019年 将来的にmacOSからRubyが搭載されなくなるという発表 ‣ Ruby だけではなく
Python などのスクリプト 言 語全般 ‣ 現在は互換性のために残っているだけ 2021年 Xcode Cloud および Cloud signing の発表 ‣ Xcode Cloud は Apple 製の CI/CD ツール( 面 倒なコード署名も 自 動) ‣ Cloud signing はクラウド上でアプリのコード署名を 行 う仕組み(CI/CD上でも) ‣ コード署名が重宝されていた fastlane のメリットが薄れる
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 がリードオンリー化(新規登録 ・ 更新不可)
Ruby iOS
まとめ Big thanks to Ruby!!! • Ruby のおかげで iOS アプリ開発のエコシステムは
支 えられてきた • iOS アプリ開発のために 生 まれた CocoaPods の依存関係リゾルバー Molinillo により、Ruby のエコシステム(RubyGems, Bundler)が 大 きく改善された • Ruby × iOS のエコシステムのこの共 生 関係は、Swift の登場により縮 小 の道へ • すべての iOS アプリ開発者は Ruby がもたらしてくれた恩恵を忘れないでしょう!
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