コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】IOException: Write fault on path /XXXX/[Unknown]

概要

IOException: Write fault on path /XXXX/[Unknown]
  at System.IO.FileStream.WriteInternal (System.Byte[] src, System.Int32 offset, System.Int32 count) [0x00077] in <eae584ce26bc40229c1b1aa476bfa589>:0 
  at System.IO.FileStream.Write (System.Byte[] array, System.Int32 offset, System.Int32 count) [0x00090] in <eae584ce26bc40229c1b1aa476bfa589>:0 

Play Asset Delivery を使用してビルドしようとしたら、
Windows では問題なかったが、Mac だと上記の例外が出て
ビルドできない現象に遭遇した

発生している場所は JarSigner.cs の JarSignerResponder クラスの
CheckAndRespond 関数内の以下の場所だった

// Use UTF8 to support non ASCII passwords
var passwordBytes = Encoding.UTF8.GetBytes(password + Environment.NewLine);
stdin.BaseStream.Write(passwordBytes, 0, passwordBytes.Length); // ★この場所で例外
stdin.BaseStream.Flush();

Play Asset Delivery では自動で jarsigner を実行するが、
キーストアのパスワードの入力時に上記の例外が出ているような状況だった

var arguments = string.Format(
    "-keystore {0} {1} {2} -storepass {3}",
    CommandLine.QuotePath(_keystoreName),
    CommandLine.QuotePath(zipFilePath),
    CommandLine.QuotePath(_keyaliasName),
    CommandLine.QuotePath(_keystorePass));

JarSigner.cs の JarSigner クラスの Sign 関数内で
jarsigner に渡すコマンドライン引数を生成している箇所で
上記のように -storepass を指定するようにして

なおかつ JarSigner.cs の JarSignerResponder クラスの
CheckAndRespond 関数内の処理をすべて削除したら、
例外が発生しなくなり、正常に jarsigner の処理が完了するようになった

また、現象調査中に Mac の Terminal から直接 jarsigner を呼び出してみたら
「"jarsigner"がXXXXフォルダにアクセスしようとしています。」
というダイアログが表示されたので「OK」を押した
もしかしたらその対応も必須かもしれない