Upload
asakahara
View
3.463
Download
0
Embed Size (px)
Citation preview
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/shUNIVERSAL_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 buildxcodebuild -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 も ) で導入できるようにするとよい
最後に
島根に興味があるエンジニアの方を募集してます
ご清聴ありがとうございました!