SlideShare a Scribd company logo
1 of 24
iOSでライブラリを
提供する際に気をつけたいこと
【iOS/Android/AWS/Go】モノづくりにこだわる
3社のアプリやサービス開発の裏側
株式会社ソニックムーブ
坂原 明裕
坂原 明裕
Twitter ID: @asakahara
ブログ: http://sakahara.hatenablog.jp
• 前職ははてな(京都)でiOSエンジニア
• 2015年7月からソニックムーブのエンジニア
• 広島 (地元) -> 京都 -> 島根
ソニックムーブ島根事業所
• 2014年11月から開設
• 松江駅から車で10-15分程度の山の上にあるオフィス
• 現在はエンジニア5名
今日話すこと
• Static Library、Frameworkについて
• FrameworkでBitcodeに対応する方法
• AppStoreへ申請する際の注意点
Libraryの種類
• Xcode 6からCocoa Touch Frameworkが使える
• それ以前はiOSではCocoa Touch Static Libraryのみ
Static Libraryとは
• アプリケーションのコンパイル時に組み込まれる形で(静
的に)リンクされるライブラリ
• コンパイル時に組み込まれるので、その分アプリケーシ
ョンのサイズが大きくなる
• Xcode 5まではiOSではStatic Libraryしか使えない
• 画像やNibなどのリソースを含むことができない
Frameworkとは
• A framework is a hierarchical directory that encapsulates
shared resources, such as a dynamic shared library, nib
files, image files, localized strings, header files, and
reference documentation in a single package.
• 動的共有ライブラリ、nib、画像、ローカライズファイル
、ヘッダーファイル、ドキュメント等のリソースファイ
ルを1つのパッケージにまとめたディレクトリ構造のこ
と
Frameworkの構造
MyFramework.framework/
MyFramework -> Versions/Current/MyFramework
Resources -> Versions/Current/Resources
Versions/
A/
MyFramework
Resources/
English.lproj/
InfoPlist.strings
Info.plist
Current -> A
Embedded Framework
• iOS8、Xcode6から使用可能
• Frameworkを作るのが簡単に(ビルド用のスクリプトなど
必要なくなった)
• App Extensionsを使用するケースなどを想定し、簡単に
複数ターゲットから参照・利用することができるように
なった
Embedded Frameworkの
注意点
• Deployment Targetを8.0以降にしたアプリにしか組み込めない
• 実際にはSwiftで実装する場合、frameworkのDeployment Targetを
7.0にしておけば、7.0以降のアプリにも組み込みは問題なくできる
• しかし上記設定だとAppStoreへのアップロード時にエラーになる
• iOS8より以前をサポートしたい場合、Embedded Frameworkでは
なくStatic LibraryをObjective-Cで作成する(Swiftはサポートしてい
ない)
Universal Framework
• 実機、シミュレータの両方の環境を一つのFrameworkで
サポートする
• New -> Target -> Other -> Aggregate でUniversal
Framework作成用のターゲットを作る
• 作成したターゲット -> Build Phases -> +ボタン -> New
Run Script Phase でRun Scriptを追加
#!/bin/sh
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
# ビルドする
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk
iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator
ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
# iphoneos配下のframeworkをコピーする
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework"
"${UNIVERSAL_OUTPUTFOLDER}/"
# iphoneos配下のswiftmoduleをコピーする
cp -R "${BUILD_DIR}/${CONFIGURATION}-
iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/."
"${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"
# lipoコマンドでUniversal binaryを作成
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}"
"${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}"
"${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"
# プロジェクトフォルダ配下にframeworkをコピー
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"
Bitcodeについて
• iOS9からサポートしておりざっくり言うとApple側でアー
キテクチャに合ったコンパイルをしてくれる
• Archive時以外はBitcodeが埋め込まれない
• xcodebuildコマンドでビルドする場合は別途対応が必要
• User-DefinedにBITCODE_GENERATION_MODEをbitcode
で設定することでArchive以外でもBitcodeを埋め込める
BITCODE_GENERATION_MODEの設定
アプリでBitcodeを有効にするためにはアプリ
使うframeworkも全て対応が必須
AppStoreへ申請する際の注意点
• i386 x86_64がEmbedded Frameworkに含まれていると
申請時にサポートしていないアーキテクチャがあるとし
てエラーになる
• http://www.openradar.me/radar?id=6409498411401216
• 対応方法としてはアーカイブ時にRun Scriptでi386
x86_64のアーキテクチャを削除する方法などがある
不要なアーキテクチャを
削除する際の参考サイト
• Realmではstrip-frameworks.shという専用のスクリプト
を用意している
• https://github.com/realm/realm-
cocoa/blob/d59c86f11525f346c8e8db277fdbf2d9ff990d98/scripts/strip-
frameworks.sh
• 削除方法と削除するためのスクリプトが記載してある記
事
• http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-
dynamic-libraries-in-xcode/
まとめ
• iOS8より以前をサポートするならStatic Library(静的
Framework)を使いObjective-Cで実装する
• iOS8以降のサポートでよいならSwiftでEmbedded
Frameworkを使うのが一番手軽にできる
• 可能な限り開発者の負担を下げるためCocoaPods、
Cartago(今後はSwift Package Managerも)で導入できるよ
うにするとよい
最後に
島根に興味がある
エンジニアの方を募集してます
ご清聴ありがとうございました
!

More Related Content

What's hot

「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
Atsushi Nakamura
 

What's hot (20)

フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
凝集度と責務
凝集度と責務凝集度と責務
凝集度と責務
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
Riderはいいぞ!
Riderはいいぞ!Riderはいいぞ!
Riderはいいぞ!
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
 
「顧客の声を聞かない」とはどういうことか
「顧客の声を聞かない」とはどういうことか「顧客の声を聞かない」とはどういうことか
「顧客の声を聞かない」とはどういうことか
 
OSS活動の活発さと評価の関係について
OSS活動の活発さと評価の関係についてOSS活動の活発さと評価の関係について
OSS活動の活発さと評価の関係について
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
入門!Jenkins
入門!Jenkins入門!Jenkins
入門!Jenkins
 

Similar to iOSでライブラリを提供する際に気をつけたいこと

RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発
RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発
RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発
takuma mori
 
20120316 designerworkshoppublished
20120316 designerworkshoppublished20120316 designerworkshoppublished
20120316 designerworkshoppublished
Yoichiro Sakurai
 
SoftLayerオブジェクトストレージと連携サービスPBOXについて
SoftLayerオブジェクトストレージと連携サービスPBOXについてSoftLayerオブジェクトストレージと連携サービスPBOXについて
SoftLayerオブジェクトストレージと連携サービスPBOXについて
Shuichi Yukimoto
 

Similar to iOSでライブラリを提供する際に気をつけたいこと (20)

iOSでのFramework導入のおさらい #関モバ
iOSでのFramework導入のおさらい #関モバiOSでのFramework導入のおさらい #関モバ
iOSでのFramework導入のおさらい #関モバ
 
IBM Watson Services for Core ML
IBM Watson Services for Core MLIBM Watson Services for Core ML
IBM Watson Services for Core ML
 
Swiftを迷わず選んだ理由
Swiftを迷わず選んだ理由Swiftを迷わず選んだ理由
Swiftを迷わず選んだ理由
 
SwiftによるiOS開発再入門
SwiftによるiOS開発再入門SwiftによるiOS開発再入門
SwiftによるiOS開発再入門
 
SORACOM UG 関西 | SORACOMと、Sigfoxと、私
SORACOM UG 関西 | SORACOMと、Sigfoxと、私SORACOM UG 関西 | SORACOMと、Sigfoxと、私
SORACOM UG 関西 | SORACOMと、Sigfoxと、私
 
RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発
RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発
RubyKaigi2009 - RubyをつかったiPhoneアプリケーション開発
 
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
 
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞくレイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
 
サーバーレスアーキテクチャで悩んでます
サーバーレスアーキテクチャで悩んでますサーバーレスアーキテクチャで悩んでます
サーバーレスアーキテクチャで悩んでます
 
iOS6時代のTwitter / Facebook連携
iOS6時代のTwitter / Facebook連携iOS6時代のTwitter / Facebook連携
iOS6時代のTwitter / Facebook連携
 
Sola勉強会 chef入門 続編
Sola勉強会 chef入門 続編Sola勉強会 chef入門 続編
Sola勉強会 chef入門 続編
 
20120316 designerworkshoppublished
20120316 designerworkshoppublished20120316 designerworkshoppublished
20120316 designerworkshoppublished
 
Document based application
Document based applicationDocument based application
Document based application
 
iOSアプリを審査に提出してみた話
iOSアプリを審査に提出してみた話iOSアプリを審査に提出してみた話
iOSアプリを審査に提出してみた話
 
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
 
SoftLayerオブジェクトストレージと連携サービスPBOXについて
SoftLayerオブジェクトストレージと連携サービスPBOXについてSoftLayerオブジェクトストレージと連携サービスPBOXについて
SoftLayerオブジェクトストレージと連携サービスPBOXについて
 
SwiftでAndroidアプリ書けるってよ
SwiftでAndroidアプリ書けるってよSwiftでAndroidアプリ書けるってよ
SwiftでAndroidアプリ書けるってよ
 
ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦
 
The Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKitThe Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKit
 
Xcode7時代のアプリ配布
Xcode7時代のアプリ配布Xcode7時代のアプリ配布
Xcode7時代のアプリ配布
 

iOSでライブラリを提供する際に気をつけたいこと