白黒羊

【Unity】macOS appの公証を得る

問題

MacOS用にUnity Cloud Buildでビルドしたアプリを開こうとすると以下のメッセージが記されたダイアログが表示されました。

“Mac Test.app”が悪質なソフトウェアかどうかをAppleでは確認できないため、このソフトウェアは開けません。

このソフトウェアはアップデートが必要です。詳しくは開発元にお問い合わせください。

一度このダイアログが表示されたあとに再度右クリックして開くを選択すると、それ以降は「開く」オプションが増えて開けるようになるのですが、それをビルドのたびにするのは手間ですし、ほかの人に開いてもらうときにもダイアログが表示される状態は避けたいです。

このダイアログを表示しないようにするためには「公証」が必要になるようです。

手順

  1. https://developer.apple.com/account/resources/certificates/add にアクセスしてDeveloper ID ApplicationCertificateを作成します。
  2. CertificateSigningRequestをアップロードします。作り方はiOSアプリの認証のときと同じですが、iOS用に作ったものを使いまわすとうまくいかなかったです。新たなものを作りましょう。
  3. Macでキーチェーンアクセスを開いて、メニューから「証明書アシスタント」>「認証局に証明書を要求」を選択する。

    ユーザのメールアドレスに任意のメールアドレス、通称も何でも良いのですが今回はDeveloper ID用のものを作るので後で判別できるように「developer_id」としておきました。要求の処理のところは「ディスクに保存」を選択して、「鍵ペア情報を指定」にチェックを入れました。
  4. 保存場所を選んだら、鍵のサイズを2048ビット、アルゴリズムはRSAにして完成。これを先ほどのCertificateに与えます。
  5. できたCertificateをDownloadし、ダブルクリックしてKeyChainを起動しましょう。
    Developer ID Application : YourCompanyName (0123456789) のような名前の証明書の子要素として秘密鍵が追加されているのを確認して、その秘密鍵を右クリックして.p12ファイルを保存します。保存するときに自分でパスワードを設定するので覚えておいてください。
  6. https://appleid.apple.com でビルドアップロード用のパスワードを作ります(「セキュリティ」>「パスワードを生成」)。
    私はUpload MacOS Buildsというラベルをつけてみました。
    これによってabcd-efgh-ijkl-mnopみたいなパスワードができるのでこちらも覚えておきます。
  7. Unityを起動してPlayer SettingsをBundle Identifierを入力します。
  8. Unity Cloud BuildのConfigでMac用のTargetを作成して、Notarizationを編集します。
    Should Notarize?をYesに設定し、Bundle IDに先ほどUnityで設定したBundle Identifierを入力します。
    p12 Fileに先ほど保存した.p12ファイルをアップロードし、p12 Passwordにはそのときに設定したパスワードを入力してください。
    なお、Apple ID UsernameはApple IDのユーザネームで登録に使ったメールアドレス、Apple ID Passwordは[6]で作成したパスワード、Provider Short Nameは以下のコマンド(apple_idは上記Apple ID Username、xxxx-xxxx-xxxx-xxxxは上記Apple ID Password)で取得できるのですが、
    xcrun iTMSTransporter -m provider -u apple_id -p xxxx-xxxx-xxxx-xxxx
    キーチェーンアクセスで証明書を確認したときに自分の名前の横に括弧で囲まれている英数字の文字列、もしくはApple Developer websiteの右上に自分の名前に併記されている文字列なので、それらの方法で確認しても良いです。
  9. 以下のようなファイルをローカルで作り、YOUR_APP.entitlements という名前で保存して(YOUR_APPを自分のアプリの名前に置き換える)、Entitlements Fileに設定しましょう。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
       <key>com.apple.security.cs.disable-library-validation</key>
       <true/>
       <key>com.apple.security.cs.disable-executable-page-protection</key>
       <true/>
    </dict>
</plist>

これでビルドして無事公証が得られると上記のダイアログが表示されなくなります!

参考

Unity – Manual: Notarizing your macOS application

Apple Developer Documentation

https://www.hiroakit.com/archives/20200514/