AppleScriptをアプリの形式で保存して、それを公証サービスに通す方法。

2019/10/24

ちょっとしたツールをAppleScriptで作ったのはいいが、それを配布しようとすると署名をつけたり公証サービスを通したりする必要があります。(2019年7月 macOS 10.14 Movaje)
AppleScriptで作成したアプリを「公証サービス(Notary,Notarized)」を通す手続きについてのメモです。

概要

AppleScriptで作ったアプリを配布するためには、コード署名をつけてから「公証」する必要があります。ここに書いてあるのを読んでがんばると公証の登録ができます。できないかもしれませんが。

公証サービス

アプリの安全性の向上のために「公証サービス」という仕組みをAppleははじめました。
将来はアプリの配布のために必須の事になりそうです。2019年秋のmacOS Catalinaからはこの処理をされていないアプリのインストールが面倒になっています。
Xcodeにより開発されるアプリはツール内の操作で簡単に公証が可能です。
しかし、AppleScriptで作成したアプリは他の方法で公証する必要があります。これはその手順です。

以下のドキュメントが参考になります。
https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution
https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution/customizing_the_notarization_workflow
https://support.apple.com/ja-jp/HT202491
https://developer.apple.com/videos/play/wwdc2019/703/
https://applech2.com/archives/20180609-apple-notary-service.html
https://qiita.com/wheel/items/ec59a6cb59c8ead5f6bc

前提

最新のiOSまたはmacOSのアプリ開発についての本を読んでいないと理解ができないかもしれません。
Appleのセキュリティの仕様は日々強化されて仕様が変更されています。ここに書かれていることは2019年10月の状態であり、最新の情報は随時確認してください。
ここでは個人開発者ではなく法人で開発している場合の事を中心に書きます。個人開発者とは異なる部分があります。(だいたい同じです)
作業者はDeveloper登録済みであること。各種証明書などもダウンロード・登録済みであること。
有効なDeveloper ID Application証明書、Developer ID Installer証明書をキーチェーンアクセスに登録しておいてください。わからなければ全部インストールすれば大丈夫です。
最新のXcodeがインストールされて、サンプルアプリを一つ作成してコード署名して実行していること。最低限これができないと後の操作は不可能です。
処理の当日に必ず一度Xcodeを起動してください。夜間にXcodeがアップデートされている場合があります。
なるべく楽な方法を書きますが、将来、そのツールが無くなることもあります、動作確認をしていない別な方法もメモしておきます。
ここに書いた方法以外でも上手くいくことがありますし、ここに書いた通りでも失敗することもあるでしょう。またバージョンによって動作が異なる可能性があります。同じ環境ではない場合は頑張ってください。
古いOS、開発環境での実行は非常に難しいか又は不可能なのでなるべく最新のツールを使用してください。
法人ユーザの場合、ユーザ権限が「App Manager」以上のものが必要です。管理者に依頼して変更してください。
サンプルのコマンドをそのまま実行してもあなたの環境ではおそらく動きません。自分の環境用にパスやファイル名を書き直せる知識か想像力が必要です。
作例としてlogcopy.appを扱います。
開発会社をAhiru Studio Co.,Ltd.とします。その他のパスワード、アドレスなどは架空のものが出てきますが、自分の会社などに読み替えて使用してください。

アプリの作成→CODESIGN

まずはAppleScriptを「アプリケーション」として「書き出す」。
保存されるファイルは「logcopy.app」。

# logcopy.appの中のmain.scpt をReadOnlyにする。

$ chmod a-w "logcopy.app/Contents/Resources/Scripts/main.scpt"

# Info.plist にCFBundleIdentifierを追加する

$ sudo defaults  write  /Users/hogehoge/Desktop/logcopy.app/Contents/Info  CFBundleIdentifier  "com.ahirustudio.applescript.logcopy"

# 署名する。

$ sudo codesign --sign "Developer ID Application: Ahiru Studio Co.,Ltd. (123456HOGE)" --identifier  "com.ahirustudio.applescript.logcopy"  --options runtime  --timestamp  --force  "logcopy.app"

# おまじない

$ sudo xattr -rc  "logcopy.app"
# CODESIGN 確認
$ sudo codesign --display --verbose=2  "logcopy.app"

(以前はここまでやれば配布できた。)

App用パスワード

https://appleid.apple.com
にログインし、画面から「App用パスワード」 を作成する。例 : AppPassword ; pass-word-pass-word (サーバから表示される。)

次にMacの「アプリケーション」→「ユーティリティ」の「キーチェーンアクセス」に「AppPassword」 を追加する。
「ファイル」メニューの「新規パスワード項目…」を選び、上から「AppPassword」「hogehoge@ahirustudio.com」「pass-word-pass-word」を入れて保存します。

Team IDの確認。

企業IDの場合に企業IDのShort Nameが必要になる場合があります。
確認方法は以下。(App用パスワードの名前は使わない)

$ xcrun iTMSTransporter -m  provider -u "hogehoge@ahirustudio.com" -p "pass-word-pass-word"

以下のように「Short Name」が表示される。

Provider listing:
   - Long Name -                       - Short Name -
1  Ahiru Studio CO., LTD. - ABCDEFGHIJ  123456HOGE
2  Ahiru Studio Co.,Ltd.                AhiruStudioCoLtd

試行錯誤してエラーが出ない方を使用してください。
また、後の処理で「Short Name」は使わないかもしれない。
※ xcrun はXcode Runか?
昔の資料で/Applications/Xcode.app/Contents/… となっているものはxcrunに置き換えてみるとうまくいくことがある。うまくいかないかもしれない。上記のコマンドも古いドキュメントでは「/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/itms/bin/iTMSTransporter」となっている。

公証

SD Notaryの最新版をダウンロードする。
https://latenightsw.com/sd-notary-notarizing-made-easy/
詳しい説明は全て書いてあります。(英語)

Developer ID : Ahiru Studio Co.,Ltd. (123456HOGE)
Apple ID :  hogehoge@ahirusutudio.com
App Specific Password : AppPassword
Apple Team ID : AhiruStudioCoLtd

「Submit App..」を押してアプリを指定する。
数分経つと完了。(ファイルをアップロードするため時間がかかる)
処理が終わるとメールが来る(英語)。
エラーの時はエラー内容をよく読む。エラーの時は値を変えて試してみる。
アップロードしたファイルを登録する処理なので、ファイルをダウンロードすることはない。
処理後にNotarizedフォルダにあるファイルはStapleの処理もしてある。
このファイルを公開すれば良い。

SD Notaryが中でやっているのは恐らく以下の手順(コマンド)。

$ ditto -ck --keepParent logcopy.app logcopy.app.zip (フォルダをzipにする)
$ xcrun altool --notarize-app --primary-bundle-id "com.ahirustudio.applescript.logcopy" -u "hogehoge@ahirustudio.com" --asc-provider "AhiruStudioCoLtd"  --password "@keychain:AppPassword"   --file "logcopy.app.zip"

(公証確認待ち。数分後にメールが通知が来る。成功の時は「You can now distribute your Mac software.」)
・stapler コマンドでバイナリにNotarizationチケットを結合する。
※チケットを結合するとインターネットに繋がっていない環境でアプリが実行された場合でもGatekeeperの処理ができる。
zipを解凍して、以下のコマンド発行

$ xcrun  stapler  staple    -v  "logcopy.app"
$ xcrun  stapler  validate  -v  "logcopy.app"   (確認)

トラブルシューティング

公証サービス進捗状態確認コマンド

なんとなく理解したら使う。理解できなかったら使わない方が良い。

$ xcrun altool --notarization-history 0 -u "hogehoge@ahirustudio.com" -itc_provider "AhiruStudioCoLtd"  --password "@keychain:AppPassword"  
$ xcrun altool --notarization-info 5678abcd-5678-1234-1234-567812348765 -u "hogehoge@ahirustudio.com" -itc_provider "AhiruStudioCoLtd"  --password "@keychain:AppPassword"  
$ xcrun altool --notarization-info f7b1aee2-c27c-4bbf-be5f-100294155173 -u "hogehoge@ahirustudio.com" -itc_provider "AhiruStudioCoLtd"  --password "@keychain:AppPassword"  

上手くいかないときは下記それぞれにログインして設定を確認する。
https://appleid.apple.com
https://developer.applecom
https://itunesconnect.apple.com/access/users