🐥

iOSで大サイズフレームワークの取り扱い

2023/05/29に公開

third partyで100M以上のフレームワークファイルもらったことがあって、直でgit pushだとgitサーバ怒られるので、サーバに保存して使用時にダウンロードできないか調査しました。cocoapodsとspm両方できるので、それぞれどう実現するかをまとめました。

Cococapods

フレームワークurlで直指定できないので、prepare_command 使って事前にフレームワークのzipファイルをダウンロードしてunzipするようにします。

Pod::Spec.new do |s|
  # existing setting...

  # Download framework zip file from url
  framework_urls = [
    'http://example.com/frameworks/test1.framework.zip',
    'http://example.com/frameworks/test2.framework.zip'
  ]

  # Download and unzip each framework file
  s.prepare_command = <<-CMD
    mkdir -p frameworks
    #{framework_urls.map { |url| "curl -L -o frameworks/#{File.basename(url)} #{url} && unzip -o frameworks/#{File.basename(url)} -d frameworks/" }.join("\n")}
  CMD

  s.ios.vendored_frameworks = 'frameworks/test1.framework', 'frameworks/test2.framework'

  # existing setting...
end

Swift package manager

spmすでにurlからダウンロードできる設定があります。
Package.swiftのフレームワーク引用にbinaryTarget(name:url:checksum:)を使う

// swift-tools-version:5.3
import PackageDescription

let package = Package(
    name: "TestPackage",
    products: [
        .library(
            name: "TestPackage",
            targets: ["TestPackage"]),
    ],
    dependencies: [
    ],
    targets: [
        .binaryTarget(
            name: "TestFramework",
            url: "https://yourwebsite.com/frameworks/test1.xcframework.zip",
            checksum: "checksumcode"
        ),
        .target(
            name: "TestPackage",
            dependencies: ["TestFramework"]
        ),
    ]
)

https://developer.apple.com/documentation/packagedescription/target/binarytarget(name:url:checksum:)

Discussion