⛳
【Unity】mac向けのビルドが、他人の環境で起動できない問題の解決(パーミッション等の問題)
恋愛メタバースMemoriaを運営するFlamers CTOの設楽(だーら)です。
Mac向けにビルドしたアプリをインターネット経由で配布すると、配布された人の環境で起動できないという問題が発生します。この記事ではその原因と回避方法についてまとめます。
TL;DR
- Unityでmac向けにビルドした.appをzip化して他人に配布した際に、配布された人のmac上でアプリが起動できない問題が発生する。
- パーミッションの問題と、セキュリティの問題(インターネット経由の入手であることを示す拡張属性の付与による制限)の2つが存在することと、その問題の解決策を示す
環境
- Unity 2021.3.7f1
- ビルドするマシン: Windows 10, macOS Monterey(CPU: Intel)
- ビルドされたアプリを起動するマシン: mac(OSや不定。CPUはIntel製、Apple silicon両方)
やりたいこと
- UnityでビルドTarget PlatformをmacOSとしてビルドする(AppName.appが出力される)
- AppName.appをzip化し、ギガファイル便やGoogleドライブなどのインターネットを経由して他人のmacに配布する。
- 渡された人のmacでAppName.appのzipを解凍し、起動できる
起きている問題
- 問題①: パーミッションの関係で起動できない。「アプリケーション"AppName"を開けません」という警告がでる。
- 問題②: セキュリティの関係で起動できない。「"AppName"は壊れているため開けません。ゴミ箱に入れる必要があります。」という警告がでる。
パーミッションと拡張属性について
概要
- 問題①はパーミッションが原因、問題②は拡張属性によるセキュリティ保護が原因となっている。それぞれについて先に見ておく。
- パーミッションは、「誰が、何をできるか」について管理されたもの。この記事が分かりやすい。
- 拡張属性は、ファイルに付与された、OS固有の特殊なファイル属性のこと。この記事が分かりやすい。
実際のファイルの状況
-
ls -l@
コマンドによって、回答したappのパーミッションと拡張属性の両方を調べることができる。 - 実行ファイルである、
AppName.app/Contents/MacOS/AppName
について調査 - 結果はこちら
ファイルの取得方法 | パーミッション | 拡張属性 | 問題 |
---|---|---|---|
A: 同じPC(mac)でビルドしたapp(Unityから出力されたそのもの) | -rwxrwxrwx |
無し | 無し |
B: 別PC(Windows)でビルドしたapp | -rw-rw-r--@ |
com.apple.quarantine | ①と② |
C: 同じPC(mac)でビルドし、web経由で再ダウンロードしたapp | -rwxrwxrwx@ |
com.apple.quarantine | ② |
D: 別PC(mac)でビルドし、web経由でダウンロードしたapp | -rwxr-xr-x@ |
com.apple.quarantine | ② |
- コマンドの実例(Cのパターン)
$ ls -l@ ~/Downloads/AppName.app/Contents/MacOS/AppName
-rwxrwxrwx@ 1 UserName staff 115638 2 17 18:55 /Users/UserName/Downloads/AppName.app/Contents/MacOS/AppName
com.apple.quarantine 57
問題①の原因と解決
発生条件
- WindowsPCでUnityを起動し、macOS向けにビルドした場合
- AppName.appをzip化し、AppName.app.zipを作成して、インターネット経由で他人のmacに配布する
- 配布された人のmacでAppName.app.zipを解凍し、AppNameをファインダーから起動しようとすると、以下のように「アプリケーション"AppName"を開けません」と出る。
- 警告モーダルの右上の?ヘルプボタンをクリックしても、何も表示されない
解決方法
- 実行権限(x)が無いことが原因。
- 以下のコマンドをターミナルで打つ
chmod a+x AppName.app/Contents/MacOS/*
捕捉
- 参考はUnityフォーラムの以下のスレッド
-
chmod
は、権限を変更するコマンド。a+x
は、全てのユーザー(a)に対して実行許可(x)を与えるという意味。 - chmodについて参考になる記事
- この問題は、WindowsPC上のUnityでビルドした場合のみ発生する。mac上のUnityでビルドした場合は発生しない。
問題②の原因と解決
発生条件
- Windows上のUnity、mac上のUnityのどちらでビルドしても発生する
- 問題①を解決した後(macでビルドした場合は問題①が発生しないのでzip解凍直後)、AppNameのアプリケーションを起動すると発生する。
- 「"AppName"は壊れているため開けません。ゴミ箱に入れる必要があります。」と警告がでる。
- この問題が発生するのは、インターネット経由での配布(ギガファイル便やGoogleドライブ経由)や、Airdrop経由の場合。SSDを相手に渡してコピーさせるときは発生しない。
解決方法
- 以下のコマンドを打つ
$ xattr -d com.apple.quarantine AppName.app
詳細
-
com.apple.quarantine
は、インターネットからダウンロードしたファイルに自動的に付与される拡張属性。 - 上記の表ように
ls -l@
コマンドで確認できる。また、以下のコマンドを打った際に、出力にNo such xattr
が入っていないことによっても確認できる。
$ xattr -p com.apple.quarantine AppName.app
-
$ xattr -d com.apple.quarantine AppName.app
コマンドによって、その属性を削除することができる。 - 参考はこちらのQiitaの記事
-
少し前のmacOSの場合これで普通に読めたのですが、最近のmacOS2は「ローカルでビルドしたものは読めるものの、それをzipにまとめてWeb経由で受け渡すと読めなくなる」という現象が発生します。おそらくセキュリティ的な理由で、ダウンロードしたアプリは任意のフォルダにアクセスできないようにして、代わりに/private/var/folders/...のようなサンドボックス的なフォルダにアクセスさせるようにしたのだと思います。
-
(余談)ビルド時のエラーについて
- mac向けのビルド時にエラーを発生させないためには、Project Settings > Player > Other Settingsの、Mac Configurationを全て埋める必要がある
恋愛メタバースMemoriaを運営するFlamers, Inc.のTech Blogです。 Unity / C# / VR系の記事を中心に投稿します。 常時積極採用中!wantedly.com/companies/flamers
Discussion
とても参考になりました!ありがとうございます。
こちらの記事のお陰で解決しました!
ありがとうございます!!