Combain Indoor AI Navigation Plugin

A Flutter plugin wrapping the Combain Indoor AI Navigation SDK. Provides indoor positioning, SLAM, routing, and floor map support for Android and iOS.

Installation

Add the dependency to your pubspec.yaml:

dependencies:
  flutter_combainsdk: ^0.10.0

Add the Combain Maven repository to android/build.gradle.kts:

repositories {
    maven(url = "https://gitlab.com/api/v4/projects/3194773/packages/maven")
    google()
    mavenCentral()
}

Permissions

Android

Your MainActivity must extend FlutterFragmentActivity:

import io.flutter.embedding.android.FlutterFragmentActivity

class MainActivity : FlutterFragmentActivity()

Add to android/app/src/main/AndroidManifest.xml:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />

iOS

Add to Info.plist:

<key>NSMotionUsageDescription</key>
<string>Used to improve location accuracy.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Required for indoor positioning.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Required for background indoor positioning.</string>

Add to Podfile:

config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
  '$(inherited)',
  'PERMISSION_LOCATION_WHENINUSE=1',
  'PERMISSION_SENSORS=1',
]

See flutter-permission-handler setup for details.

iOS — ONNX Runtime App Store Fix

If you get this App Store Connect validation error:

Invalid Bundle. The bundle Runner.app/Frameworks/onnxruntime.framework does not
support the minimum OS Version specified in the Info.plist.

Create scripts/fix-onnxruntime.sh in your Flutter project root:

#!/bin/bash
set -e
FRAMEWORK_PATH="${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/onnxruntime.framework"
[ -d "$FRAMEWORK_PATH" ] || exit 0
INFO_PLIST="$FRAMEWORK_PATH/Info.plist"
[ -f "$INFO_PLIST" ] || exit 0
/usr/libexec/PlistBuddy -c "Set :MinimumOSVersion 15.6" "$INFO_PLIST" 2>/dev/null || \
/usr/libexec/PlistBuddy -c "Add :MinimumOSVersion string 15.6" "$INFO_PLIST"

Make it executable (chmod +x) and add a Run Script build phase in Xcode after "CP Embed Pods Frameworks":

"${SRCROOT}/../scripts/fix-onnxruntime.sh"

Adjust 15.6 to match your app's IPHONEOS_DEPLOYMENT_TARGET.

Quick Start

import 'package:flutter_combainsdk/flutter_combain_sdk_sdk.dart';

// Create SDK instance
final combainSDK = await FlutterCombainSDK.create();

// Configure
final config = CombainSDKConfig(
  apiKey: 'your-api-key',
  settingsKey: 'your-api-key',
  locationProvider: FlutterLocationProvider.slam, // or .aiNavigation
  appInfo: FlutterAppInfo(
    packageName: packageInfo.packageName,
    versionName: packageInfo.version,
    versionCode: int.tryParse(packageInfo.buildNumber) ?? 0,
  ),
  syncingInterval: FlutterSyncingInterval(
    type: FlutterSyncingIntervalType.interval,
    intervalMilliseconds: 60 * 60 * 1000,
  ),
  wifiEnabled: true,
  bluetoothEnabled: true,
  beaconUUIDs: ['E2C56DB5-DFFB-48D2-B060-D0F5A71096E0'],
);

await combainSDK.initializeSDK(config);
await combainSDK.start();

For onboarding/permission flow, see example/lib/screens/setup/permissions_setup.dart.

Device Tracking

The SDK automatically identifies each device using a platform-native identifier:

  • Android: Settings.Secure.ANDROID_ID
  • iOS: UIDevice.identifierForVendor

To override with your own identifier:

CombainSDKConfig(
  apiKey: 'your-api-key',
  settingsKey: 'your-api-key',
  deviceIdentifier: 'my-custom-device-id',
  // ...
)

Development (plugin contributors)

Regenerating Pigeon code

After modifying pigeons/navigation_messenger.dart:

make pigeon

This regenerates lib/messages.g.dart, android/.../Messages.g.kt, and ios/.../messages.g.swift. Never edit these files manually.

Release

./scripts/release.sh

Demo Projects