upscope_flutter 2025.7.6
upscope_flutter: ^2025.7.6 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.7.6
Usage #
Basic Setup #
import 'package:upscope_flutter/upscope_flutter.dart';
// Basic initialization
final upscopeManager = await Upscope.initialize('your-api-key');
// Advanced initialization with configuration and connection parameters
final config = UpscopeConfiguration(
requireAuthorizationForSession: true,
enableLookupCodeOnShake: true,
);
final upscopeManager = await Upscope.initialize(
'your-api-key',
config: config,
agentPrompt: 'How can I help you today?',
identities: ['user123', 'premium_user'],
integrationIds: ['zendesk', 'salesforce'],
tags: ['mobile', 'flutter'],
uniqueId: 'unique-user-identifier',
metadata: {'app_version': '1.0.0', 'user_type': 'premium'},
);
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
// Configuration is now optional since all fields are optional
final config = UpscopeConfiguration(
requireAuthorizationForSession: true,
enableLookupCodeOnShake: true,
);
final upscopeManager = await Upscope.initialize('your-api-key', config);
// Or initialize with minimal configuration
final upscopeManager = await Upscope.initialize('your-api-key');
Initialization Parameters #
The Upscope.initialize method supports the following parameters:
Required Parameters #
| Parameter | Type | Description |
|---|---|---|
apiKey |
String |
Your Upscope API key |
Optional Connection Parameters #
| Parameter | Type | Description |
|---|---|---|
agentPrompt |
String? |
Custom prompt text shown to agents |
identities |
List<String>? |
Array of identity strings for the user |
integrationIds |
List<String>? |
Array of integration identifiers (e.g., 'zendesk') |
tags |
List<String>? |
Array of tags for categorization (e.g., 'mobile') |
uniqueId |
String? |
Unique identifier for the user/session |
secretKey |
String? |
Secret key for additional authentication |
metadata |
Map<String, String>? |
Additional metadata as key-value pairs |
Usage Examples #
// Minimal initialization
final manager = await Upscope.initialize('your-api-key');
// With user identification
final manager = await Upscope.initialize(
'your-api-key',
identities: ['user123', 'premium_tier'],
uniqueId: 'user-unique-id',
tags: ['mobile', 'ios'],
);
// With integrations and metadata
final manager = await Upscope.initialize(
'your-api-key',
integrationIds: ['zendesk', 'salesforce'],
metadata: {
'app_version': '1.0.0',
'user_tier': 'premium',
'platform': 'flutter',
},
);
Configuration Options #
The UpscopeConfiguration class supports the following options (all fields are optional):
| Parameter | Type | Default | Description |
|---|---|---|---|
beta |
bool? |
null |
Enable beta features |
teamDomain |
String? |
null |
Team domain for authentication |
showUpscopeLink |
bool? |
null |
Show Upscope branding link |
showTerminateButton |
bool? |
null |
Show session terminate button |
enableLookupCodeOnShake |
bool? |
null |
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? |
null |
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? |
null |
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" />
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', '~> 2025.7.1'
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(String apiKey, {UpscopeConfiguration? config, String? agentPrompt, List<String>? identities, List<String>? integrationIds, List<String>? tags, String? uniqueId, String? secretKey, Map<String, String>? metadata})- 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)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
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.