XcodeのPreview Assetsはリリースビルドにも含まれてしまう
最近のXcodeにはSwiftUIのPreviewProviderで利用するときなどに利用する Development Assets
という機能があります。例えばXcodeで新規アプリをSwiftUIで生成すると Preview Content/Preview Assets
というフォルダが同時に生成されます。[1]
この Preview Assets
に追加したアセットデータはRelease設定でもArchiveでは削除されるがBuildでは削除されないということをご存じでしょうか。
iOS / tvOS / watchOS向けのアプリを作るときはApp Storeに提出する必要があるためあまりArchiveしないことはないかもしれません。
ですが、macOSアプリはバンドル形式じゃないアプリやMac App Store以外で配布したい場合などでArchiveは必須ではありません。実際、私が作成しているmacOSアプリも xcodebuild build
していたのですが、不要なアセットがリリースビルドに含まれていることに気付いたためarchiveに変更しました。
Appleのサイトによるとこのフォルダは Development Assets
と呼ばれており、アーカイブビルドやインストールビルドの際には削除されるようです。
実験
macOS 14.0 + Xcode 15.0.1でビルド成果物に Development Assets
が残ったままになるのか試してみます。
新規のmacOSアプリをXcodeで作成し、 Preview Content/Preview Assets
に ExampleImage
という画像アセットを追加します。
この Preview Content
というフォルダは Build Settings
→ DEVELOPMENT_ASSET_PATHS
に設定されています。
Release configurationでビルド
xcodebuildコマンドを使ってリリースビルドを作成します。
xcodebuild -project ExamplePreviewAssets.xcodeproj -configuration Release build
特に指定していない場合 build/Release
にappが作成されます。このappには 57KBの Contents/Resource/Assets.car
が含まれます。
ls -lh build/Release/ExamplePreviewAssets.app/Contents/Resources/Assets.car
-rw-r--r--@ 1 user staff 57K 10 22 22:13 build/Release/ExamplePreviewAssets.app/Contents/Resources/Assets.car
assetutil
を使って中身を確認してみましょう。
assetutil --info build/Release/ExamplePreviewAssets.app/Contents/Resources/Assets.car
[
{
"AssetStorageVersion" : "Xcode 15.0.1 (15A507) via ibtoold",
"Authoring Tool" : "@(#)PROGRAM:CoreThemeDefinition PROJECT:CoreThemeDefinition-581\n",
"CoreUIVersion" : 865,
"DumpToolVersion" : 865.1,
"Key Format" : [
"kCRThemeAppearanceName",
"kCRThemeLocalizationName",
"kCRThemeElementName",
"kCRThemePartName",
"kCRThemeSizeName",
"kCRThemeIdentifierName",
"kCRThemeLayerName",
"kCRThemeScaleName"
],
"MainVersion" : "@(#)PROGRAM:CoreUI PROJECT:CoreUI-865.1\n",
"Platform" : "macosx",
"PlatformVersion" : "14.0",
"SchemaVersion" : 5,
"StorageVersion" : 17,
"Timestamp" : 1697980387
},
{
"AssetType" : "Image",
"BitsPerComponent" : 8,
"ColorModel" : "RGB",
"Colorspace" : "srgb",
"Compression" : "deepmap2",
"Encoding" : "ARGB",
"Name" : "ExampleImage",
"NameIdentifier" : 40019,
"Opaque" : true,
"PixelHeight" : 448,
"PixelWidth" : 448,
"RenditionName" : "Icon.png",
"Scale" : 1,
"SHA1Digest" : "79292421E3F28DC97966512A3578549DEB6908BB9F33342022F70680AF9B8D3D",
"SizeOnDisk" : 45089,
"Template Mode" : "automatic"
}
]
リリースビルドにもPreview Assetsに追加した画像が含まれていることが確認できました。
Release configurationでアーカイブ
続いて xcodebuild archive
コマンドでxcarchiveを作成してみます。もちろんXcodeのProjectメニューからArchiveをしても構いません。
xcodebuild -project ExamplePreviewAssets.xcodeproj -scheme ExamplePreviewAssets -configuration Release archive -archivePath ExamplePreviewAssets.xcarchive
xcarchiveにはPreview Assetsは含まれていません。
ls -lh ExamplePreviewAssets.xcarchive/Products/Applications/ExamplePreviewAssets.app/Contents/Resources
total 0
(Assets.car
が含まれていない)
まとめ
SwiftUIモードでiOS / macOSアプリを作成すると Preview Contents/Preview Asset
というフォルダが作成されますが、このフォルダは Development Assets
と呼ばれるもので、アーカイブ時にはAppバンドルには含まれないように処理されますが単なるリリースビルド時には除外されず含まれてしまうようです。
アーカイブせずにバイナリ配布したいことは少ないかもしれませんが、Xcodeのわかりづらい仕様なのでうっかり配布してはいけないアセットを含んだまま配布してしまわないように注意しましょう。
参考リンク
-
Xcode 15.0.1ではSwiftUI方式を選んで新規Appを作成するとmacOS / iOSともに
Preview Content
が生成されるようです。Storyboard方式では生成されません。 ↩︎
Discussion