24
iOS ででででででで でででででででででででででで iOS/Android/AWS/Go でででででででででで ででででででででででででででで ででででででででででで でで でで

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

Embed Size (px)

Citation preview

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

iOS でライブラリを提供する際に気をつけたいこと【 iOS/Android/AWS/Go 】モノづくりにこだわる3社のアプリやサービス開発の裏側

株式会社ソニックムーブ坂原 明裕

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

坂原 明裕Twitter ID: @asakaharaブログ : http://sakahara.hatenablog.jp

• 前職ははてな ( 京都 ) で iOS エンジニア• 2015 年 7 月からソニックムーブのエンジニア• 広島 ( 地元 ) -> 京都 -> 島根

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

ソニックムーブ島根事業所

• 2014 年 11 月から開設• 松江駅から車で 10-15 分程度の山の上にあるオフィス• 現在はエンジニア5名

Page 4: iOSでライブラリを提供する際に気をつけたいこと
Page 5: iOSでライブラリを提供する際に気をつけたいこと
Page 6: iOSでライブラリを提供する際に気をつけたいこと
Page 7: iOSでライブラリを提供する際に気をつけたいこと
Page 8: iOSでライブラリを提供する際に気をつけたいこと

今日話すこと

• Static Library 、 Framework について• Framework で Bitcode に対応する方法• AppStore へ申請する際の注意点

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

Library の種類

• Xcode 6 から Cocoa Touch Framework が使える• それ以前は iOS では Cocoa Touch Static Library のみ

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

Static Library とは• アプリケーションのコンパイル時に組み込まれる形で

( 静的に ) リンクされるライブラリ• コンパイル時に組み込まれるので、その分アプリケーションのサイズが大きくなる• Xcode 5 までは iOS では Static Library しか使えない• 画像や Nib などのリソースを含むことができない

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

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つのパッケージにまとめたディレクトリ構造のこと

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

Framework の構造MyFramework.framework/ MyFramework -> Versions/Current/MyFramework Resources -> Versions/Current/Resources Versions/ A/ MyFramework Resources/ English.lproj/ InfoPlist.strings Info.plist Current -> A

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

Embedded Framework

• iOS8 、 Xcode6 から使用可能• Framework を作るのが簡単に ( ビルド用のスクリプトなど必要なくなった )

• App Extensions を使用するケースなどを想定し、簡単に複数ターゲットから参照・利用することができるようになった

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

Embedded Framework の注意点• Deployment Target を 8.0 以降にしたアプリにしか組み込めない• 実際には Swift で実装する場合、 framework の Deployment

Target を 7.0 にしておけば、 7.0 以降のアプリにも組み込みは問題なくできる• しかし上記設定だと AppStore へのアップロード時にエラーになる• iOS8 より以前をサポートしたい場合、 Embedded Frameworkではなく Static Library を Objective-C で作成する (Swift はサポートしていない )

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

Universal Framework

• 実機、シミュレータの両方の環境を一つの Frameworkで サポートする• New -> Target -> Other -> Aggregate で Universal

Framework 作成用のターゲットを作る• 作成したターゲット -> Build Phases -> + ボタン ->

New Run Script Phase で Run Script を追加

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

#!/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}"

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

Bitcode について• iOS9 からサポートしておりざっくり言うと Apple 側でアーキテクチャに合ったコンパイルをしてくれる• Archive 時以外は Bitcode が埋め込まれない• xcodebuild コマンドでビルドする場合は別途対応が必要• User-Defined に BITCODE_GENERATION_MODE を

bitcode で設定することで Archive 以外でも Bitcode を埋め込める

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

BITCODE_GENERATION_MODE の設定

アプリで Bitcode を有効にするためにはアプリ使う framework も全て対応が必須

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

AppStore へ申請する際の注意点• i386 x86_64 が Embedded Framework に含まれていると申請時にサポートしていないアーキテクチャがあるとしてエラーになる

• http://www.openradar.me/radar?id=6409498411401216

• 対応方法としてはアーカイブ時に Run Script で i386 x86_64 のアーキテクチャを削除する方法などがある

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

不要なアーキテクチャを削除する際の参考サイト• 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/

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

まとめ• iOS8 より以前をサポートするなら Static Library( 静的

Framework) を使い Objective-C で実装する• iOS8 以降のサポートでよいなら Swift で Embedded

Framework を使うのが一番手軽にできる• 可能な限り開発者の負担を下げるため

CocoaPods 、 Cartago( 今後は Swift Package Manager も ) で導入できるようにするとよい

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

最後に

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

島根に興味があるエンジニアの方を募集してます

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

ご清聴ありがとうございました!