アプリの公証は、提出してから完了するまで時間がかかる。提出だけを済ませて別の作業を進め、あとから公証の完了を待ちたい場合がある。notarytool submitは既定で完了を待たず、提出IDだけを返す。完了の待機は、notarytool waitで別に実行できる。

$ xcrun notarytool submit [アプリ名].zip -p "[プロファイル名]"
$ xcrun notarytool wait [提出ID] -p "[プロファイル名]"

ここでは、提出と待機を分ける方法と、--timeoutで待機を打ち切る方法、終了コードの違いを紹介する。実行例はXcode 27.0に含まれるnotarytool 1.1.3のもの。

提出だけを済ませて提出IDを受け取る

submitに--waitを付けなければ、アップロードが終わった時点でコマンドが終了する。--wait/--no-waitの既定値は--no-waitである。

$ xcrun notarytool submit hello.zip -p "[プロファイル名]"
Conducting pre-submission checks for hello.zip and initiating connection to the Apple notary service...
Submission ID received
  id: [提出ID]
Successfully uploaded file
  id: [提出ID]
  path: [hello.zipのパス]
$ echo $?
0

公証の結果は、この時点では分からない。表示されたidが提出IDである。提出IDは、waitやinfo、logに渡す。

waitで公証の完了を待つ

提出IDをwaitに渡すと、公証が完了するまで待つ。

$ xcrun notarytool wait [提出ID] -p "[プロファイル名]"
Waiting for processing to complete.
Current status: In Progress...Current status: In Progress....Current status: Accepted.....Processing complete
  id: [提出ID]
  status: Accepted

Current status:の行に、状態の変化が表示される。最終的な状態がstatus:に表示される。公証が通った場合はAccepted、失敗した場合はInvalidなどになる。

完了済みの提出にもwaitできる

公証が完了した提出にwaitを実行すると、待たずにすぐ結果を表示する。

$ xcrun notarytool wait [提出ID] -p "[プロファイル名]"
Waiting for processing to complete.
Processing complete
  id: [提出ID]
  status: Accepted

提出済みの結果を確認したいだけの場合にも、waitが使える。

Invalidでも終了コードは0になる

公証がInvalidになっても、waitの終了コードは0である。

$ xcrun notarytool wait [Invalidになった提出ID] -p "[プロファイル名]"
Waiting for processing to complete.
Current status: In Progress...Current status: Invalid....Processing complete
  id: [提出ID]
  status: Invalid
$ echo $?
0

スクリプトで公証の成否を判定する場合は、終了コードではなく、出力のstatusを確認する。submit --waitでも同じ挙動になる。

参考: 【notarytool】公証に失敗した理由をログから調べる

--timeoutで待機を打ち切る

--timeoutを指定すると、指定した時間だけ待って、完了していなければ待機を打ち切る。

$ xcrun notarytool wait [提出ID] -p "[プロファイル名]" --timeout 1
Waiting for processing to complete. Wait timeout is set to 1.0 second(s).
Current status: In Progress...Timeout of 1 second(s) was reached before processing completed.
  id: [提出ID]

$ echo $?
124

打ち切った場合の終了コードは124である。公証が完了していないため、statusは表示されない。

submit --waitに--timeoutを組み合わせても、同じ出力と終了コードになる。

$ xcrun notarytool submit hello.zip -p "[プロファイル名]" --wait --timeout 1
...
Waiting for processing to complete. Wait timeout is set to 1.0 second(s).
Current status: In Progress...Timeout of 1 second(s) was reached before processing completed.
  id: [提出ID]

$ echo $?
124

打ち切っても公証は続く

--timeoutで打ち切るのは、notarytoolの待機だけである。Appleの公証サービス側の処理は続く。打ち切った提出の状態をあとからinfoで取得すると、Acceptedになっていた。

$ xcrun notarytool info [提出ID] -p "[プロファイル名]"
Successfully received submission info
  createdDate: [提出した日時]
  id: [提出ID]
  name: hello.zip
  status: Accepted

打ち切ったあとは、同じ提出IDでwaitやinfoを再度実行する。同じファイルを再提出する必要はない。

時間の単位

--timeoutには、整数と、省略可能な単位を指定する。

指定待機時間
1、1s1秒(単位を省略すると秒)
1m1分(60秒)
1h1時間

--helpには、3600、60m、1hの例が書かれている。1mを指定すると、Wait timeout is set to 60.0 second(s).と表示された。

指定が不正な場合は、終了コード64で終了する。s、m、h以外の単位や、0は指定できない。1.5のような整数以外の値や、負の値も指定できない。

$ xcrun notarytool wait [提出ID] -p "[プロファイル名]" --timeout abc
Error: The value 'abc' is invalid for '--timeout <duration>': Invalid suffix 'c'. Must be one of 's', 'm', 'h'.
...
$ xcrun notarytool wait [提出ID] -p "[プロファイル名]" --timeout 0
Error: The value '0' is invalid for '--timeout <duration>': Must specify a duration greater than 0.
...

終了コードのまとめ

waitで確認した終了コードをまとめる。

状況終了コード
公証が完了した(Accepted・Invalidとも)0
--timeoutで打ち切った124
提出IDが存在しない、またはほかのTeamの提出である69
提出IDがUUIDの形式でない、--timeoutの値が不正64

存在しない提出IDを指定した場合は、次のように表示される。

$ xcrun notarytool wait 00000000-0000-0000-0000-000000000000 -p "[プロファイル名]"
Waiting for processing to complete.
Submission does not exist or does not belong to your team.
  id: 00000000-0000-0000-0000-000000000000
$ echo $?
69

infoとの使い分け

infoは、提出の現在の状態を1回だけ取得して終了する。処理中の提出では、In Progressが表示される。

サブコマンド動作
info現在の状態を1回取得して終了する
wait完了するまで状態を確認し続ける

処理中かどうかだけを確認したい場合はinfo、完了まで待ちたい場合はwaitを使う。