昨年(2024年)に CocoaPods の メンテナンスプランが発表 されました。Swift Package Manager(以降、SwiftPM) も成熟してきており、特に困ることはないのかなと思っていたのですが、先日ふと1つの疑問が湧いてきました。
CocoaPods がなくなったら Objective-C 製パッケージはどう配布すればよいのだろう?
CocoaPods は元々 Apple プラットフォームの主要開発言語が Objective-C の時に生まれたものなので、Objective-C 製のパッケージを配布することができます。その CocoaPods がなくなってしまった時、その代替手段はあるのでしょうか?
調査したところ、結論としては SwiftPM で配布可能 です。この記事ではその方法をご紹介します。
検証環境
- Xcode 16.4
- https://github.com/temoki/objc-spm
Objective-C製のパッケージを作る
Objective-C のコードで構成されたパッケージを作るのと、Swiftのパッケージを作るのと作業はほとんど変わりません。
- まずは
swift package init
してください - 次に
Sources
配下の Target ディレクトリに Objective-C のコード(*.h, *.m
等)を配置してください
ここから追加で必要な作業が1つだけあります。
-
Sources/{Target}/include
ディレクトリに外部公開用のヘッダーファイルを置いてください
これだけです。Xcodeプロジェクトでいう Bridging Header の役割ですね。
外部公開用ヘッダーファイルの配置ディレクトリは、Target のパラメータ publicHeadersPath で変更することができます。
こうしてできたパッケージは、次のようにあらゆるシーンで使用可能となります!
- 通常の Swift パッケージの依存パッケージとして使用可能 (サンプルコード)
- Objective-C 製パッケージの依存パッケージとして使用可能 (サンプルコード)
- Objective-C ベースの Xcode プロジェクトの依存パッケージとして使用可能 (サンプルコード)
ただし、1つ注意点があります。1つの Target の中で Swift と Objective-C を混在させることはできません。混在させた場合、Swift Package Manager が次のようなエラーとなります。
target at '...' contains mixed language source files; feature not supported
(おまけ) XCFramework bundle で配布するのも良さそうですね