Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Embedded Frameworkのススメ
Search
Go Takagi
October 16, 2018
Programming
610
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Embedded Frameworkのススメ
https://nikkei.connpass.com/event/98887/
Go Takagi
October 16, 2018
More Decks by Go Takagi
See All by Go Takagi
アプリログインとWeb認証基盤をつなぐ ASWebAuthenticationSession 作法
shimastripe
1
600
日経電子版のStoreKit2フルリニューアル
shimastripe
4
1.8k
アプリ内課金と自社の認証認可基盤を連携する複雑な課金ネットワークを構築する
shimastripe
5
5.3k
日経iOSプロジェクトのマルチモジュール戦略
shimastripe
45
2.5k
UIKit ベースの Custom UIContentConfiguration API を 用いた複雑なカスタムセルの作り方
shimastripe
14
4.2k
リーダーアプリに外部課金リンクを設置する
shimastripe
2
2.1k
Effective PencilKit / 新聞スクラップ体験の実現
shimastripe
5
4.1k
SPM Build tools を用いて SwiftGen を導入する上での罠とTips / SPM-SwiftGen-Plugin
shimastripe
6
3.5k
Background Notificationで新聞紙面の大きい画像の自動ダウンロードを実現する
shimastripe
12
5.7k
Other Decks in Programming
See All in Programming
複数ドメインを一つのアプリに統合するFlutterの設計と運用_FlutterKaigi2026登壇資料(須永高弘)
takahirosunaga
0
140
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
170
Groovy as a human and AI friendly programming language
paulk
0
180
プロジェクトコードをキレイキレイしよう!暗黙的な参照を読み解く静的解析
ostk0069
0
200
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
510
SODA - FACT BOOK(JP)
sodainc
1
40k
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
710
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
1
2k
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
400
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
1.9k
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
280
Enforcing Your Architecture with Unit Tests in the AI Era (Swift Connection X)
steliosf
PRO
1
120
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
380
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
390
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Statistics for Hackers
jakevdp
799
230k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
A better future with KSS
kneath
240
18k
Test your architecture with Archunit
thirion
2
2.5k
Crafting Experiences
bethany
1
420
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
300
エンジニアに許された特別な時間の終わり
watany
109
250k
What's in a price? How to price your products and services
michaelherold
247
13k
Transcript
差分Buildでサクサク開発 Embedded Frameworkのススメ ⾼⽊ 豪 ⽇本経済新聞社インターン Otemachi.swift #02
‣ Status • 東京⼯業⼤学 M2 ‣ SNS • @shimastripe /
@shimastriper / @root ‣ Intern Task (iOS) • 電⼦版の3d touch • Modulesをフレームワーク化 ←Now!! ‣ Fav Language • Go (は?) ✴ ⼿持ちのMBPはiOSのBuildが⻑くて⾟い Go Takagi 2
翻訳「Buildを待つ僕」 3
1. スペックで殴る • iMacProを購⼊しましょう 2. プロダクトのボトルネックを減らす • 例えば型推論 • 重複コンパイルを減らす
• 差分Buildを促進したい • Build時間改善⽅法 4 Embedded Framework !!
‣ Embedded Frameworkの紹介 ‣ 電⼦版への導⼊に必要だったタスク ‣ Build時間改善した?? Agenda 5
Embedded Framework
‣ Info • AppとExtension間でコード共有する埋め込みFramework ‣ Build時間改善 • App, Extensionをまたぐ重複コンパイルの削減 ✴
Target Membershipの場合各々にコピーしてコンパイル • 差分Buildの促進 ✴ 「1⾏しかいじってないのに全体に…」が減らせる ‣ Appのサイズを⼩さくできる(起動時) • Dynamic Framework ‣ 名前空間 • 依存関係・レイヤーを嫌でも意識、例えばAPI Clientで切る Embedded Framework (iOS8) 7
電⼦版の導⼊の経緯 8 RichNotification実装しよう! Ref. Human Interface Guidelines
電⼦版の導⼊の経緯 9 RichNotification実装しよう! 共有Moduleが多い… Membership全部に 貼るの⾯倒くさい!!
電⼦版の導⼊の経緯 10 RichNotification実装しよう! 共有Moduleが多い… 未来のExtensionの数だけ コンパイルが遅くなる… Extension毎にコピー 重複コンパイルされる
電⼦版の導⼊の経緯 11 RichNotification実装しよう! 共有Moduleが多い… 未来のExtensionの数だけ コンパイルが遅くなる… 今のうちにFrameworkに!!
導⼊
‣ Emb に依存するLibrary/Framework ‣ 移⾏するModuleの設計 ‣ 躓きやすいところ 導⼊に向けて確認すべき項⽬ 13
‣ FrameworkはBridging-Headerが使えない • Clang Modulesを利⽤してモジュール化 • Headerをバイナリ化するためコンパイル時間の短縮にも C LibraryをModule Mapでモジュール化
14 ※ CommonCryptoはXcode10から標準Moduleに #import <CommonCrypto/CommonCrypto.h> #import <CommonCrypto/CommonRandom.h> shim.h module CommonCrypto [system] { header "shim.h" export * } module.modulemap CommonCrypto Module import CommonCrypto Swift 1. ModuleMapに読み込むHeaderを記述 2. Header Search Pathを指定 3. Swiftファイル上でImport可能になる
‣ Emb FrameworkはApp専⽤APIを持てない • Extensionが使えないAPIはダメ(リジェクト) ✴ Ex.) UIApplication.shared • Require
Only App-Extension-Safe API: YES ↑でBuildしたFrameworkしか利⽤できない ✴ してないものをLinkするとwarning ๏ linking against dylib not safe for use in application extensions ✴ 後述しますが、もちろん⾃前のコードに対しても対象 Dynamic Framework Link時の注意点 15
‣ EmbeddedFrameworkで使えるよう改善 • Bridging-Headerで読んでいたものをModuleMapに • OSSにSafe APIフラグのPR • Carthage化(Membershipの重複改善) •
どうしようもなかったらUnsafeなAPIをforkして削除 PR投げたりCarthage化したりコード消したり… 16
‣ 設計構造の⾒直し • 移⾏する前に設計が悪い箇所は直しておく ✴ Ex. UIViewControllerの型を⾒て分岐する箇所を取り除く ✴ Ex. App限定のAPIをApp側に持たせる(先述)
‣ Framework化 1. Modulesの移⾏、Framework単体でBuild Succeed 2. 外部(AppやExtension)から参照したいモジュールに アクセス修飾⼦を付加(public / open class) 3. AppやExtensionから参照する箇所にimportを付加 • statement毎にError出るのでものすごいエラー数になります Module群を移⾏ 17
‣ 直感的じゃないError • 何かが抜けて明⽰的に指定する必要性が⽣じるError ✴ ambiguous use of ✴ frameworkのimportし忘れ
✴ frameworkのextensionがPublicになってないとか • Repositoryを複製して何が参照できなくなったか 確認できるようにしておくといい ‣ 他ブランチとのpbxprojの衝突がとても多い • (オススメMergeツールあったら教えてください) 躓きやすいところ 1/2 18
‣ Emb Frameworkで利⽤できないFramework • CrashlyticsはInstanceをAppにしか持つことができない • 【対策】 ✴ Emb Framework上ではprotocolとして抽象的に定義
ApplicationからEmb Frameworkに逆Injection ‣ protocol extensionの衝突が解決できない • StringをextensionしてisEmptyフィールドを定義、 Framework同⼠で衝突すると区別することができない • 【対策】 ✴ 冗⻑な名前を避ける/extensionを⼯夫して名前空間(疑似)作る ๏ Ex. RxSwift 躓きやすいところ 2/2 19
‣ Build回数がとにかく多い • Error潰してBuildしてのサイクル • 作業はスペックいいPCでやるべき ‣ スペック低いとXcodeが死ぬ • 適当に移⾏するとエラー700件とか平気で出る
• Indexing Prebuilding って常にクルクルする • 静的解析が終わらない ✴ ジャンプ先が意味不明なファイルに⾶ぶ • 儚げに落ちる 感覚的に⾟いところ 20
Build時間改善した??
‣ 実機iPhone7plusで3回測って平均 ‣ 重複コンパイルしてた箇所が効いてる • Full Buildチェック 22 iMacPro2017 MBP2013
(Xcode10) Base Embed Base Embed Debug (second) 35.87 30.03 57.93 51.03 Release (second) 125.83 98.87 213.23 172.47 (あくまでゆるふわな実測値です)
‣ 差分Buildが効率的に起きててサクサク!! 差分Buildチェック 23 iMacPro2017 MBP2013 (Xcode10) FullBuild 差分Build FullBuild
差分Build Debug (second) 35.87 (30.03) 19.0 57.93 (51.03) 39.3 (あくまでゆるふわな実測値です)
‣ 従来の2分の1以下にBuild時間が短縮 • 僕が闘った 数秒は〜〜〜(完全にインパクト⾷われる) ✴ 重複・差分コンパイルの恩恵はちゃんと効いてます (ところで) Xcode10のBuildが凄い 24
iMacPro Xcode9 Xcode10 Debug (seconds) 81.94 30.03 今こそEmbeddedFrameworkに⼿をつけるチャンス!!
まとめ
‣ Build時間改善に役⽴つ • 差分Buildの促進 • 重複コンパイルの除去 • TargetMembership貼らなくていい • Appのサイズを⼩さくできる
✴ Dynamic Link過多に対するAppの⽴ち上がりの遅延は要確認 • レイヤーを意識した設計にも役⽴てる ‣ 移⾏するぞ!! 1. 作業時はスペックが⾼いPCでやるべき ‣ Build回数が通常より明らかに増えるため 2. 依存するLibrary / Frameworkの精査 ‣ 個⼈的にはここで苦労する⼿戻りが多かった 3. レイヤーの切り分け・設計構造の⾒直し 4. 移⾏ -> ひたすらErrorをつぶす Embedded Frameworkのススメ 26