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 の不具合ならそのうち直るかもしれないので、少し時間をおいてまた暗黙リンクに戻して試してみようと思ってます。