Swiftパッケージとしてバイナリフレームワークを配布する – WWDC2020

Session概要

Appにサードパーティのフレームワークを追加し、XcodeでSwiftパッケージを使い、それらを最新の状態に保つ方法について。
フレームワークを参照するパッケージの作成方法、バイナリターゲットおよびパッケージのマニフェストファイルでそれらを指定する方法について。
また、正確なバイナリをクライアントが常に得られるようにチェックサムを計算する方法についてもお伝えします。 https://developer.apple.com/videos/play/wwdc2020/10147/

バイナリフレームワークのSwiftパッケージとしての配布方法

  • Xcode 12は新パッケージマニフェストAPIを持つ新しいtools-version:5.3を提供します
  • productはバイナリターゲットを参照してクライアントに通常のターゲットのように販売できます
  • バイナリターゲットはAppleプラットフォームのみ対応
  • セマンティックバージョニングに対応する必要がある
    • アプリと同様フレームワークのInfo.plistにあるバンドルバージョンを編集する
// swift-tools-version:5.3

import PackageDescription

let package = Package(
    name: "Emoji",
    products: [
        .library(name: "Emoji", targets: ["Emoji"])
    ],
    dependencies: [
    ],
    targets: [
        .binaryTarget(
            name: "Emoji",
            url: "https://example.com/Emoji/Emoji-1.0.0.xcframework.zip",
            checksum: "6d988a1a27418674b4d7c31732f6d60e60734ceb11a0ce9b54d1871918d9c194"
        )
    ]
)
  • バイナリターゲットはSwift Packageを作成する手順と同様
    • checksumの作成は swift package compute-checksumコマンドを使用してchecksumを出力
      • swift package compute-checksum Emoji-1.0.0.xcframework.zip
targets: [
  .binaryTarget(name: "Hoge", url: "https://〜", checksum: "02b384c..."
]

Xcodeでバイナリフレームワークの作り方

  • XCFrameworksについて
    • Xcode 11から導入
    • 異なるプラットフォームのためのバリアントを提供
    • Dynamic, Static libraryに対応
    • 各XCFrameworkは単一のモジュールを含む
  • Build Libraries for Distributionをbuild設定にセットします
  • xcodebuild archiveコマンドを使用して各バリアントをアーカイブします
  • xcodebuild -create-xcframeworkコマンドを使ってひとまとめにします

バイナリフレームワークを使用する際のトレードオフ

  • バイナリはデバッグがより難しくなり、独自で修正を加えることは不可能になる
  • 対応プラットフォームはバイナリ依存性の再構築ができないためフレームワーク作成者がサポートするものに限定される
最新情報をチェックしよう!