upscope_flutter 2025.6.2
upscope_flutter: ^2025.6.2 copied to clipboard
A Flutter plugin for Upscope cobrowsing that supports Android and iOS.
Upscope Flutter Plugin #
A Flutter plugin that wraps the native Upscope cobrowsing SDKs for Android and iOS.
Overview #
This plugin provides a unified Flutter API for integrating Upscope's cobrowsing functionality into your Flutter applications. It supports both Android and iOS platforms through a federated plugin architecture.
Installation #
Add this to your package's pubspec.yaml file:
dependencies:
upscope_flutter: ^2025.6.2
Usage #
Basic Setup #
import 'package:upscope_flutter/upscope_flutter.dart';
// Initialize Upscope
final config = UpscopeConfiguration(
apiKey: 'your-api-key',
);
final upscopeManager = await Upscope.initialize(config);
Connecting and Managing Sessions #
// Connect to Upscope
await upscopeManager.connect();
// Get lookup code for session
final lookupCode = await upscopeManager.getLookupCode();
print('Lookup code: $lookupCode');
// Send custom message
await upscopeManager.customMessage('Hello from Flutter!');
// Stop session
await upscopeManager.stopSession();
// Disconnect
await upscopeManager.disconnect();
Event Handling #
// Subscribe to connection status changes
upscopeManager.subscribeToIsConnected((isConnected) {
print('Connection status changed: $isConnected');
});
// Subscribe to recording status changes
upscopeManager.subscribeToIsRecording((isRecording) {
print('Recording status changed: $isRecording');
});
// Subscribe to short ID changes
upscopeManager.subscribeToShortId((shortId) {
print('Short ID: $shortId');
});
Content Redaction #
The plugin supports redacting sensitive content during screen sharing:
import 'package:upscope_flutter/upscope_flutter.dart';
// Method 1: Using UpscopeRedacted widget
UpscopeRedacted(
child: Text('Sensitive information'),
)
// Method 2: Using extension method
Text('Credit card number').markAsRedacted()
// Method 3: Conditional redaction
UpscopeRedacted(
enabled: shouldRedact,
child: Text('Conditionally sensitive data'),
)
Redacted content will be hidden during screen capture while remaining visible to the app user.
Basic Redaction Usage
import 'package:upscope_flutter/upscope_flutter.dart';
// Method 1: Using the UpscopeRedacted widget
UpscopeRedacted(
child: Text('Sensitive information'),
enabled: true, // Optional, defaults to true
)
// Method 2: Using the extension method (recommended)
Text('Credit Card: 4532-1234-5678-9012').markAsRedacted()
// Method 3: Conditionally redact content
TextField(
decoration: InputDecoration(labelText: 'Password'),
obscureText: true,
).markAsRedacted(enabled: shouldRedact)
Advanced Redaction Examples
// Redacting form fields
class SensitiveForm extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
// Normal field - visible in cobrowsing
TextField(
decoration: InputDecoration(labelText: 'Email'),
),
// Redacted field - appears as black rectangle
TextField(
decoration: InputDecoration(labelText: 'Password'),
obscureText: true,
).markAsRedacted(),
// Conditionally redacted content
Container(
padding: EdgeInsets.all(16),
child: Text('SSN: 123-45-6789'),
).markAsRedacted(enabled: isDataSensitive),
],
);
}
}
Redaction in Lists and Scrollable Content
// Redacting specific list items
ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
final item = items[index];
final isRedacted = item.isSensitive;
Widget listTile = ListTile(
title: Text(item.title),
subtitle: Text(item.content),
);
// Apply redaction to sensitive items
return isRedacted ? listTile.markAsRedacted() : listTile;
},
)
Global Redaction Configuration
// Enable/disable redaction globally
final config = UpscopeConfiguration(
apiKey: 'your-api-key',
redactionEnabled: true, // Default: true
);
final upscopeManager = await Upscope.initialize(config);
How Redaction Works
- Coordinate-based: Redaction tracks widget positions and sends coordinates to native platforms
- No visual overlays: Redacted content appears normal to the user but is blocked in cobrowsing
- Dynamic tracking: Widget positions are tracked in real-time as they move or scroll
- Clipping-aware: Properly handles scrollable areas, clipped content, and complex layouts
- Device pixel ratio: Automatically handles different screen densities
Redaction Best Practices
- Mark sensitive data: Always redact passwords, credit cards, SSNs, and other PII
- Use extension method:
widget.markAsRedacted()is the most convenient approach - Consider user experience: Redaction is invisible to users but blocks cobrowsing agents
- Test thoroughly: Verify redaction works correctly in your specific UI layouts
- Global configuration: Use
redactionEnabled: falsein development if needed
Using Native Overlays #
For apps that need to display native overlays (like drawing tools), you can use the UpscopeOverlayView:
import 'package:upscope_flutter/upscope_flutter.dart';
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Stack(
children: [
// Your app content
MyAppContent(),
// Native overlay view
Positioned.fill(
child: UpscopeOverlayView(
onViewCreated: () {
print('Overlay view created');
},
),
),
],
);
}
}
Configuration Options #
The UpscopeConfiguration class supports the following options:
| Parameter | Type | Default | Description |
|---|---|---|---|
apiKey |
String |
required | Your Upscope API key |
defaultRegion |
String |
'us-east' |
Default server region |
redactionEnabled |
bool |
true |
Enable content redaction |
enableTelemetry |
bool |
true |
Enable telemetry collection |
metadata |
Map<String, dynamic> |
{} |
Additional metadata |
beta |
bool |
false |
Enable beta features |
teamDomain |
String? |
null |
Team domain for authentication |
showUpscopeLink |
bool |
false |
Show Upscope branding link |
showTerminateButton |
bool |
false |
Show session terminate button |
enableLookupCodeOnShake |
bool |
true |
Enable lookup code display on device shake |
lookupCodeKeyTitle |
String? |
null |
Custom title for lookup code dialog |
lookupCodeKeyMessage |
String? |
null |
Custom message for lookup code dialog |
requireAuthorizationForSession |
bool |
true |
Require user authorization before starting session |
authorizationPromptTitle |
String? |
null |
Custom authorization prompt title |
authorizationPromptMessage |
String? |
null |
Custom authorization prompt message |
endOfScreenshareMessage |
String? |
null |
Custom message when screenshare ends |
translationsYes |
String? |
null |
Custom "Yes" translation |
translationsNo |
String? |
null |
Custom "No" translation |
translationsOk |
String? |
null |
Custom "OK" translation |
translationsStopSession |
String? |
null |
Custom "Stop Session" translation |
autoconnect |
bool |
false |
Automatically connect on initialization |
region |
String? |
null |
Override default region |
Platform-Specific Setup #
Android #
-
The plugin automatically includes the Upscope Android SDK.
-
Add required permissions to
android/app/src/main/AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
<!-- For full-screen capture (optional) -->
<uses-permission android:name="android.permission.MEDIA_PROJECTION" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
iOS #
- Add the Upscope iOS SDK to your app's
ios/Podfile:
platform :ios, '16.0' # Required for UpscopeIO SDK
target 'Runner' do
use_frameworks!
# Add Upscope iOS SDK
pod 'UpscopeIO', :git => 'https://github.com/upscopeio/cobrowsing-ios.git', :tag => 'v2025.6.4'
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end
Note: UpscopeIO requires iOS 16.0 or later as the minimum deployment target.
-
Run
pod installin theiosdirectory to install dependencies. -
For full-screen capture, add screen recording capability to your app's entitlements.
API Reference #
UpscopeManager #
The main class for interacting with the Upscope SDK.
Methods
initialize(UpscopeConfiguration config)- Initialize the SDKconnect()- Connect to Upscope serversdisconnect()- Disconnect from serversreset()- Reset SDK stategetShortId()- Get session short IDgetLookupCode()- Get/generate lookup codeupdateConnection({Map<String, dynamic>? metadata})- Update connection metadatagetWatchLink()- Get session watch URLstopSession()- End current sessioncustomMessage(String message)- Send custom messagedeclineSession()- Decline incoming sessiongetIsConnected()- Get connection statusgetIsConnecting()- Get connecting statusgetIsRecording()- Get recording statusgetUniqueConnectionId()- Get unique connection identifier
Event Subscriptions
subscribeToIsConnected(Function(bool) callback)subscribeToIsConnecting(Function(bool) callback)subscribeToIsRecording(Function(bool) callback)subscribeToShortId(Function(String) callback)subscribeToLookupCode(Function(String) callback)subscribeToUniqueConnectionId(Function(String) callback)
UpscopeOverlayView #
A widget for displaying native overlay content.
Properties
onViewCreated- Callback when the native view is createdlayoutDirection- Layout direction for the viewgestureRecognizers- Gesture recognizers to attach to the view
Troubleshooting #
Common Issues #
- Plugin not found: Ensure you've added the plugin to your
pubspec.yamland runflutter pub get - Platform not supported: This plugin only supports Android and iOS
Debug Mode #
Enable logging in your configuration to see detailed debug information:
final config = UpscopeConfiguration(
apiKey: 'your-api-key',
);
Contributing #
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
License #
This plugin is provided under the same license as the Upscope SDKs. Please refer to Upscope's official documentation and licensing terms for production use.
Support #
For support with the Upscope service itself, please contact Upscope support. For issues with this Flutter plugin, please file an issue in this repository.