[unity]Mac で認証済みインストーラを作成する(2)[2023年最新]

Mac のアプリインストーラは macOS 10.15 Catalina 以降、公証(Notarization)が義務付けられたようなので、公証済みインストーラを作成しましょう。

この記事は 2 つ目の記事です。前回の記事はこちらを参照してください。

unity

ここからは unity の作業手順です。

unity 公式ガイダンス

ここに記載されていることを以下、わかりやすく説明します。

Player

Project Settings > Player > Other Settings > Mac App Store Options を設定します。

Bundle Identifier には com.[グループ名].[アプリ名] と入れておきましょう。

なお、Player の先頭にある Company Name がグループ名、Product Name がアプリ名です。
先頭の情報と Bundle Identifier を別にしたい場合に限り、Override Default Bundle Identifier に✔をつけ、直接入力します。

グループ名、アプリ名は日本語✖、記号も使わない(ハイフンやアンダーバーも✖)と考えておくと後々 iOS やら Android でも対応させたい場合、問題が起こりません。

ファイル .entitlements が必要

XCode で生成される以下のような XML ファイルを、保存しておくAssets/ 以下に入れる必要があります。

<?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.app-sandbox</key>
	<true/>
	<key>com.apple.security.files.user-selected.read-only</key>
	<true/>
</dict>
</plist>

XCode でちゃんと生成する場合

上記は XCode14.1 で作成した XML ですが、今後のバージョンによっては XML の内容が変化するかもしれないので、正規のルートで作成してみましょう。

このファイルは XCode の mac 用空プロジェクトで生成されます。

App - macOS
Product と Organization は適当

Product Organization を test にした場合、test/test/test.entitlements が生成されていると思います。

ダブルクリックすると xcode で開けますが、アプリによって色々と項目の追加が必要かもしれません。(足りないと、アプリによっては動かなくなったりします)

// ネットの送信、着信
	<key>com.apple.security.network.client</key>
	<true/>
	<key>com.apple.security.network.server</key>
	<true/>

// ファイルダイアログを通したファイル書き出し(通常は read-only: Yes)
	<key>com.apple.security.files.user-selected.read-write</key>
	<true/>

// MAP_JITフラグを使った書き込み
	<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
	<true/>

詳細はこちらを参照してください。entitlements は記述をミスるとアプリが起動しなくなりますので注意してください。

追加できたら、空プロジェクトのファイル .entitlements をターミナルでアクセス可能な、適当な場所に配置してください。(Assets/ 下に配置する必要はありません)

準備が出来たら mac でビルドし、Application.app(名前は任意)を作成しておきます。

ターミナル

ここからは、いままで用意したものを全て使いながら、ターミナルでコマンドを実行していきます。

必要なもの

1. [Sign App] キーチェーンアクセスの Developer ID Application

オレンジの枠部分全てが必要です。

2. [Sign Installer] キーチェーンアクセスの Developer ID Installer

3. [Team Id] チーム ID

Developer ID Application、Developer ID Installer どちらも同じ値だと思います。

4. [entitlements path] entitlements のパス

5. [App path] ビルドした app のパス

6. [Apple Id] Apple Id

7. [App password] App 用パスワード

Apple ID より作成します。詳しくは以前の記事を参照してください。

app の認証

codesign -o runtime -f --deep -s "[Sign Application]" --entitlements "[entitlements path]" "[App path]"

例)

codesign -o runtime -f --deep -s "Developer ID Application: team (A0123456789)" --entitlements "Build.entitlements" "Build.app"

確認

確認は任意です。上手くいってなさそうならこのコマンドで確認しましょう。

codesign -dvv "[App path]"

pkg の作成、承認

productbuild --component [App path] /Applications --sign "[Sign Installer]" [pkg の出力パス]

例)

productbuild --component /Users/user/mipass/Build/Build.app /Applications --sign "Developer ID Installer: groupMipass(A0123456789)" /Users/user/mipass/Build/Build.pkg

確認

pkgutil --check-signature [pkg の出力パス]

提出

*** Warning: altool has been deprecated for notarization and starting in late 2023 will no longer be supported by the Apple notary service. You should start using notarytool to notarize your software. (-1030)

altool は 2023 年後半には使えなくなるようなので、notarytool を紹介します。

Xcrun notarytool submit [pkg の出力パス] --apple-id "[Apple Id]" --password "[App password]" --team-id "[Team Id]" --wait

--wait を入れるとターミナルで検証待ちを確認できます。status が Accepted になれば検証成功です。
Submission Id は検証ログを表示する場合、必要になります)

なお、--wait を入れないとこっそり検証完了になった上、完了メールも来ないので注意しましょう(altool はメールが来ていたので、altool を知っている人ほど誤解なきよう)

2時間も待ちましたが、なにか

検証ログ

xcrun notarytool log [Submission Id] --apple-id "[Apple Id]" --password "[App password]" --team-id "[Team Id]"

json 形式で検証ログを確認することができます。status が Accepted 以外であれば、このログで詳細を確認しましょう。

オフライン環境でも認証できるようにする

ユーザーがオフライン環境でも認証可能にする(らしい?)には、以下のコマンドを適用します。

xcrun stapler staple [pkg の出力パス]

Processing が2行出た後、The staple and validate action worked! と出れば完了です。

終わりに

App Store と違って機械的、かつ簡単なチェックしか行われてなさそうですし、検証は数分で完了します。手順に慣れてしまえば再提出は簡単ですね。

検証したら今まで動いてたアプリが動かなくなった…という場合、ほとんどは entitlements の記述ミスだったり権限不備によるものだと思われます。見直してみましょう。

codesign 時、resource fork~ と出てしまう問題については別の記事で解説しました。

6件のコメント

  1. こんにちは。
    わかりやすい記事をありがとうございます。
    大変参考になります。

    終盤の提出を行うコマンド
    Xcrun notarytool submit [pkg の出力パス] -apple-id “[Apple Id]” -password “[App password]” –team-id “[Team Id]” –wait
    を実行したところ、
    Error: Missing value for ‘-p ‘
    というエラーになり、色々と試行錯誤はしたのですが解消せず、詰まってしまいました。
    もし解消方法をご存知でしたら、ご教示いただけないでしょうか。

    どうぞよろしくお願いいたします。

  2. タグと判定されてしまったようですので、タグ部分を全角に置換いたします。
    Error: Missing value for ‘-p <keychain-profile>’
    よろしくお願いいたします。

    1. –help で確認したところ -apple-id > –apple-id、-password > –password のようでした。記事を修正しておきますね。

      1. お返事ありがとうございます。
        その変更で提出を試行するところまでは進めることができました。
        ただ提出の結果がAcceptedでなくInvalidで、状況を以下のコマンド
        xcrun notarytool log [Submission Id] –apple-id “[Apple Id]” –password “[App password]” –team-id “[Team Id]”

        で確認したところ以下のような内容でした
        “logFormatVersion”: 1,
        “jobId”: “xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,
        “status”: “Invalid”,
        “statusSummary”: “Archive contains critical validation errors”,
        “statusCode”: 4000,
        “archiveFilename”: ****,
        “uploadDate”: “2023-03-22T03:27:08.701Z”,
        “sha256”: “xxxxxxxx”,
        “ticketContents”: null,
        “issues”: 省略(後述)

        issuesの値は膨大で、
        {
        “severity”: “error”,
        “code”: null,
        “path”: ****,
        “message”: “The signature of the binary is invalid.”,
        “docUrl”: “https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution/resolving_common_notarization_issues#3087735”,
        “architecture”: “x86_64”
        }
        といった内容の、400弱の配列となっていました。

        これらに含まれているstatusSummaryやstatusCodeで調べたりはしてみたのですが、解決策はまだ見つかっておりません。

        もし解消方法をご存じでしたら教えていただけないでしょうか。
        よろしくお願いいたします。

        1. * コメント内のプライベートな情報は xxxx で表記しなおしておきました。

          想像だと…… statusSummary より message の方がヒントになりそうな。
          entitlements になにか記述すべき事柄が足りてないとか、そんな風に見えます。
          (あくまで想像です)

          “notarytool The signature of the binary is invalid” などでググってみるのもいいかもしれません。

  3. ご配慮いただきありがとうございます。
    いただいたアドバイスを元にもう少し調べてみたいと思います。
    ご回答ありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA