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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Tomoki Kobayashi
September 06, 2025
Programming
3k
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
220
Skip Skip Run Run Run ♫
temoki
0
1k
さようならRxSwift こんにちは*****
temoki
1
600
Androidで不安定なPlatform Viewsとの闘い
temoki
0
1.2k
iOSパッケージマネージャー奮闘記 完結編
temoki
2
740
事業譲渡を受けたアプリとの統合で失敗、 そしてユーザーからの評価回復に至るまで
temoki
1
800
Apple Vision Proデベロッパラボに参加してきた
temoki
0
620
年末年始の成果、そして現状の紹介
temoki
0
320
Apple HIGのススメ
temoki
0
430
Other Decks in Programming
See All in Programming
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
570
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
190
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
380
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
150
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
330
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
260
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
1k
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
330
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
220
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.1k
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
310
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
210
Featured
See All Featured
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
460
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Claude Code のすすめ
schroneko
67
230k
We Have a Design System, Now What?
morganepeng
55
8.2k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Tell your own story through comics
letsgokoyo
1
980
Music & Morning Musume
bryan
47
7.3k
sira's awesome portfolio website redesign presentation
elsirapls
0
290
Leo the Paperboy
mayatellez
7
1.9k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
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