🗺️

Mapbox系マップSDK for iOSの系譜

2024/08/12に公開

現在のMapbox SDK for iOSのリポジトリはこれなのだが、

https://github.com/mapbox/mapbox-maps-ios

コアな部分のソースは隠蔽されている [1]

ただ古いMapbox SDKのリポジトリもアーカイブされつつも公開されており、その頃のバージョンのソースコードは見れたりする。また MapLibre NativeのSDKはもともとオープンソースだったMapbox SDKが非オープンソース化するにあたって分家したものであり、こちらはソースが公開されてたりする。

・・・といろいろあるのでいったん整理することにした。

概要

ざっくりこんな感じ:

旧Mapbox Maps SDKs for iOS

mapbox/mapbox-gl-native

https://github.com/mapbox/mapbox-gl-native

2023年8月にアーカイブ済み:

This repository has been archived by the owner on Aug 9, 2023. It is now read-only.

トップのREADMEにはこう書かれている:

A C++ library that powers customizable vector maps in native applications on multiple platforms by taking stylesheets that conform to the Mapbox Style Specification, applying them to vector tiles that conform to the Mapbox Vector Tile Specification, and rendering them using OpenGL or Metal.
(Mapbox Style Specificationに準拠したスタイルシートを取得し、Mapbox Vector Tile Specificationに準拠したベクタータイルに適用し、OpenGLまたはMetalを使用してレンダリングすることで、複数のプラットフォームのネイティブアプリケーションでカスタマイズ可能なベクターマップを強化するC++ライブラリです。)

To embed interactive maps into a native application using a platform-specific language, install the Mapbox Maps SDK:
(プラットフォーム固有の言語を使用してネイティブアプリケーションにインタラクティブマップを組み込むには、Mapbox Maps SDK をインストールしてください:)

src フォルダ配下にC++のソースコードがたくさん置かれている。また platform/ios 配下にcmakeファイルとREADMEが置かれている。

こちらのREADMEにはこう書かれている:

This folder contains build configuration files for the iOS distribution of Mapbox GL Native, which ultimately targets Cocoa Touch applications written in Objective-C, Swift, or Interface Builder via the Mapbox Maps SDK for iOS. The SDK was previously developed here in this repository but is now developed in the separate mapbox-gl-native-ios repository (details).
(このフォルダには、最終的に Mapbox Maps SDK for iOS を介して Objective-C、Swift、または Interface Builder で書かれた Cocoa Touch アプリケーションをターゲットとする Mapbox GL Native の iOS ディストリビューション用のビルド設定ファイルが含まれています。この SDK は以前はこのリポジトリで開発されていましたが、現在は 別の mapbox-gl-native-ios リポジトリ で開発されています(詳細)。

旧Mapbox Maps SDKのコアライブラリがこれで、ここでビルドしたものが(おそらく)iOS向けとしては MBGLCore.framework となり、mapbox/mapbox-gl-native-ios から使われる。

なお、トップのREADMEにはMetal云々書かれているが、Metal対応はされてなさそうだった。(後述する後継SDKはどちらも対応している)

mapbox/mapbox-gl-native-ios

https://github.com/mapbox/mapbox-gl-native-ios

2023年6月にアーカイブ済み:

This repository has been archived by the owner on Jun 21, 2023. It is now read-only.

READMEにはこう書かれている:

The latest version of Mapbox Maps SDK is now available at mapbox/mapbox-maps-ios. This version offers superior performance, features, and developer experience, and is the recommended mobile SDK solution for all Mapbox customers.
(Mapbox Maps SDKの最新バージョンがmapbox/mapbox-maps-iosでご利用いただけるようになりました。このバージョンは優れたパフォーマンス、機能、開発者体験を提供し、すべてのMapboxのお客様に推奨されるモバイルSDKソリューションです。)

  • 本リポジトリのプロジェクトは MBGLCore.framework というフレームワークに依存している。https://github.com/mapbox/mapbox-gl-native のソースコードからビルドできるものと思われる。
  • platform/ios/src 配下にObjC, ObjC++コード、Xcodeプロジェクトファイルあり。
  • デモアプリのソースコードもある(欠けているファイルが多く、試せてはいない)

Mapbox Maps SDK for iOS

Mapboxの現行SDK。

https://github.com/mapbox/mapbox-maps-ios

About:

Interactive, thoroughly customizable maps for iOS powered by vector tiles and Metal

トップのREADMEより:

The Mapbox Maps SDK for iOS is a public library for displaying interactive, thoroughly customizable maps in native iOS. It takes map styles that conform to the Mapbox Style Specification, applies them to vector tiles that conform to the Mapbox Vector Tile Specification, and renders them using Metal.
(Mapbox Maps SDK for iOSは、iOSネイティブでインタラクティブかつ徹底的にカスタマイズ可能な地図を表示するためのパブリックライブラリです。Mapbox Style Specificationに準拠したマップスタイルを取得し、Mapbox Vector Tile Specificationに準拠したベクタータイルに適用し、Metalを使用してレンダリングします。)

Souces フォルダ等あるが、MapboxCoreMaps 等のモジュールに依存している。

Package.swift を読み解くと、それらは mapbox-core-maps-ios リポジトリや mapbox-common-ios リポジトリにあり、コードは公開されていない。

つまり現行のMapbox SDKはCustomizableを特徴としつつも、OSSではない。

MapLibre Native SDK for iOS

maplibre-native

https://github.com/maplibre/maplibre-native

mapbox-gl-native, mapbox-gl-native-ios がOSSでなくなるタイミングでforkされた [2] リポジトリ。

  • src/mbgl 配下にソースが入っている。全てC++コード
    • Metal, Vulkanの実装もここに入っている
  • shaders 配下に大量のGLSLファイル
  • design-proposals/2022-11-29-metal-port.md に "MapLibre Metal Port Design Proposal"
  • verndor/metal-cpp に、iOS SDKのクラス名等を冠した大量の .hpp ファイル(C++からMetal関連フレームワークのAPIを叩けるようにしたラッパー群?)
  • platform/ios フォルダ
    • src 配下にObjC, ObjC++ファイル
    • app, app-swift 配下にサンプルアプリの実装(ObjC, Swift)
    • bazel フォルダや BUILD.bazel ファイルがあり、Xcodeプロジェクトファイルはない

Package.swiftはない。

platform/ios フォルダ配下にある README.md には

See the Getting Started Guide

と書かれており、見に行くと https://github.com/maplibre/maplibre-gl-native-distribution からSwift パッケージを追加しろとある。

このリポジトリではビルドだけ行って、パッケージ利用側にはビルド済みバイナリを使用する方式のようだ。(バイナリリリース手順を示す RELEASE.md がある)

maplibre/maplibre-gl-native-distribution

https://github.com/maplibre/maplibre-gl-native-distribution

Package.swift をみると、こうなっていた:

// swift-tools-version:5.3
import PackageDescription

let package = Package(
    name: "MapLibre Native",
    ...,    
    targets: [
        .binaryTarget(
            name: "MapLibre",
            url: "https://github.com/maplibre/maplibre-native/releases/download/ios-v6.5.4/MapLibre.dynamic.xcframework.zip",
            checksum: ...)
    ]
)

maplibre-native の Releases にある xcframework.zip を取りにいくようになっている。

まとめ

  • 現行の Mapbox Maps SDK for iOS はカスタマイズ性が高く色々便利ではあるのだが、OSSではない。
  • Mapbox Maps SDKの旧リポジトリもまだ公開されており、そこには(旧バージョンではあるが)ソースコードがまだある
  • MapLibre Native SDK for iOS (現在もメンテされている)も 旧 Mapbox Maps SDK からforkされたものであり、OSSとして運用されているためソースコードも公開されている
脚注
  1. このへんもいろんなリポジトリが関係してるので、余裕があったら追記します。 ↩︎

  2. 同リポジトリにある FORK.md というドキュメントに詳細が書かれている。 ↩︎

Discussion