基本的なお絵かきツール
Loading the full README. The saved excerpt is shown below.
Swift で書いた macOS 用のペイントツールです。 • 必要なもの: macOS 14 以降、Xcode 16 以降(Swift 5.10+) • テスト: swift test • 性能計測: NANOPIC_PERF=1 swift test -c release -Xswiftc -enable-testing --filter PerfTestsRead the full README ↗
Swift で書いた macOS 用のペイントツールです。
./scripts/build-app.sh # リリースビルドして build/Nanopic.app を生成
open build/Nanopic.app
./scripts/release.sh # Developer ID で署名・公証して dist/Nanopic-<版>.zip を作る(配布用)
./scripts/build-appstore.sh # エージェント連携(MCP)を外して build/appstore/Nanopic.app を生成
NANOPIC_APPSTORE=1 swift test --scratch-path .build-appstore # App Store 用の構成でテスト
App Store 用のビルドには、エージェント連携(MCP サーバー、設定とメニューの項目、エージェント向けのツール)を入れません。実行時に隠すのではなく、コンパイルの段階で外します。
Package.swift が環境変数 NANOPIC_APPSTORE=1 を見て、アプリを NanopicAgent に依存させず、Sources/Nanopic/Agent/(MCP サーバー・設定画面・アプリ側のツール)をビルドから外し、APPSTORE を定義します。残りの呼び出し側は #if !APPSTORE で分けています.build-appstore/ に分けますbuild-appstore.sh は、できたアプリを scripts/check-appstore-app.sh で検査します。バイナリに MCP の文字列・シンボルと待ち受け(NWListener、Network.framework)が残っていないことを strings/nm/otool で確かめ、残っていれば失敗しますSANDBOX=1 ./scripts/build-appstore.sh とすると、App Sandbox の entitlement(scripts/appstore.entitlements)を付けて ad-hoc 署名します。Sandbox の中での動作(サイドカーの読み書きなど)を手元で確かめるためのもので、配布用の署名ではありませんResources/Agent.xcstrings に分けてあり、App Store 用のアプリには表ごと入れません)CFBundleLocalizations と ja.lproj・en.lproj、Info.plist の LSApplicationCategoryType・ITSAppUsesNonExemptEncryption、プライバシーマニフェスト Resources/PrivacyInfo.xcprivacy、1024px まで入ったアイコン、ユニバーサルバイナリ、通信や例外のない entitlement)も確かめますrelease.sh)のビルドは今までどおりエージェント連携を含みますNanopicKit には、どちらの構成でも NanopicAgent を入れません./scripts/package-appstore.sh # クラウド署名で dist/appstore/Nanopic-<版>.pkg を作る(既定)
./scripts/package-appstore.sh --dry-run # 署名なしで流れだけ確かめる(ad-hoc 署名、署名なしの .pkg。提出はできない)
コマンド 1 行で、提出できる .pkg ができます。手元のキーチェーンに配布用の証明書は要りません。
build-appstore.sh でアプリを作り、Sandbox の entitlement を付けて ad-hoc 署名する.xcarchive の形に包む(build/appstore/Nanopic.xcarchive。Products/Applications/Nanopic.app と Info.plist、あれば dSYMs/。版・ビルド番号はアプリの Info.plist から読む)xcodebuild -exportArchive -allowProvisioningUpdates に渡す。Xcode が Apple のサーバーにある証明書(Cloud Managed Apple Distribution)でアプリを署名し、プロファイル(Mac Team Store Provisioning Profile: com.hashrock.nanopic)を作って埋め込み、entitlement に App ID とチーム ID を足し、.pkg にして Installer の証明書(3rd Party Mac Developer Installer)で署名する.pkg からアプリを取り出し、check-appstore-app.sh でもう一度検査する(MCP が入っていないこと、Info.plist の項目、表示言語、アイコン、署名の entitlement が Sandbox + App ID + チーム ID だけであること、プロファイルの App ID)5WLLZHK49R)の Apple ID でサインインしていること。クラウド署名を使えるのは Account Holder / Admin か、「Access to Cloud Managed Distribution Certificate」を持つ人です。App ID com.hashrock.nanopic が Apple Developer に登録されていること(Mac の直接配布版・Mac App Store 版・iPad 版で同じ ID)ExportOptions の destination は export)。できた .pkg は Transporter か xcrun altool で別に送りますbuild/appstore/export.log、どの証明書・プロファイルで署名されたかは build/appstore/export/DistributionSummary.plist に残ります.app をスクリプトで包んで署名・.pkg 化しています(Xcode プロジェクトにはしていません)。直接配布版と同じ手順でアプリを組めて、違いが entitlement と署名だけになるためですscripts/appstore.entitlements)は app-sandbox、files.user-selected.read-write(選んだ書類の読み書き)、files.bookmarks.app-scope(「書き出す」の書き出し先を覚える)の 3 つ。通信(network.*)はありませんwebsite/ の privacy.html・support.html)dev.hashrock.nanopic でした。直接配布版は、初回の起動で古い ID の設定(ブラシ・ショートカット・パレットなど)を引き継ぎます。ブラシ先端の画像(~/Library/Application Support/Nanopic/tips)は場所が変わらないのでそのまま使えますPROFILE=<.provisionprofile> ./scripts/package-appstore.sh --local
クラウド署名を使えないとき(権限がない、Apple と通信せずに作りたい)の道です。プロファイルを埋め込み、Apple Distribution で署名し、productbuild で .pkg にして Mac Installer Distribution で署名します。Apple とは通信しません。できた .pkg の検査はクラウド署名のときと同じです。
要るもの(どれも Apple Developer の Certificates, Identifiers & Profiles で作る):
com.hashrock.nanopic3rd Party Mac Developer Installer: ... と出る)。キーチェーンアクセスで証明書署名要求(CSR)を作り、それぞれ発行してダウンロードし、開いてキーチェーンに入れるPROFILE で渡す証明書の名前が違うときは APP_IDENTITY・PKG_IDENTITY で渡します。
cd iPad && xcodegen # project.yml から NanopicPad.xcodeproj を作り直す(brew install xcodegen)
open NanopicPad.xcodeproj # スキーム NanopicPad を iPad/シミュレーターで実行
This is the beginning of the README. Read the rest at the original. Read the full README ↗