macOSアプリに埋め込む実行バイナリのNotarization/Hardened Runtime対応は署名すればOK

f:id:iseebi:20190725004341p:plain 昨日の記事で、アプリはHardened Runtime対応されたものの、リソースとして埋め込まれる実行ファイルがHardened Runtimeに対応していない状態だったためNotarizationに失敗していました。

実は、Hardened Runtimeへの対応はアプリのビルド時ではなく、コードサインでフラグを立てることでなされます。

codesign コマンドに --options runtime をつけてバイナリを署名することで、Hardened Runtime対応となります。

codesign --force --options runtime --sign "Developer ID Application: Shin ISE (XXXXXXXXXX)" adb

CocoaPodsなど、Xcodeで処理されているバイナリに関してはXcode側にHardened Runtimeのフラグを立てることで署名されていますが、問題のバイナリはRun Script Phaseでバイナリをコピーするようにしていたので、これらコピーで追加した実行ファイルは独自に署名してやる必要があります。

というわけで、Run Script Phaseにcodesignコマンドの呼び出しを追加しました。--sign の引数は$CODE_SIGN_IDENTITYに置き換えて、このような形にしています。

f:id:iseebi:20190725004951p:plain

adb ビルドするための環境を整えないといけないと思っていたのでだいぶ道のりは長いかと思ったのですが、意外とすんなり行ってよかったです。


なお、Notarization は altool コマンドでアップロード後、非同期で処理に数分かかります。無料枠の実行時間に限りのあるApp Centerでやるのはあまり得策ではない気がしてきました…WebHookで他のCIやLambdaなどで監視したほうが良い気がしています。