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