Xcode 外で実行すると WKWebView でコンテンツを読み込めないとき
プログラミングで出逢った出来事
WebKit を使う osx アプリを Xcode でデバッグしているときはちゃんと動くのに、バイナリを直接起動するとコンテンツの読み込み時にアプリがハングアップすることがあったので、その解消方法を探してみました。
WebKit フレームワークの WKWebView
を使う osx アプリを作成していたのですけど、Xcode でデバッグしているときはちゃんと動くのに、バイナリを直接起動するとコンテンツの読み込みができないことがありました。
EXC_BAD_INSTRUCTION
コンテンツを WKWebView
に読み込もうと思って load
メソッドを実行したあたりで EXC_BAD_INSTRUCTION
エラーで強制終了してしまいます。
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes: 0x0000000000000001, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Termination Signal: Illegal instruction: 4
Termination Reason: Namespace SIGNAL, Code 0x4
Terminating Process: exc handler [11193]
少し前までは問題なく動いていた気がするのですけれど、Xcode のバージョンアップか何かが引き金になったのでしょうか。
フレームワークの明示リンクで解消
クリーンビルドしてみても直らず、とりあえず問題が WKWebView
に関係することから、
とりあえず思い当たるところとしては、それが実装されているフレームワーク WebKit.framework
を 暗黙的にリンクしている くらいでした。
iOS や macOS のアプリでは、いつ頃だったか import
でモジュールをリンクすることで、モジュールマップを使って必要なフレームワークが自動的に読み込まれるようになっていたと思うのですけれど、
ここくらいしか心当たりがなかったので、ものは試しにフレームワークを明示的にリンクしてみることにしました。
そうしてみたところ、バイナリーを直接実行する場合でも問題なく動作してくれるようになりました。
ちなみに、最初に思い浮かんだ解消策は『Embedded Binaries に追加する』だったのですけど、システム系のフレームワークではそれができなかったので、 試しに『Linked Frameworks and Libraries にだけ追加する』方法にしましたけれど、それで大丈夫でした。
これで問題解消ですけれど、もしこれが Xcode の不具合ならそのうち直るかもしれないので、少し時間をおいてまた暗黙リンクに戻して試してみようと思ってます。