‘Xojo’ タグのついている投稿

Xojoで作成したMac用アプリの公証を通す

2022/10/07

 macOSはセキュリティ強化の取り組みを継続的に強化していますが、macOS 10.15 Catalina以降でついに「アプリのインストール時にアップルのサーバに登録情報を照会しに行き、登録がなければインストールさせない」という処理を「必ず」行うようになったため(それ以前からあるにはありましたが回避方法が用意されていました)、アプリを作って配布する際のハードルがかなり上がりました。Adobeアプリで言うところのプロダクトアクティベートと同種の処理ですが、それをユーザーが作成して配布するアプリにも求めるようになったわけです。私が過去に作って配布していたアプリもこれに引っかかってダウンロードしてもインストールできない状態になっていましたが、アップルのサーバにアプリの情報を申請して登録するための手続き「Notarization/公証」を行い、配布できるようになりましたので以下に覚え書きとしてやり方を書いておきます。

 なお、これはXcode以外のビルド環境(Xojo)でビルドしたアプリを公証に対応させるための話なので、ターミナルのCUI操作で手続きをすることが前提になっています。参考にしたページはこちらなど。情報がほぼそのまま使えて大変有り難かったのですが、一部変更しないと処理が通らなかったり、また個人でフリーウェアを配布する程度の目的だと過剰な部分もありましたので、こちらでもメモを残しておこうと思いました。

Developer登録を済ませる

 開発したアプリを登録するためには申請者がAppleの登録Developerである必要があるので、まず事前にDeveloperの登録手続きを済ませておきます。二段階認証を済ませた端末から申請してDeveloperの年間登録料(2022年現在12,800円)を支払う必要があります(多分クレジットカードとの紐付け必須)。また、政府発行の身分証明書のコピーの送付が最終段階で必要でした(フォームから画像を送る)。会社としての登録の場合にはそれ以外に「D-U-N-S番号」が必要になるようです。詳しくはこちら
 自分の場合はMacのDeveloper.app内から申請して通しました。それ以前にiPhoneから申請したところずっと審査中で止まってしまっていて、あらためてMacから申請し直したらあっさり通ったような経緯です。止まっていた理由は何も表示されないのでよくわかりません。

「App用パスワード」を作っておく

 Xcode以外の環境でビルドしたアプリの登録には「App用パスワード」が必要になるとのことなので事前にこちらにDeveloper登録に使ったApple IDでログインしてApp用パスワードを作っておきます。「+」ボタンをクリックして分類名(任意でよい)を入れ、表示されるパスワードをメモしておきます。

App用パスワード

通知されたパスワードをメモしておく

キーチェーンアクセスで証明書(CSR)を発行しておく

 Macの「キーチェーンアクセス」アプリを開き、ドロップダウンメニューから「証明書アシスタント」「認証局に証明書を要求」を選択します。

認証局に証明書を要求・・・

認証局に証明書を要求・・・

 Apple IDの登録メールアドレス、通称(登録しようとしているアプリの略称など)を入れ、「ディスクに保存」「鍵ペア情報を指定」を選んで「続ける」をクリック。証明書ファイル(以下Apple Developer Programで作る証明書と紛らわしいので「CSRファイル」と呼称する)の保存先を指定し、次の画面で秘密鍵、公開鍵に「2048ビット」「RSA」の設定を選んで保存を実行します。これで指定した場所にCSRファイルが保存されたはずです。

証明書をディスクに保存

証明書をディスクに保存

 なお、この作業中何度かアカウントのログインパスワードの入力を求められましたが、これは環境によって変わるかもしれません。

アプリとインストーラーの証明書を発行する

 まずアプリ本体の証明書を発行します。Apple Developer Programのサイトにログインし、「アカウント」タブから「証明書、ID、プロファイル」「証明書(英語)」を選択し、次画面で「Certificates」の横の「+」ボタンを押して証明書の種類を選びます。

Apple Developer Programサイト

Apple Developer Programサイト

 Xcode以外で作成したアプリを自分のサイト等から配布したい場合は「Developer ID Application」を選んで「Continue」ボタンを押します。App Store経由での配布の場合はここで選ぶ証明書の種類が変わるようです。

発行する証明書の種類を選択

発行する証明書の種類を選択

 次に「Certificates, Identifiers & Profiles」の画面が出るので、画面下の「Choose File」ボタンをクリックし、さきほど作成して保存したCSRファイルを選択してアップロードします。「Profile Type」はよくわからなかったので「Previous Sub-CA」を選びましたが、特に問題なかったようです。「Continue」を押し、次の画面で「Download」をクリックして証明書をダウンロードします。

CSRファイルをアップロードする

CSRファイルをアップロードする

 同じくインストーラの証明書も必要になるので、「証明書、ID、プロファイル」「証明書(英語)」から「Developer ID Installer」を選んで証明書を作ります。CSRファイルは同じもので良いようです。

 ダウンロードした証明書のファイルをダブルクリックするとキーチェーンアクセスに取り込まれますので、その状態にしておきます。

Xojoでデベロッパ署名をいれた状態でアプリをビルドする

 Xojoで配布対象のアプリのビルド元ファイルを開き、発行されたDeveloper IDを「Build Settings」「macOS」内にある「Sign」に記入してアプリをビルドします。

Xojo内で署名を入れてアプリをビルド

Xojo内で署名を入れてアプリをビルド

 Developer IDはキーチェーンアクセスで対象の証明書の項目を見れば確認できるはずです。

Developer IDはキーチェーンアクセスで確認できる

Developer IDはキーチェーンアクセスで確認できる

 テスト時にはこのあとアプリ本体へのコード署名処理でエラーが出てしまって困ったのですが、この形で事前に署名を済ませておいてターミナルでのコード署名処理では署名部分を指定しないことで回避できたようです。
 また、同一の署名がキーチェーンアクセス内に複数あるとエラーになるようです。各アプリごとにアプリとインストーラーの証明書を取得してキーチェーンアクセスに登録する必要は無く、使い回して大丈夫な模様。あるいは公証が終わったらキーチェーンアクセス内の証明書は消す形でしょうか。
 なお余談ですが、パッケージ内に含めたい外部ファイル/フォルダはビルドする前にパーミッションを適切に設定しておかないとインストール後にそれが原因で一部の機能が動かなくなったりします(なった)。ターミナルで

などとやってパーミッションを設定しておきましょう。

配布用ファイル作成作業用のフォルダを作る

 配布用ファイル作成作業用のフォルダを作ります。今回は参照サイトに従ってMacのApplicationsフォルダにインストーラ(.pkg)でインストールする形を取りますので、pkg/Applications/“アプリ名フォルダ”/“アプリ名.App” の構成としました。

パッケージ作成用フォルダ構成例

パッケージ作成用フォルダ構成例

 署名の処理に必要になるentitlements.plistは参照先サイトのものをそのままコピーして保存(文字コードUTF-8指定に注意)。一応以下に同じものを置いておきます。

アプリ本体へのコード署名を行う

 以下のコマンドで署名処理を実行します。

 で作成作業フォルダに移動してから

 のコマンドを実行。「replacing existing signature」のメッセージが出ればOK。

 なお、参考にしたページの情報だと-sの後で指定するのが「”Developer ID Application: ${DEVELOPER_ID}”」となっていたのですが、なぜかこの指定だと「--options runtime」「--options というコマンドが見当たらない」という旨のエラーが出てしまっていました。その状態だとHardened Runtime対応がされないので、この後のAppleのサーバへの登録で蹴られます(ました)。理由はわからないのですが「“Developer ID Application”」とだけ入れておけば処理が通る模様。なんでしょうねえ。つまりここではアプリへのDeveloper IDの署名自体は行っていない(ビルド時にXojo内で済ませている)のですが、上記のコマンドの実行は必要です。

 署名ができているかの確認は以下のコマンドで行います。

 署名が確認できればOK。

署名が入っていることを確認

署名が入っていることを確認

インストーラパッケージ(.pkg)の作成

 次はインストーラパッケージの作成です。Dmg形式やZIP形式での配布もできるようなのですが、とりあえず参照先サイトに従ってpkg形式のインストーラを作成することとします。

 まずpkgファイルに含めるファイルを指定するための.plistファイルのひな形を出力します。

 で作成作業用フォルダ内のpkgフォルダに移動後、

 を入れると、packages.plistの名前でひな形が出てきます。

 それを開いて編集するとのことなのですが、参照先サイトに従ってとりあえず「BundleIsRelocatable」の指定を「false」にすることだけしました。以下に一応置いておきます。

 編集が済んだら、以下のコマンドを実行して「インストーラパッケージ」を作成します。

 「--identifier」で指定するリバースドメインはXojoのビルド元ファイルを開いて「Build Settings」「macOS」から「Bundle Identifer」を見れば確認できます。
 「--version」はインストーラのバージョンとのことなので何でもよさげですが、一応アプリのバージョンをそのまま入れました。
 実行すると「.pkg」ファイルが生成されます。

 なお、.pkgファイルを一旦XMLとして出力することでインストーラの内容を編集できるようなのですが、参照したサイトで記述があったタイトルの抜けもこちらの環境では見られなかったので省略しました。pkgutil側でアップデートがあったのかもしれません。

インストーラパッケージに署名を行う

 次にパッケージに署名を行います。以下のコマンドで「署名済のインストーラパッケージ」が作成できます。

 Developer IDは「キーチェーンアクセス」で対象の証明書の項目を見れば確認できます。

 署名できたかの確認は先ほどのアプリの時と同じく pkgutil --check-signature コマンドで

 で実行できます。

アップルの公証サーバにアップロードして登録

 いよいよ最終段階です。以下のコマンドを実行してアップルの公証サーバに登録を行います。

 しばらく経って

 のメッセージが出ればアップロードは完了です。

 このあと公証サーバで処理が行われ、終了後に登録メールアドレスに結果の通知が来ます。

 「Your Mac software was successfully notarized.」の通知が来れば公証は完了。あとは配布するだけです。

公証処理完了の通知メール

公証処理完了の通知メール

 一応ターミナルでの確認方法も書いておきます。

 で確認できます。「Status: success」と出ていればOK。

 なお、参照先サイトにはログに残さないためにApp用パスワードをキーチェーンアクセスに入れておいて指定する方法の記述もありましたが、個人作成フリーウェア程度では必要ないと思われたので割愛しました。

(2022.10.11)

アプリ内同梱ファイルのパーミッションについて追記

(2022.11.10)

WindowsでXojoからPerlを呼び出して使う

2017/09/25

 Xojoはクロスプラットフォーム開発環境なわけですが、Xojo単体内部でコードが完結してるならともかく、外部のPerlやらなんやらに処理を投げようとするといろいろプラットフォーム環境に依存して面倒なわけです。Macは根っこがBSDUnixなのでデフォルトでいろいろ入ってて面倒がないんですけどね。ということでどうにかこうにかWindowsでXojoからPerlに処理を投げることに成功したのでメモです。@kmutoさん、いろいろと助言ありがとうございました。助かりました。

StrawberryPerlをインストールして環境を構築

 まず、無料のPerl環境、StrawberryPerlをインストールして環境を構築しました。当初Windows10のBash on Ubuntu on Windowsに処理を投げようとしたり、ActivePerl使おうとしたりで四苦八苦しましたが、Bash on Ubuntu on WindowsだとXojo内からシェル経由でコマンド投げようとするといろいろ支障が出てきて動かなかったり(一応このあたりに知見はあるようなんですが手に負えず)、ActivePerlはXMLパーサーモジュールのインストールこれどうすりゃいいのよだったりして結局StrawberryPerlに落ち着きました。これ素晴らしいです。インストーラ普通にあるしCPAN普通に使えるし。セットアップはこのあたりを参考に。

実行ファイルと同じフォルダにPerlのファイルをコピーする指定

 Macではアプリ自体実はフォルダなので、アプリ内のフォルダにPerlのスクリプトをコピーしていたのですが、Winではそういう扱いにならないようなので実行ファイルと同じ階層にコピーする指定をします。で配布時には親フォルダごと渡す。まあ一般的なやつですね。ビルド設定のWindowsのところでビルドステップに「ファイルのコピー」を追加してやり、ウィンドウにコピーするファイルをドラッグアンドドロップしてコピー先に「Contents Folder」を指定すればいいようです。なおサブディレクトリ作ってそこにコピーする指定もできる模様。

XojoからPerlにシェル経由で処理を投げて実行

 あとはXojoからPerlにシェル経由で処理を投げるだけですが、Macとはフォルダの階層が異なるのと、StrawberryPerlの場合はBashではなくコマンドプロンプトに処理を投げることになるためパスやパイプ(コマンド連続実行)の記法が異なることに注意が必要なようです。具体的にはパスはシングルクォートではなくダブルクォートで囲まないとエラーになりますし、パイプに使う記号は「;」ではなく「&」です。なおXojo内でFolderItemのパスを「.NativePath」でString値として取得するとシングルクォートで囲まれた形でパスの文字列が返ってきてしまうので、変換してやらないと処理が通りません。ということでコードは以下のような感じ。

 シングルクォートをダブルクォートに変換するメソッドは以下のような感じ。なお引数pathStringをString型で定義していて、戻り値もString型で返す感じ。

 ここもうちょいスマートな感じで処理できればなと思うんですけどね。正規表現でゴリゴリ変換ってすごく泥臭い。

(2017.9.25)

XojoでのドロップレットUI

2017/07/18

 XojoでドロップレットのUIを作る必要があって調べたので備忘録として記しておきます。そのうちまた必要になりそうだし。なおMacで作ってます。Winでどうなのかはテストしてないのでわからないけど流れは多分ほぼ同じ。

アプリアイコンへのドラッグアンドドロップ

 アプリアイコンへのドラッグアンドドロップのやり方は以下。

1 ファイルタイプグループを作成

ファイルタイプグループを作成 新規にファイルタイプグループを作成し、適宜ドロップしたいファイルタイプを登録する。豊富にファイルタイプのバリエーションが用意されているのでその中から選ぶ感じ。なければ作る。

2 ビルド設定でドロップできるようにするファイルタイプを選択

 ビルド設定でドロップできるようにするファイルタイプを選択する。1で適切にファイルタイプを設定していれば選択できるようになっているはず。

3 Appのイベントハンドラ種別でOpenDocumentを選んでコードを記述

 AppのイベントハンドラでOpenDocumentを選んで実行したいコードを書く。例えば以下のような感じ。例では拡張子が.TXT以外のものをハネるようにチェックを入れている。もうちょいスマートな方法がありそうなのだが。

 チェック用メソッドは

 単純に正規表現で拡張子をチェックしてマッチするかどうかでTrue/Falseを返して判定してる感じ。

特定のウィンドウ内領域へのドラッグアンドドロップ

 特定のウィンドウ内領域へのドラッグアンドドロップのやり方は以下。

1 ファイルタイプグループを作成

ファイルタイプグループを作成 新規にファイルタイプグループを作成し、適宜ドロップしたいファイルタイプを登録する。豊富にファイルタイプのバリエーションが用意されているのでその中から選ぶ感じ。なければ作る。

2 ドラッグ&ドロップの対象にしたいエリアを作る

D&D対象エリアの作成 ドラッグ&ドロップの対象にしたいエリアを適宜作る。例ではWindow1の中にdropAreaという領域を設定している。

3 イベントハンドラ「Open」を設定

 ドラッグ&ドロップの対象エリアにイベントハンドラ「Open」を作り、コードを記述する。コードは以下。

 DropTypes.Textの部分は適宜変える。ドロップされるファイルの種別区分をしないならDropTypes.Allとか。

4 イベントハンドラ「DropObject」を設定

 ドラッグ&ドロップの対象エリアにイベントハンドラ「DropObject」を作り、コードを記述する。コードは以下。

 記述例では拡張子が.TXTかどうかをチェックした上で.TXTだった場合にパスをエリア内に記述している。チェックメソッドのコードは上と同じなので割愛。

 複数ファイルをドロップして連続実行させるには「do〜Loop Until Not obj.NextItem」で全体を囲む。

(2017.7.19)

※「RegExはデフォルトで大文字小文字を区別しない」との情報をいただいたのでコードをプチ修正しました。

(2017.7.19追記)

※複数ファイルドロップの場合について追記

(2022.3.4追記)

プロフィール
Jun Tajima

こちらにて、電子書籍&Web制作を担当しています。
このブログは、EPUB3をはじめとした電子書籍制作担当オペレータからの、「電子書籍の制作時にたとえばこんな問題が出てきていますよ」的な「現地レポート」です。少しでも早い段階で快適な電子書籍閲覧・制作環境が整うことを願って、現場からの声を発信していこうと目論んでおります。

当ブログ内の記事・資料は、私の所属しております組織の許諾を得て掲載していますが、内容は私個人の見解に基づくものであり、所属する組織の見解を代表するものではありません。また、本ブログの情報・ツールを利用したことにより、直接的あるいは間接的に損害や債務が発生した場合でも、私および私の所属する組織は一切の責任を負いかねます。