[Xcode6] 自作Frameworkを実機で動くようにしてみる

スポンサーリンク

Swiftで自作Frameworkを作ろうといろいろとやっている時のMEMOのひとつです。
以前作成したFrameworkは、とりあえずiOSシミュレーターで動けばいいやということで、実機用にビルドするとエラーが発生していました。

そこで今度は、実機でテスト(AdHoc用も含む)できるようにするために、Frameworkファイルを入れ替えてみようと思います。その時にひっかかったエラーがあったのでMEMOしておきます。ただ、この後やろうと思っているユニバーサル化を行えば、こんな入れ替えは必要ないと思うので、特別この作業をやらねばならないというわけではないはずです。

追記:「[Xcode6] Universal Frameworkを作る」を書きました。ユニバーサル化すれば、以下のことをせずとも実機でもiOSシミュレータでも両方に対応したFrameworkを用意できます。いろいろと実験してみたい人は以下のこともお試しを。

00

※ このMEMOは、有料iOSデベロッパー向けに公開されているベータ版「Xcode 6.2 beta 5」を使っています。Xcode6.1.xではこの通りに動かないかもしれません。

[Xcode6] SwiftでCocoa Touch Frameworkを作る」の流れでFrameworkを作ってiOSシミュレータで動作することを確認したら、今度は実機で動くようにしてみます。まずは、iOSシミュレーター用にリンクしたframeworkを削除しちゃいます。

01

「Remove Reference」を選んで参照だけを解除しときましょう。実物をゴミ箱に入れる必要はなくそのままでいいと思います。

02

今度は、「JiminyCricket」プロジェクトの方で、「Products」の中の「JiminyCricket.framework」に対して「Show in Finder」をやって開かれる実物ファイルのある場所に「Debug-iphoneos」内の「JiminyCricket.framework」というファイルがあります。そのファイルを「WoodenHead」にドラッグしてリンクします。(「Debug-iphoneos」に入っている方が実機用で、「Debug-iphonesimulator」に入っている方がiOSシミュレーター用です)

03

「Copy items if needed」はオフで。

04

iOSシミュレーターの時と同様ですが、「Build Phases>Embed Framworks」に追加しておかないとエラーが出るので、こんな感じでドラッグして追加しておきます。

05

これでFrameworkファイルの入れ替えが行えたはずなのですが、こんな作業を繰り返していると、ビルドの際にエラーがいくつか発生したりすることがあります。

Apple Mach-O Linker Error …

06

このエラーでだいぶ悩みましたが、上記のように「delete」を行ってFrameworkまでの参照を削除しても、「Build Settings>Framework Search Paths」というところに、そのサーチパスが残ったままになってしまっているからのようです。このサーチパスは、Frameworkをリンクすると自動的に書き込まれるので便利ですが、削除のときに自動的に消してくれないので、そこがエラーに繋がってました。(Beta版だからかも)

ここの一覧の中から、iOSシミュレーター用のJiminyCricket.frameworkまでのパスの方を削除してあげて、ビルドしなおせば、あとはちゃんと実機でも動くようになりました。

07

自作したJiminyCricket.frameworkはユニバーサル化していないので、iOSシミュレータで動かすときは、iOSシミュレーター用にリンクし直し、実機で確認する場合は、実機用にリンクし直せば、このままの状態でもいけますが、それはあまりにも不便なので、次は、ユニバーサル化というのを試してみたいと思います。

追記:「[Xcode6] Universal Frameworkを作る」を書きましたのでご参考に。

東京造形大学卒業後、マクロメディア(現アドビ システムズ)に入社。Quality AssuranceやテクニカルサポートマネージャーとしてFlash、DreamweaverなどのWeb製品を担当。独立後、虫カゴデザインスタジオ株式会社を設立。最近は、ZBrush、Xcode(Swift)、Firebase、Unity、Adobe Creative Cloud関連にフォーカスしています。モバイルアプリ開発情報を主としたブログ「MUSHIKAGO APPS MEMO」の中の人。