Swift Package: リソースとローカリゼーション – WWDC2020

Session概要

Swift Packageを使ってSwiftコードをシェアする際、リソースも一緒にシェアしましょう。画像やStoryboardといったアセットをPackageに含める方法、それらをコードからアクセスする方法について。
また、ローカライズされた文字列を追加することで世界中のユーザがコードにアクセスできるようにする方法にてついて https://developer.apple.com/videos/play/wwdc2020/10169/

Swift Packageにリソースを追加する方法について

  • Xcode 12では画像やStoryboardなどのリソースイア外の他のファイルもPackageに追加できるようになった
    • これらのリソースもローカライズ可能
  • Xcode 12からPackage内で持つSwiftUI Viewをプレビューできる機能が追加された
    • 実行するために同一 workspace内にアプリは不要
  • Packageで利用可能なファイルタイプは下記
    • Text FileやShell Scriptなどのファイルはその使用目的をPackageマニフェストの中で宣言する必要がある
      • Swiftファイル、アセットファイル、Storyboard等は目的が明確なので不要
    • Packageマニフェストの構文とファイルシステム構成との関係については Adopting Swift Package in Xcode を参照

Xcodeがリソースとして取り扱わないファイルの指定方法

  • excludes を設定することでPackageビルド時に無視されるように指定可能
    • ファイル、ディレクトリどちらも可能

Packageマニフェストのサンプル

// swift-tools-version:5.3
import PackageDescription

let package = Package(name: "MyGame",
    products: [
        .library(name: "GameLogic",
            targets: ["GameLogic"])
    ],
    targets: [
        .target(name: "GameLogic",
            excludes: [
                "Internal Notes.txt",
                "Artwork Creation"],
            resources: [
                .process("Logo.png"),
                .copy("Game Data")]
        )
    ]
)
  • .process を使用することで対象とするプラットフォーム用に組み込まれた正しい規則が適用される
    • 画像であれば圧縮処理など
  • .copy はファイルタイプを問わずにリソースの正確なコピーを作成したい場合に使用する

  • コマンドラインツールのような非バンドル製品をビルドする時は、そのツールに併せてリソースバンドルをインストールすることが必要になる

Minimum ツールバージョンの注意点

  • PackageリソースのサポートはSwift 5.3からなので、Packageマニフェストは5.3を必要なツールのバージョンとして宣言する必要がある

コードからPackageのリソースにアクセスする方法

  • FoundationのBundle APIを使用する
  • リソースを含むPackageをbuildする際にXcodeは該当するリソースバンドルのためにアクセサーを生成して、それをターゲット向けに作成するコードモジュールへincludeする

ベストプラクティス

  • Packageにリソースを含める場合は、それを使用するコードモジュールに対応するターゲットへ追加する必要がある
  • 他のモジュールヘリソースを提供する必要がある場合は、個々のリソースにbundleできるように特定の型付けを持つアクセサーを追加するのが最も良い方法
  • リソースバンドル全体を他のモジュールへbundleしようとするのは一般的には推奨しない
    • 理由は、リソースの名前に関連して外部との依存関係が発生するから

Package内のリソースをローカライズする方法について

  • Packageマニフェストに defaultLocalization: "en"を設定することで、指定したローカライズが見つからない場合のフォールバックローカリゼーションとして使用される
    • リソースを含む場合は必ず必要
  • ローカリゼーションディレクトリ( .lproj)を作成し、Localization.stringsを追加する
  • アセットカタログもローカライズ可能

最新情報をチェックしよう!