AppleのNotarization (公証) を通したmacOSアプリを野良配布する


動機

Xcodeで簡単にmacOSアプリのNotarizationを通せるようになったけど、いざ配布してみたら「マルウェアじゃねぇの?」ダイアログが出てくるし、Big Surに至ってはアプリが起動できない!あれー?ってなったので、そうならない方法を調べた。

ざっくりいうと・・・

  • ビルド設定でHardened Runtimeを有効にする。
  • アプリをcodesignする。これはXcodeが勝手にやってくれるからいい。
  • アプリをAppleに送って公証を受ける。Xcodeがやってくれる。

ここまではいい。普通。ここから先が重要かつXcodeが面倒みてくれなかった。

  • アプリをZipする。普通にやっちゃだめ。
  • ZipファイルをAppleに送って公証を受ける。

Zipしたらそのファイルも送らなきゃダメで、それはターミナル開いてシコシコとコマンド打たないとならなくてめんどくさかった。

具体的なやり方

Hardened Runtimeを有効にする

Xcodeでプロジェクトを開いてBuild Settingsを表示、検索窓に"hard"と入力したら"Enable Hardened Runtime"が出るので"Yes"にする。これでアプリをビルド(メニューのProductからArchiveを選択)。

アプリをcodesignしてAppleに送る

ビルドが終わったらOrganizerが勝手に開いてビルドしたアプリが一番上に来てるので、それを選択して右側の"Distribute App”ボタンをクリック。Select a method of distribution:と聞かれるので、Developer IDを選択してNext。Uploadを選択してNext。諸々聞かれるけどXcodeにsigningを任せる設定でどんどん進んでアップロードする。アップロードしてしばらく経つと、Notarizationできたよというメールが来る(失敗したことないので失敗したらどうなるかは知らない)。

アプリをExport

公証済みのアプリを選択して、"Export App"ボタンをクリック。適当な場所にアプリを保存する。

アプリをZipする

ここからはオフィシャルのコレに沿って進める。

ターミナルを開いて下記のコマンドを。パスは書くのめんどくさいから、ファイルのドラッグ&ドロップで適宜やればOK。

ditto -c -k --keepParent "アプリのパス" "作成したいZipファイルのパス"

App Passwordを取得する

ここを見てApp Passwordなるものを取得。一度取得したら以後は取得したパスワードが使える。

AppleにZipファイルを送る

% xcrun altool --notarize-app --primary-bundle-id "アプリのBundle ID" --username "アカウントのメールアドレス" --password "取得したApp Password" --file "Zipファイルのパス"

説明には --asc-provider を指定するように書いてあるが、説明で後述されている通り個人でアプリを作ってる場合は端折って構わない。

このコマンドの実行はしばらく時間がかかる。公証が終わるとAppleからメールが届く。その後はそのZipファイルを配布すれば「マルウェアかも…」って言われない!

以上。