📦

XcodeのPreview Assetsはリリースビルドにも含まれてしまう

2023/10/22に公開

最近の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 AssetsExampleImage という画像アセットを追加します。

Xcodeでプロジェクト設定からPreview Assetsに画像を追加する

この Preview Content というフォルダは Build SettingsDEVELOPMENT_ASSET_PATHS に設定されています。

ビルド設定のDEVELOPMENT_ASSET_PATHSにはPreview Contentが設定されている

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のわかりづらい仕様なのでうっかり配布してはいけないアセットを含んだまま配布してしまわないように注意しましょう。

参考リンク

https://developer.apple.com/documentation/xcode/build-settings-reference#Development-Assets

脚注
  1. Xcode 15.0.1ではSwiftUI方式を選んで新規Appを作成するとmacOS / iOSともに Preview Content が生成されるようです。Storyboard方式では生成されません。 ↩︎

Discussion