Swiftで自作Frameworkを作ろうといろいろとやっている時のMEMOのひとつです。
以前作成したFrameworkは、とりあえずiOSシミュレーターで動けばいいやということで、実機用にビルドするとエラーが発生していました。
そこで今度は、実機でテスト(AdHoc用も含む)できるようにするために、Frameworkファイルを入れ替えてみようと思います。その時にひっかかったエラーがあったのでMEMOしておきます。ただ、この後やろうと思っているユニバーサル化を行えば、こんな入れ替えは必要ないと思うので、特別この作業をやらねばならないというわけではないはずです。
追記:「[Xcode6] Universal Frameworkを作る」を書きました。ユニバーサル化すれば、以下のことをせずとも実機でもiOSシミュレータでも両方に対応したFrameworkを用意できます。いろいろと実験してみたい人は以下のこともお試しを。
※ このMEMOは、有料iOSデベロッパー向けに公開されているベータ版「Xcode 6.2 beta 5」を使っています。Xcode6.1.xではこの通りに動かないかもしれません。
「[Xcode6] SwiftでCocoa Touch Frameworkを作る」の流れでFrameworkを作ってiOSシミュレータで動作することを確認したら、今度は実機で動くようにしてみます。まずは、iOSシミュレーター用にリンクしたframeworkを削除しちゃいます。
「Remove Reference」を選んで参照だけを解除しときましょう。実物をゴミ箱に入れる必要はなくそのままでいいと思います。
今度は、「JiminyCricket」プロジェクトの方で、「Products」の中の「JiminyCricket.framework」に対して「Show in Finder」をやって開かれる実物ファイルのある場所に「Debug-iphoneos」内の「JiminyCricket.framework」というファイルがあります。そのファイルを「WoodenHead」にドラッグしてリンクします。(「Debug-iphoneos」に入っている方が実機用で、「Debug-iphonesimulator」に入っている方がiOSシミュレーター用です)
「Copy items if needed」はオフで。
iOSシミュレーターの時と同様ですが、「Build Phases>Embed Framworks」に追加しておかないとエラーが出るので、こんな感じでドラッグして追加しておきます。
これでFrameworkファイルの入れ替えが行えたはずなのですが、こんな作業を繰り返していると、ビルドの際にエラーがいくつか発生したりすることがあります。
Apple Mach-O Linker Error …
このエラーでだいぶ悩みましたが、上記のように「delete」を行ってFrameworkまでの参照を削除しても、「Build Settings>Framework Search Paths」というところに、そのサーチパスが残ったままになってしまっているからのようです。このサーチパスは、Frameworkをリンクすると自動的に書き込まれるので便利ですが、削除のときに自動的に消してくれないので、そこがエラーに繋がってました。(Beta版だからかも)
ここの一覧の中から、iOSシミュレーター用のJiminyCricket.frameworkまでのパスの方を削除してあげて、ビルドしなおせば、あとはちゃんと実機でも動くようになりました。
自作したJiminyCricket.frameworkはユニバーサル化していないので、iOSシミュレータで動かすときは、iOSシミュレーター用にリンクし直し、実機で確認する場合は、実機用にリンクし直せば、このままの状態でもいけますが、それはあまりにも不便なので、次は、ユニバーサル化というのを試してみたいと思います。
追記:「[Xcode6] Universal Frameworkを作る」を書きましたのでご参考に。
東京造形大学卒業後、マクロメディア(現アドビ)に入社。QAやテクニカルサポートマネージャーとしてFlash、DreamweaverなどのWeb製品を担当。独立後、2007年に虫カゴデザインスタジオ株式会社を設立。2021年東京三鷹を拠点に。最近は、CakePHP、Laravel、Unity、ZBrush、Modo、Adobe Substance 3D、Adobe Firefly、Xcode、Firebaseにフォーカスしています。モバイルアプリ開発情報を主としたブログ「MUSHIKAGO APPS MEMO」の中の人。