MAVSDK-XCFramework

Swift Package distribution of the pre-compiled mavsdk_server.xcframework found in MAVSDK Releases

Installation

Swift Package Manager

Limitations

  • Requires Xcode 12.0+ to use Swift 5.3.
  • mavsdk_server.xcframework is currently only supported on iOS and MacOS.

Package.swift Manifest

// swift-tools-version:5.3

import PackageDescription

let package = Package(
  name: "MavsdkTestProject",
  dependencies: [
    .package(url: "https://github.com/mavlink/MAVSDK-XCFramework", .exact("0.37.0"))
  ],
  targets: [
    .target(name: "MavsdkServer",
      dependencies: [
        .product(name: "mavsdk_server",
                 package: "MAVSDK-XCFramework",
                 condition: .when(platforms: [.iOS, .macOS]))
      ]
    )
  ]
)

Contributing

Directions to generate the mavsdk_server.xcframework can be found here

Environment Setup

  1. Install Xcode

  2. Install cmake with HomeBrew

$ brew install cmake
  1. Setup Python environment and dependencies (the first two commands are optional but recommended.)
$ python3 -m venv venv
$ source venv/bin/activate

$ pip3 install protoc-gen-mavsdk

Building mavsdk_server.xcframework

  1. Clone MAVSDK core repository:

SSH:

$ git clone git@github.com:mavlink/MAVSDK.git
$ cd MAVSDK

HTTPS:

$ git clone https://github.com/mavlink/MAVSDK.git
$ cd MAVSDK
  1. Checkout the latest release (such as v0.37.0) and initialize submodules
$ git switch -c tags/v0.37.0
$ git submodule update --init --recursive
  1. Build mavsdk_server.framework per platform (based on the MAVSDK GitHub CI/CD workflows)

macOS

$ cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MAVSDK_SERVER=ON -Bbuild/default -H.
$ cmake --build build/default

iOS

$ export SDKROOT=$(xcrun --sdk iphoneos --show-sdk-path)

$ cmake -DENABLE_STRICT_TRY_COMPILE=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=$(pwd)/tools/ios.toolchain.cmake -DPLATFORM=OS -DDEPLOYMENT_TARGET=11.0 -DBUILD_MAVSDK_SERVER=ON -DBUILD_SHARED_LIBS=OFF -DWERROR=OFF -j 2 -Bbuild/ios -H.

$ cmake --build build/ios -j 2

iOS simulator

$ export SDKROOT=$(xcrun --sdk iphonesimulator --show-sdk-path)

$ cmake -DENABLE_STRICT_TRY_COMPILE=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=$(pwd)/tools/ios.toolchain.cmake -DPLATFORM=SIMULATOR64 -DDEPLOYMENT_TARGET=11.0 -DBUILD_MAVSDK_SERVER=ON -DBUILD_SHARED_LIBS=OFF -DWERROR=OFF -Bbuild/ios_simulator -H.

$ cmake --build build/ios_simulator -j 2
  1. Package each mavsdk_server.framework binary into a single multi-platform mavsdk_server.xcframework
$ bash src/mavsdk_server/tools/package_mavsdk_server_framework.bash
  1. The mavsdk_server.xcframework output can now be found in the /build directory.

Extending MAVSDK

Watch this video on how to extend features in MAVSDK.

Testing MAVSDK-XCFramework

Use these steps to test updates mavsdk_server.xcframework when using a local MAVSDK-XCFramework Swift Package.

  1. Create directory path MAVSDK-XCFramework/Sources/MAVSDK-XCFramework, then open mavsdk_server.xcframework in Finder and then drag-and-drop it into the new directory under MAVSDK-XCFramework/Sources/MAVSDK-XCFramework.

  2. Adjust the Package.swift manifest file in MAVSDK-XCFramework to reference the new local mavsdk_server.xcframework.

// swift-tools-version:5.3

import PackageDescription

let package = Package(
  name: "MAVSDK-XCFramework",
  products: [
    .library(
      name: "mavsdk_server",
      targets: ["mavsdk_server"]),
  ],
  targets: [
    .binaryTarget(name: "mavsdk_server,
                  path: "Sources/MAVSDK-XCFramework")
  ]
)
  1. Source the new MAVSDK-XCFramework Package into your existing project. If not already using a local Swift Package, open the MAVSDK-XCFramework directory in Finder and then drag-and-drop it into your existing Xcode Project. You can now use the local MAVSDK-XCFramework Swift Package in two different ways:

Local Swift Package

// swift-tools-version:5.3

import PackageDescription

let package = Package(
  name: "MavsdkExample",
  products: [
    .library(name: "MavsdkServerExample",
             targets: [
               "MavsdkServerExample"
             ]
    )
  ],
  dependencies: [
    .package(url: "../path/to/MAVSDK-XCFramework", .branch("main"))
  ],
  targets: [
    .target(name: "MavsdkServerExample",
            dependencies: [
              .product(name: "mavsdk_server",
                       package: "MAVSDK-XCFramework",
                       condition: .when(platforms: [.iOS, .macOS]))
            ]
    )
  ]
)

Local .xcodeproj

Within Xcode, select the .xcodeproj at the top of the Project navigator, select your Target, and add the library in Frameworks, Libraries, and Embedded Content

Publishing MAVSDK-XCFramework

  1. Compute a checksum to verify remote package contents.
$ swift package compute-checksum mavsdk_server.xcframework.zip
6d988a1a27418674b4d7c31732f6d60e60734ceb11a0ceb11a0ce9b54d1871918d9c194
  1. Host the downloadable mavsdk_framework.xcframework.zip at a specific URL (such as an Amazon S3 Storage Bucket.)

  2. Update Package.swift manifest to reference the new binary.

// swift-tools-version:5.3

import PackageDescription

let package = Package(
  name: "MAVSDK-XCFramework",
  products: [
    .library(
        name: "mavsdk_server",
        targets: ["mavsdk_server"]),
  ],
  targets: [
    .binaryTarget(name: "mavsdk_server",
                  url: "https://myurl.com/path/to/mavsdk_server.xcframework.zip",
                  checksum: "6d988a1a27418674b4d7c31732f6d60e60734ceb11a0ceb11a0ce9b54d1871918d9c194")
    ]
)
  1. Commit the new Package.swift to a GitHub repositiory.

  2. Use the new MAVSDK-XCFramework binary package (details above) in your project.