asuka.json
リファレンスEpisode 18

第拾捌話

asuka.json

アプリの asuka.json のすべてのキーについて、型、デフォルト値、各プラットフォームでの働き

asuka.json はアプリのディレクトリに置くファイルで、プラットフォームとストアが知っておくべきアプリの情報を書きます。アプリの名前と ID、アイコン、アプリで開くリンクとファイル、署名の鍵などです。asuka dev、asuka build、asuka publish がこのファイルを読みます。asuka dev は起動時に読むので、変更したら一度止めて実行し直してください。

キーはすべて省略できます。このファイルがないアプリも、デフォルトの値でビルドして実行できます。Asuka が知らないキーは無視されるので、キーが効いていないように見えるときはつづりを確認してください。Asuka が受け付けられない値があると、ビルドは止まり、どのキーに何が求められているかを表示します(asuka.json: accent "red" (want #rrggbb or #rrggbbaa))。パスはアプリのディレクトリからの相対パスです。

このページではすべてのキーを紹介します。リリースのためにキーをどう組み合わせるかは配布で、各キーの働きの詳細は、下にリンクしたそれぞれのガイドで説明しています。

JSON
{
  "name": "Notes",
  "id": "com.example.notes",
  "version": "1.2.0",
  "build": 7,
  "icon": "icon.png",
  "accent": "#7c3aed",
  "scheme": "notes",
  "links": ["notes.example.com"],
  "fileTypes": [{ "name": "Notes Document", "extensions": ["note"] }],
  "shareTarget": true,
  "splash": { "image": "logo.png", "background": "#ffffff", "darkBackground": "#000000" },
  "ios": {
    "team": "ABCDE12345",
    "usage": { "NSCameraUsageDescription": "To scan your receipts." }
  },
  "android": { "keystore": "upload.jks", "keyAlias": "upload", "dynamicColor": true },
  "linux": { "summary": "Write things down", "categories": ["Office"], "license": "MIT" },
  "updates": { "publicKey": "…", "github": "you/notes" }
}

アプリ

これらのキーは、そのキーに意味があるすべてのプラットフォームで使われます。

キー 型 デフォルト 説明
name 文字列 ディレクトリの名前 アプリの名前です。アイコンの下、Mac のメニューバー、Windows のウィンドウのタイトル、Linux のランチャー、Web ページのタイトルに表示されます。ビルドで作られるファイルの名前にもなります(Notes.app、Notes.exe)。
id 文字列 dev.asuka.<directory> iOS と Mac では bundle ID、Android と Linux では application ID(Linux ではデスクトップファイル、アイコン、D-Bus の名前、データディレクトリに使われます)、Windows では AppUserModelID です。最初のリリースの前に変えてください。ストアとシステムはこの ID でアプリを識別します。Linux では英字、数字、_、- だけを使い、二つ以上の部分からなり、どの部分も数字で始まってはいけません。
version 文字列 1.0 ユーザーに見えるバージョンです。
build 整数 1 ビルド番号で、アップロードのたびに大きくする必要があります。asuka publish はストアにある最大の番号に 1 を足した番号を自動で付けるので、この値は開始の番号にすぎません。Windows のファイルバージョンは version と build を合わせたもの(1.2.0.7)になります。
icon パス なし(プラットフォームの汎用アイコン) 1024×1024 の正方形の PNG です。iOS 向けには透明部分を含めないでください。ビルドごとに、そのプラットフォームが必要とするサイズが作られます。App Store に出すには必須です。
accent 色 プラットフォームの色 "#rrggbb" または "#rrggbbaa"。iOS では tint、Android では Material 3 のカラースキームのシード、Mac では Accent、塗りつぶしのボタン、リンクの色(AppKit 自身のコントロールはユーザーの設定した色のまま)、Windows ではコントロールのアクセントカラー、Linux では libadwaita のアクセントカラー、Web ではページとマニフェストの theme_color になります。
orientations 文字列の配列 両方 "portrait"、"landscape"。スマートフォンでアプリが対応する画面の向きです。iPad では Split View とステージマネージャに必要なので、四つの向きすべてに対応します。Android 16 では、タブレットと折りたたみ端末でこの指定は無視されます。
scheme 文字列 なし アプリの URL スキームです。iOS、Android、Mac、Windows、Linux で、notes:// の URL がアプリを開き、ui.OnOpenURL がその URL を受け取ります。英字、数字、+、-、. を使い、先頭は英字にします。ディープリンクを参照してください。
links 文字列の配列 なし example.com のようなドメインで、その https のリンクがアプリを開きます。iOS のユニバーサルリンクと Android の App Links です。ドメイン側で関連付けのファイルを配信します。ディープリンクを参照してください。
fileTypes オブジェクトの配列 なし アプリが開くファイルの種類です。fileTypes を参照してください。
shareTarget true またはオブジェクト オフ iOS と Android で、ほかのアプリの共有シートにアプリを表示します。shareTarget を参照してください。
splash オブジェクト なし iOS と Android の起動画面です。splash を参照してください。
widgets オブジェクトの配列 なし iOS と Android のホーム画面ウィジェットです。widgets を参照してください。
shortcuts オブジェクトの配列 なし iOS と Android で、Siri、Spotlight、ランチャーに出すアクションです。shortcuts を参照してください。
background 真偽値 false デスクトップで、app.RunInBackground と同じように、トレイに常駐するアプリにします。起動時にウィンドウを開かず、ウィンドウがなくても動き続け、Mac では起動時から Dock にアイコンを出しません(LSUIElement)。バックグラウンドのアプリを参照してください。
singleInstance 真偽値 true Windows と Linux で、二回目の起動は引数を実行中のアプリに渡して(app.OnSecondInstance に、ファイルは ui.OnOpenFiles に)終了します。false にすると、起動した回数だけアプリが実行されます。Mac ではどちらの場合もアプリは一つしか実行されません。単一インスタンスを参照してください。
i18n オブジェクト locales(あれば) アプリのカタログの場所です。i18n を参照してください。
updates オブジェクト なし デスクトップアプリの署名付きアップデートです。updates を参照してください。
ios オブジェクト iOS のビルドの設定と、Mac のビルドの設定の一部です。ios を参照してください。
mac オブジェクト Mac のビルドのプロファイルです。mac を参照してください。
android オブジェクト Android のビルドの設定です。android を参照してください。
linux オブジェクト Linux のビルドがアプリについて書き出す情報です。linux を参照してください。
web オブジェクト Web のビルドの設定です。web を参照してください。

Windows のビルドに必要なのはこれだけです。署名の証明書は環境変数で渡します(配布を参照)。

fileTypes

アプリが開くファイルの種類です。ファイルマネージャー、メールの添付ファイル、「このアプリケーションで開く」から開かれたファイルは、ui.OnOpenFiles が受け取ります。それぞれの種類は次のようなオブジェクトです。

JSON
"fileTypes": [
  { "name": "Markdown Document", "extensions": ["md", "markdown"], "role": "viewer" },
  { "name": "Notes Document", "extensions": ["note"], "icon": "note.png" }
]
キー 型 デフォルト 説明
extensions 文字列の配列 必須 ファイル名の拡張子で、ドットは付けません("md"、"tar.gz")。
name 文字列 最初の拡張子を大文字にして「Document」を付けたもの システムが表示するファイルの種類の名前です。
mimeTypes 文字列の配列 Asuka がその拡張子について知っている MIME タイプ ファイルの MIME タイプです。Asuka が知らない拡張子では、アプリ独自のタイプ application/x-<app>-<extension> になります。
uti 文字列 既知の拡張子ならシステムのもの、それ以外は <id>.<extension> Apple のプラットフォームでの Uniform Type Identifier です。アプリの ID の下にある UTI はアプリ独自のタイプとして扱われ、エクスポートされ、アプリがそのファイルの所有者になります。それ以外の、システムが知らないかもしれない UTI はインポートされます。
conformsTo 文字列の配列 public.data、public.content エクスポートまたはインポートするタイプが準拠する UTI です。public.plain-text を指定すると、Quick Look とテキストエディターがそのファイルを扱えるようになります。
role 文字列 "editor" "editor" か "viewer"。アプリがそのファイルで何をするかを表します(Mac と iOS の CFBundleTypeRole)。
icon パス システムのアイコン、またはアプリのアイコン 正方形の PNG で、Mac、Windows、Linux でのファイルのアイコンになります。

ファイルの種類の宣言方法はプラットフォームごとに異なります。Mac と iOS では Info.plist の CFBundleDocumentTypes、Android ではインテントフィルター、Windows ではアプリの起動時にユーザーのレジストリ、Linux ではデスクトップファイルと shared-mime-info のパッケージ、Web ではマニフェストの file_handlers で宣言します。配布とファイルを開くを参照してください。

shareTarget

iOS と Android で、ほかのアプリの共有シートにアプリを表示します。共有されたものは ui.OnShare が受け取ります。true にするとテキストと Web のリンクを受け取ります。ほかのものも受け取るときはオブジェクトで指定します。

JSON
"shareTarget": { "types": ["text", "image/*", "video/*"], "max": 10 }
キー 型 デフォルト 説明
types 文字列の配列 ["text"] "text"(テキストと Web のリンク)と、MIME タイプで指定するファイル("image/*"、"video/*"、"audio/*"、"application/pdf"、何でも受け取るなら "*/*")。
max 整数 1 一度に受け取るファイルの数で、1 以上です。

iOS では、アプリの中の共有拡張機能(share extension)になります。独自の bundle ID(アプリの ID に .share を付けたもの)を持ち、リリースでは ios.shareProfile で署名します。ファイルを受け取る場合は、App Group group.<id> も必要です。配布とほかのアプリからの共有を参照してください。

splash

iOS と Android の起動画面です。アイコンをタップしてからアプリの最初のフレームが出るまで(または splash.Hide を呼ぶまで)、単色の背景の中央に画像を表示します。デスクトップと Web には起動画面がありません。

JSON
"splash": { "image": "logo.png", "size": 96, "background": "#4A63B5", "darkBackground": "#1B2440" }
キー 型 デフォルト 説明
image パス なし 正方形の PNG(ロゴ)。
size 整数 120 画像の幅をポイント(dp)で指定します。最大は 160 で、これが Android 12 のアイコンの円に収まる最大の大きさです。
background 色 "#ffffff" ライトモードでの背景色("#rrggbb")。
darkBackground 色 background ダークモードでの背景色("#rrggbb")。

起動画面を参照してください。

widgets

iOS と Android でのアプリのホーム画面ウィジェットです。中身はアプリの Go のコードから widget.Set で埋めます。

JSON
"widgets": [{ "kind": "today", "name": "Today", "description": "What's next", "sizes": ["small", "medium", "rectangular"] }]
キー 型 デフォルト 説明
kind 文字列 必須 widget.Set で使うウィジェットの名前です。英字、数字、_ を使い、先頭は英字にします。ウィジェットごとに異なる名前にします。
name 文字列 kind ウィジェットギャラリーに表示される名前です。
description 文字列 なし ウィジェットギャラリーに表示される説明です。
sizes 文字列の配列 ["small", "medium"] small、medium、large、そして iOS の extraLarge(iPad)と、ロック画面の circular、rectangular、inline。

iOS では、ウィジェットは独自の bundle ID(アプリの ID に .widgets を付けたもの)を持つ拡張機能になり、リリースでは ios.widgetProfile で署名します。ホーム画面ウィジェットを参照してください。

shortcuts

システムがアプリのために表示するアクションで、最大 10 個です。iOS の App Shortcuts(Siri、Spotlight、ショートカットアプリ、アクションボタン)と、Android のランチャーのショートカットになります。どれも、ui.OnOpenURL に渡される URL でアプリを開きます。

JSON
"shortcuts": [{ "id": "newNote", "title": "New Note", "url": "notes://new", "symbol": "square.and.pencil", "phrases": ["New note in ${app}"] }]
キー 型 デフォルト 説明
id 文字列 必須 英字、数字、_ を使い、先頭は英字にします。ショートカットごとに異なる ID にします。
title 文字列 必須 システムが表示する名前です。
url 文字列 必須 アプリを開く URL です。scheme の URL か、links のどれかの URL にします。
symbol 文字列 なし ui.Symbol が受け取るのと同じ、SF Symbol の名前です。
phrases 文字列の配列 "<title> in ${app}" Siri が聞き取るフレーズで、どれにもアプリの名前を表す ${app} を含めます。iOS だけで使われます。

ショートカットを参照してください。

i18n

アプリのメッセージカタログの場所です。カタログが locales ディレクトリにあるアプリには不要です。

JSON
"i18n": { "dir": "translations", "source": "ja" }
キー 型 デフォルト 説明
dir パス locales カタログを入れるディレクトリです。カタログは言語ごとに一つで、BCP 47 のタグを名前にします(en.json、pt-BR.json、zh-Hans.json)。
source 文字列 en、またはカタログが一つしかなければその言語 アプリを書いている言語です。そのカタログにはすべてのメッセージがあり、ほかの言語のカタログはそれにフォールバックします。

多言語対応を参照してください。

updates

デスクトップアプリのアップデートの設定で、アップデートに署名する鍵と、アップデートを公開する場所を指定します。asuka update keygen が鍵ペアを作り、このオブジェクトを出力します。

JSON
"updates": { "publicKey": "…the contents of asuka-update.pub…", "github": "you/notes" }
キー 型 デフォルト 説明
publicKey 文字列 必須 asuka-update.pub の中身で、アプリに組み込まれます。アプリは、秘密鍵で署名されたアップデートしか受け付けません。
github 文字列 "owner/name"。アップデートを置く公開リポジトリで、v1.2.0 のようなタグを付けたリリースにアップデートを入れます。
tagPrefix 文字列 "v" リリースのタグの接頭辞です。"desktop-v" のように別の接頭辞にすると、リポジトリの最新リリースが別のもののリリースであってもかまいません。その場合、アプリは GitHub API を通じて、この接頭辞のタグを持つ最新のリリースを探します。
url 文字列 github の代わりに、ファイルを配信する HTTPS のディレクトリ(S3 や R2 のバケット、CDN)を指定します。アプリは <url>/update-<target>.json を読みます。
feed 文字列 なし アプリが代わりに問い合わせる独自の HTTPS サーバーで、{target}、{version}、{channel} を含む URL で指定します。ファイルの置き場所として url も必要です。
s3 オブジェクト なし url を配信するバケットで、asuka publish がここにアップロードします。bucket(必須)、prefix(ディレクトリ。デフォルトはバケットのルート)、region(デフォルトは AWS_REGION、なければ AWS_DEFAULT_REGION、それもなければ us-east-1)、endpoint(R2 や MinIO のもの。デフォルトは Amazon S3)、pathStyle(デフォルトでは、endpoint を指定したとき、またはバケット名にドットを含むときに有効)を指定します。
privateKey パス なし 秘密鍵のパスで、自分のマシンでビルドするときに使います(~/ はホームディレクトリです)。
changelog パス CHANGELOG.md(あれば) Markdown のファイルで、その ## 1.2.0 のセクションがリリースノートになります。
deltas 整数 3 差分アップデート(変更された部分だけをダウンロードするアップデート)を提供する、さかのぼるバージョンの数です。0 なら提供しません。

github と url のどちらか一方が必要で、両方は指定できません。アップデートを参照してください。

ios

iOS のビルドの設定です。team は Mac のビルドのチームにもなり、usage の利用目的の文字列は Mac の Info.plist にも入ります。

キー 型 デフォルト 説明
team 文字列 なし アプリに署名する Apple Developer のチーム ID(ABCDE12345)です。
profile 文字列 インストール済みのうち最も合うもの アプリのプロビジョニングプロファイルで、パス、名前、UUID のいずれかで指定します。--profile で上書きできます。
shareProfile 文字列 インストール済みのうち最も合うもの 共有拡張機能(shareTarget)のプロファイルで、ID <id>.share 用です。
widgetProfile 文字列 インストール済みのうち最も合うもの ウィジェット拡張機能(widgets)のプロファイルで、ID <id>.widgets 用です。
notificationProfile 文字列 インストール済みのうち最も合うもの Notification Service Extension(push.Rewrite)のプロファイルで、ID <id>.notification 用です。
usage オブジェクト 各パッケージのもの 保護されたリソースの利用目的の文字列を、Info.plist のキーごとに指定します({"NSCameraUsageDescription": "To scan your receipts."})。アプリがインポートするパッケージが汎用的な文字列を用意していますが、自分で書いてください。
infoPlist オブジェクト なし Info.plist に追加する文字列のキーです。
backgroundModes 文字列の配列 なし Info.plist の UIBackgroundModes に追加します。"audio" を指定すると、画面がロックされていても録音と再生ができます。
iphoneOnly 真偽値 false iPad を対象から外します。iPad ではアプリは iPhone アプリとして、スマートフォンサイズのウィンドウで動きます。
nonExemptEncryption 文字列 "no" ビルドが暗号化について申告する内容(ITSAppUsesNonExemptEncryption)です。これは法的な申告で、内容は開発者が判断します。"no"、"yes"、または何も申告しない "ask" を指定します。"ask" の場合は、アップロードのたびに App Store Connect が尋ねます。
collected オブジェクトの配列 なし アプリが収集するデータで、プライバシーマニフェストに使います(下記を参照)。
appStoreConnect オブジェクト asuka publish がアップロードに使う App Store Connect API キーです。keyId、issuerId(個人キーでは不要)、key(.p8 のパス。デフォルトは、altool と同じく ~/.appstoreconnect/private_keys にある AuthKey_<keyId>.p8)を指定します。公開を参照してください。

collected の各要素はデータの種類で、Apple の名前から接頭辞を除いたもので指定します。これは Asuka が書き出すプライバシーマニフェストに使われます(アプリ独自の ios/PrivacyInfo.xcprivacy があれば、Asuka のマニフェストとこの設定はそれに置き換わります)。

JSON
"collected": [{ "type": "EmailAddress", "linked": true, "tracking": false, "purposes": ["AppFunctionality"] }]
キー 型 説明
type 文字列 "EmailAddress" は NSPrivacyCollectedDataTypeEmailAddress を表します。
linked 真偽値 ユーザーの身元と結び付けられるかどうか。
tracking 真偽値 ユーザーのトラッキングに使われるかどうか。
purposes 文字列の配列 "AppFunctionality" は NSPrivacyCollectedDataTypePurposeAppFunctionality を表します。

配布を参照してください。

mac

Mac のビルドがアプリの署名に使うものです。チームは ios.team です。

キー 型 デフォルト 説明
profile 文字列 ASUKA_MAC_PROFILE。なければ、プロファイルが必要なアプリではインストール済みのうち最も合うもの Developer ID(または開発用)のプロビジョニングプロファイルのパス、名前、UUID です。プッシュ通知、Sign in with Apple、App Attest に必要です。
appStoreProfile 文字列 インストール済みのうち最も合うもの --appstore で使う Mac App Store のプロファイルです。

--profile と ASUKA_MAC_PROFILE で上書きできます。配布を参照してください。

android

Android のビルドの設定です。

キー 型 デフォルト 説明
keystore パス なし リリースに署名するアップロード鍵のキーストアです。キーストアのパスワードは ASUKA_KEYSTORE_PASSWORD、鍵のパスワードは ASUKA_KEY_PASSWORD(デフォルトはキーストアと同じ)で渡します。
keyAlias 文字列 なし キーストアの中のアップロード鍵のエイリアスです。
dynamicColor 真偽値 false Material のアプリと同じように、ユーザーの壁紙から色を取ります(Android 12 以降)。それ以外の環境では accent がシードになります。
permissions 文字列の配列 各パッケージのもの マニフェストに追加する権限です("android.permission.CAMERA")。"<name>:28" と書くと、Android 9(API 28)までだけ権限を要求します。アプリがインポートするパッケージは、必要な権限を自分で追加します。
googleServices パス なし asuka/sdk/push で使う、Firebase プロジェクトの google-services.json です。
mapsKey 文字列 なし asuka/sdk/maps で使う、Google Maps Platform の API キー(Maps SDK for Android)です。
serviceAccount パス なし asuka publish が Google Play へのアップロードに使う、Google Cloud のサービスアカウントの JSON キーです。リポジトリには入れないでください。

配布を参照してください。

linux

Linux のビルドが、デスクトップファイルと AppStream の metainfo に書き出すアプリの情報です。ランチャー、ソフトウェアセンター、Flathub に表示されます。Flathub とソフトウェアセンターは、概要、説明、ライセンス、開発者を求めます。

キー 型 デフォルト 説明
summary 文字列 なし アプリが何をするかを一行で書きます。
description 文字列 なし 空行で区切った数段落の説明です。
categories 文字列の配列 ["Utility"] freedesktop.org のメインカテゴリー:Utility、Office、Development、Network など。
keywords 文字列の配列 なし ランチャーでアプリを見つけるための追加のキーワードです。
license 文字列 なし アプリのライセンスを SPDX 式で書きます(MIT、GPL-3.0-or-later、LicenseRef-proprietary)。
developer 文字列 なし 開発者の名前です。
homepage 文字列 なし アプリの Web ページです。
flatpakRuntime 文字列 最近のもの Flatpak のマニフェストが要求する GNOME ランタイムのバージョンで、46 以降です。

配布を参照してください。

web

Web のビルドの設定です。

キー 型 デフォルト 説明
vapidPublicKey 文字列 なし アプリのサーバーの VAPID 公開鍵(base64url)です。ブラウザーは、asuka/sdk/push の Web Push を購読するときにこれを使います。

Web Push を参照してください。

環境変数

秘密の情報は asuka.json に書かず、環境変数で渡してください。CI では CI のシークレットから渡します。これらの環境変数は、対応するキーを上書きもします。

変数 説明
ASUKA_KEYSTORE、ASUKA_KEY_ALIAS android.keystore と android.keyAlias を上書きします。
ASUKA_KEYSTORE_PASSWORD、ASUKA_KEY_PASSWORD キーストアのパスワードと、それと異なる場合の鍵のパスワードです。
ASUKA_ASC_KEY_ID、ASUKA_ASC_ISSUER_ID、ASUKA_ASC_KEY ios.appStoreConnect を上書きします。ASUKA_ASC_KEY は .p8 のパスかその中身です。
ASUKA_PLAY_SERVICE_ACCOUNT android.serviceAccount を上書きします。キーのパスか、その JSON です。
ASUKA_MAC_PROFILE mac.profile を上書きします。
ASUKA_UPDATE_PUBLIC_KEY、ASUKA_UPDATE_URL updates.publicKey と updates.url を上書きします(url を指定すると github は使われなくなります)。
ASUKA_UPDATE_PRIVATE_KEY アップデートの秘密鍵そのもの、またはそのパスで、updates.privateKey を上書きします。
ASUKA_WINDOWS_CERT、ASUKA_WINDOWS_CERT_PASSWORD、ASUKA_WINDOWS_TIMESTAMP Windows のビルドの署名証明書(.pfx)、そのパスワード、タイムスタンプサーバーです。これらは asuka.json には書けません。配布を参照してください。