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
3.4k
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
270
Skip Skip Run Run Run ♫
temoki
0
1.1k
さようならRxSwift こんにちは*****
temoki
1
650
Androidで不安定なPlatform Viewsとの闘い
temoki
0
1.2k
iOSパッケージマネージャー奮闘記 完結編
temoki
2
790
事業譲渡を受けたアプリとの統合で失敗、 そしてユーザーからの評価回復に至るまで
temoki
1
820
Apple Vision Proデベロッパラボに参加してきた
temoki
0
640
年末年始の成果、そして現状の紹介
temoki
0
340
Apple HIGのススメ
temoki
0
450
Other Decks in Programming
See All in Programming
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
460
書籍「プロフェッショナルAI駆動開発」紹介スライド
juntaromatsumoto
0
970
承認済みなのに差戻しできてしまうバグ、型で潰せます
shinchit
0
140
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
120
初めての模倣学習とVLA
natsutan
0
460
Swift愛好会100回記念 第1回を振り返る
jollyjoester
0
120
AIエージェント時代のコードレビューを設計する
nogu66
5
2.5k
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
4.3k
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
420
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
120
Oxlintはいいぞ(続)
yug1224
1
540
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
2
300
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.6k
Building Adaptive Systems
keathley
44
3.2k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
How to train your dragon (web standard)
notwaldorf
97
6.8k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
320
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
810
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
230
Crafting Experiences
bethany
1
280
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Ruling the World: When Life Gets Gamed
codingconduct
0
320
GitHub's CSS Performance
jonrohan
1033
470k
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