Troubleshooting FAQs
Solutions to common UXCam Flutter SDK integration issues
Troubleshooting FAQs
Quick solutions to the most common UXCam Flutter SDK integration issues, organized by category for easy reference.
Installation Issues
Q: "Package flutter_uxcam does not exist"
Symptoms:
Because myapp depends on flutter_uxcam which doesn't exist, version solving failed.Solutions:
-
Verify package name - Ensure you're using the correct package name:
dependencies: flutter_uxcam: ^2.6.1 # Correct package name -
Check pub.dev availability:
flutter pub deps --no-precompile flutter pub cache repair -
Update Flutter and try again:
flutter upgrade flutter pub get
Q: Build fails after adding UXCam dependency
Android Build Errors:
Error: Duplicate class found
Execution failed for task ':app:checkDebugDuplicateClasses'.
Solution: Update your android/build.gradle:
android {
compileSdkVersion 34
defaultConfig {
minSdkVersion 21 // UXCam requires API 21+
targetSdkVersion 34
}
}
dependencies {
classpath 'com.android.tools.build:gradle:8.0.0' // Use latest
}iOS Build Errors:
Error: library not found for -lflutter_uxcam
Solution: Clean and rebuild iOS:
cd ios
rm -rf Pods/ Podfile.lock
cd ..
flutter clean
flutter pub get
cd ios
pod install --repo-updateRecording Issues
Q: Sessions not appearing in UXCam dashboard
Symptoms:
- App runs normally
- No sessions visible after 5+ minutes
- "Waiting for data" message persists
Diagnostic Steps:
-
Verify app key:
// Double-check your app key FlutterUxConfig config = FlutterUxConfig( userAppKey: "YOUR_ACTUAL_APP_KEY", // Verify this is correct ); -
Check recording status:
final isRecording = await FlutterUxcam.isRecording(); print('UXCam recording status: $isRecording'); -
Enable debug logging and check console output:
// Look for UXCam logs in your debug console FlutterUxcam.startWithConfiguration(config); -
Test network connectivity:
import 'dart:io'; try { final result = await InternetAddress.lookup('uxcam.com'); print('Network: OK'); } catch (e) { print('Network: Failed - $e'); }
Common Solutions:
- Wrong app key: Verify the key matches your UXCam project
- Network blocking: Check firewall/proxy settings
- App lifecycle: Ensure app goes to background (don't force-close)
- Development vs Production: Use correct app key for environment
Q: Recording stops working after hot reload
Symptoms:
- UXCam works initially
- Stops recording after hot reload
- Configuration changes don't take effect
Solutions:
-
Restart app after configuration changes:
// Any UXCam config changes require full app restart FlutterUxConfig config = FlutterUxConfig( userAppKey: "YOUR_APP_KEY", enableAutomaticScreenNameTagging: false, // Changed ); -
Prevent duplicate initialization:
class UXCamManager { static bool _initialized = false; static Future<void> initialize() async { if (_initialized) return; FlutterUxConfig config = FlutterUxConfig( userAppKey: "YOUR_APP_KEY", ); await FlutterUxcam.startWithConfiguration(config); _initialized = true; } }
Screen Tagging Issues
Q: Screen names not appearing in dashboard
Symptoms:
- Sessions recorded successfully
- All screens show as "Unknown" or generic names
- No screen analytics available
Solutions:
-
Enable automatic screen tagging:
FlutterUxConfig config = FlutterUxConfig( userAppKey: "YOUR_APP_KEY", enableAutomaticScreenNameTagging: true, // Ensure this is true ); -
Manual screen tagging for complex navigation:
class MyScreen extends StatefulWidget { @override _MyScreenState createState() => _MyScreenState(); } class _MyScreenState extends State<MyScreen> { @override void initState() { super.initState(); // Tag screen manually FlutterUxcam.tagScreenName('My Screen'); } } -
Route-based tagging:
MaterialApp( onGenerateRoute: (settings) { // Tag based on route name final screenName = settings.name ?? 'Unknown'; FlutterUxcam.tagScreenName(screenName); // Return your page widget return MaterialPageRoute(builder: (_) => MyPage()); }, )
Q: Screen names are generic (like "MaterialPageRoute")
Solution: Use explicit screen tagging:
class ScreenTaggingNavigatorObserver extends NavigatorObserver {
@override
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
super.didPush(route, previousRoute);
String screenName = 'Unknown';
if (route.settings.name != null) {
screenName = route.settings.name!;
} else if (route is PageRoute) {
// Extract screen name from route type or arguments
screenName = route.runtimeType.toString();
}
FlutterUxcam.tagScreenName(screenName);
}
}
// Add to MaterialApp
MaterialApp(
navigatorObservers: [ScreenTaggingNavigatorObserver()],
// ... rest of your app
)Performance Issues
Q: App startup is slow after adding UXCam
Symptoms:
- Noticeable delay in app startup
- ANR (Android) or watchdog timeout (iOS)
- Users complain about app slowness
Solutions:
-
Async initialization:
class _MyAppState extends State<MyApp> { @override void initState() { super.initState(); // Initialize UXCam after first frame WidgetsBinding.instance.addPostFrameCallback((_) { _initializeUXCam(); }); } Future<void> _initializeUXCam() async { FlutterUxConfig config = FlutterUxConfig( userAppKey: "YOUR_APP_KEY", ); await FlutterUxcam.startWithConfiguration(config); } } -
Reduce capture quality for low-end devices:
FlutterUxConfig config = FlutterUxConfig( userAppKey: "YOUR_APP_KEY", enableImprovedScreenCapture: false, // Disable for performance ); -
Conditional initialization based on device capability:
Future<void> initializeBasedOnDevice() async { final deviceInfo = await DeviceInfoPlugin().androidInfo; final isLowEndDevice = deviceInfo.version.sdkInt < 26; FlutterUxConfig config = FlutterUxConfig( userAppKey: "YOUR_APP_KEY", enableAutomaticScreenNameTagging: !isLowEndDevice, enableImprovedScreenCapture: !isLowEndDevice, ); await FlutterUxcam.startWithConfiguration(config); }
Q: High memory usage or crashes
Symptoms:
- App crashes with out-of-memory errors
- Memory usage grows continuously
- Performance degradation over time
Solutions:
-
Implement session rotation:
class SessionRotationManager { static Timer? _rotationTimer; static const Duration ROTATION_INTERVAL = Duration(minutes: 30); static void startRotation(String appKey) { _rotationTimer = Timer.periodic(ROTATION_INTERVAL, (timer) async { await FlutterUxcam.stopSessionAndUploadData(); // Wait before starting new session await Future.delayed(Duration(seconds: 2)); FlutterUxConfig config = FlutterUxConfig(userAppKey: appKey); await FlutterUxcam.startWithConfiguration(config); }); } static void stopRotation() { _rotationTimer?.cancel(); } } -
Monitor memory usage:
class MemoryMonitor { static Timer? _monitorTimer; static void startMonitoring() { _monitorTimer = Timer.periodic(Duration(minutes: 5), (timer) { // Check memory usage and rotate session if needed _checkMemoryAndRotate(); }); } static void _checkMemoryAndRotate() async { // Platform-specific memory check implementation // Rotate session if memory usage is high } }
Platform-Specific Issues
Android Issues
Q: ProGuard/R8 obfuscation breaks UXCam
Solution: Add ProGuard rules in android/app/proguard-rules.pro:
-keep class com.uxcam.** { *; }
-dontwarn com.uxcam.**
-keepattributes Signature
-keepattributes *Annotation*Q: Network security config blocks UXCam
Solution: Update android/app/src/main/res/xml/network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">uxcam.com</domain>
<trust-anchors>
<certificates src="system"/>
</trust-anchors>
</domain-config>
</network-security-config>iOS Issues
Q: App Store submission fails
Symptoms:
- Build archives successfully
- Upload to App Store Connect fails
- Bitcode or framework issues
Solutions:
-
Update iOS deployment target in
ios/Podfile:platform :ios, '12.0' # UXCam requires iOS 12.0+ -
Clean and rebuild:
cd ios rm -rf build/ Pods/ Podfile.lock cd .. flutter clean flutter pub get cd ios pod install -
Check framework embedding in Xcode:
- Open
ios/Runner.xcworkspace - Check that UXCam framework is properly embedded
- Verify signing configuration
- Open
Q: App crashes on iOS 17+
Solution: Ensure you're using the latest UXCam SDK version:
dependencies:
flutter_uxcam: ^2.6.1 # Use latest versionConfiguration Issues
Q: Custom events not appearing
Symptoms:
- Events logged in code
- No events visible in UXCam dashboard
- Event tracking seems broken
Diagnostic Code:
// Test event logging
void testEventLogging() {
final testEvent = 'test_event_${DateTime.now().millisecondsSinceEpoch}';
final properties = {
'test_property': 'test_value',
'timestamp': DateTime.now().toIso8601String(),
};
FlutterUxcam.logEvent(testEvent, properties);
print('Test event logged: $testEvent');
}Solutions:
-
Check event name format:
// Valid event names FlutterUxcam.logEvent('user_signup', properties); ✅ FlutterUxcam.logEvent('User Signup', properties); ✅ // Avoid special characters FlutterUxcam.logEvent('user@signup!', properties); ❌ -
Verify properties format:
// Valid properties final properties = { 'string_prop': 'value', 'number_prop': 42, 'boolean_prop': true, }; // Avoid complex objects final invalidProperties = { 'object_prop': MyComplexObject(), // ❌ }; -
Ensure recording is active:
final isRecording = await FlutterUxcam.isRecording(); if (isRecording) { FlutterUxcam.logEvent('my_event', properties); } else { print('Warning: UXCam not recording, event will be lost'); }
Q: User properties not updating
Solution: Verify user identity is set first:
// Set user identity before properties
FlutterUxcam.setUserIdentity('user123');
// Then set properties
FlutterUxcam.setUserProperties({
'subscription_tier': 'premium',
'app_version': '1.2.3',
});Debug and Testing
Q: How to verify UXCam is working correctly?
Complete Integration Test:
class UXCamIntegrationTest {
static Future<void> runTest() async {
print('=== UXCam Integration Test ===');
// 1. Check initialization
final isRecording = await FlutterUxcam.isRecording();
print('Recording Status: $isRecording');
// 2. Test screen tagging
FlutterUxcam.tagScreenName('Test Screen');
print('Screen tagged: Test Screen');
// 3. Test event logging
FlutterUxcam.logEvent('test_event', {
'test_property': 'test_value',
'timestamp': DateTime.now().toIso8601String(),
});
print('Test event logged');
// 4. Test user properties
FlutterUxcam.setUserIdentity('test_user');
FlutterUxcam.setUserProperties({
'test_property': 'test_value',
});
print('User properties set');
// 5. Test recording control
await FlutterUxcam.pauseScreenRecording();
await Future.delayed(Duration(seconds: 1));
await FlutterUxcam.resumeScreenRecording();
print('Recording pause/resume tested');
print('=== Test Complete ===');
}
}
// Run in your debug build
void main() {
runApp(MyApp());
if (kDebugMode) {
// Run test after app initialization
WidgetsBinding.instance.addPostFrameCallback((_) {
UXCamIntegrationTest.runTest();
});
}
}Q: How to export debug information for support?
Debug Information Exporter:
class DebugExporter {
static Future<String> generateDebugReport() async {
final buffer = StringBuffer();
// App information
final packageInfo = await PackageInfo.fromPlatform();
buffer.writeln('App Version: ${packageInfo.version}');
buffer.writeln('Build Number: ${packageInfo.buildNumber}');
// Device information
final deviceInfo = DeviceInfoPlugin();
if (Platform.isAndroid) {
final androidInfo = await deviceInfo.androidInfo;
buffer.writeln('Device: ${androidInfo.brand} ${androidInfo.model}');
buffer.writeln('Android: ${androidInfo.version.release}');
}
// UXCam status
final isRecording = await FlutterUxcam.isRecording();
buffer.writeln('UXCam Recording: $isRecording');
// Network connectivity
try {
await InternetAddress.lookup('uxcam.com');
buffer.writeln('Network: Connected');
} catch (e) {
buffer.writeln('Network: Error - $e');
}
return buffer.toString();
}
static Future<void> exportAndShare() async {
final report = await generateDebugReport();
// Save to file or share via email
final subject = 'UXCam Flutter Debug Report';
final uri = Uri(
scheme: 'mailto',
path: '[email protected]',
queryParameters: {
'subject': subject,
'body': report,
},
);
if (await canLaunchUrl(uri)) {
await launchUrl(uri);
}
}
}Getting Additional Help
Before Contacting Support
Run this diagnostic checklist:
class DiagnosticChecklist {
static Future<void> runDiagnostics() async {
print('=== UXCam Diagnostic Checklist ===');
// 1. SDK Version
print('✓ Using latest flutter_uxcam version');
// 2. App Key
print('✓ App key verified and correct');
// 3. Recording Status
final isRecording = await FlutterUxcam.isRecording();
print('✓ Recording status: $isRecording');
// 4. Network
try {
await InternetAddress.lookup('uxcam.com');
print('✓ Network connectivity: OK');
} catch (e) {
print('✗ Network connectivity: FAILED');
}
// 5. Platform Requirements
print('✓ Platform requirements met');
// 6. Integration Test
await UXCamIntegrationTest.runTest();
print('=== Diagnostics Complete ===');
}
}Contact Information
- Email Support: [email protected]
- Documentation: Flutter Integration Guide
- GitHub Issues: Report bugs on our repository
- Community: Join our developer Discord/Slack
Information to Include
When contacting support, include:
- Output from diagnostic checklist
- Relevant code snippets
- Console logs (with debug enabled)
- Device and app information
- Steps to reproduce the issue
This FAQ covers the most common issues. For complex problems, don't hesitate to contact our support team.
Updated 8 months ago
