SaleAssist for Developers
HomeDashboardAPI DocsBook A Demo
  • 👋Welcome
  • Introduction
  • Onboarding Steps
  • Admin Account Creation
  • Getting Started
  • Features Overview
    • Live Video Calling
      • Outbound Calls
        • Schedule Video Meets
        • Instant Video Meets
      • Inbound Calls
        • How to use ?
        • Integration
        • Desktop Call Management
    • Live Stream Selling
      • How to go Live?
      • Get RTMP and Stream Key from social channels.
    • Shoppable Videos Tiles
      • How to use?
      • Integration
    • Strike
      • AI Videos
    • Co-Browsing
  • Integration Guide
    • Mobile SDK integration
      • Cobrowse - Flutter SDK
      • React Native SDK
      • IOS SDK
      • Android SDK
      • How to delete my account?
      • Cobrowse - Android SDK
      • Cobrowse - IOS SDK
      • Identify your devices for Cobrowse
      • Use 6-digit codes
      • Redact sensitive data
      • Start and Stop Cobrowsing
      • Listening for events
    • User Experience
    • Agent Mapping
    • Nudges
    • Agent Feedback
    • AI Chat (Add Context)
    • API Integration
    • Webhook Integration
    • FAQ & Troubleshooting
    • Lead Management
    • Task Management
    • SaleAssist Whatsapp Feature
    • Sales/Conversion Tracking - Widget
    • Sales/Conversion Tracking - Video Tiles
    • Integrate meetings lite dashboard
  • Assets Managment
    • Media
    • Products
    • Orders
  • Organization Settings
    • Profile
    • Organization
    • Users & Roles
    • SMTP Integration
    • Custom Domain
    • Notification Manager
  • Addons
    • Transcription & Summarization
    • Video QR Codes
    • Video Emails
    • Live Chat
    • Outbound Phone Calling
    • Book In-store appointment
    • Schedule Call
    • Shoppable Video Links
      • How to use?
      • Integration
    • Video FAQs
      • How to use?
      • Integration
    • WhatsApp Onboarding steps
  • Analytics
    • Widget Insights
    • Video tiles insights
    • Reporting
    • SaleAssist Mobile Application
    • How to manage calls on Mobile Application
    • Admin Controls
  • Troubleshooting
    • Troubleshoot Video Call Permissions
  • Release Logs
    • v24.11.24
    • v24.11.30
    • v24.12.10
    • v25.01.10
    • v25.01.18
    • v25.01.29
    • v25.02.05
    • v25.02.05
Powered by GitBook
On this page

Was this helpful?

  1. Integration Guide
  2. Mobile SDK integration

Redact sensitive data

Ensure secure remote screen viewing using the redaction API to automatically block sensitive data such as credit card details, social security numbers and more.

When remotely viewing a user's screen, there may be certain sensitive data that should not be viewable by the agent.

For this purpose, we provide a redaction API that automatically blocks out on device all sensitive data sources such as credit cards, social security numbers, etc. When certain data is redacted, it will never leave the user's device.

SaleAssist Cobrowse provides two methods for redacting sensitive data in your applications:

1. Define the redacted views in your app source code (recommended)

This is the recommended method as it will make sure your redactions are tied to application or websites code version.

Redactions are defined as CSS selectors, passed as an array to the SaleAssist Cobrowse SDK. We recommend using a simple css class to signify redaction where possible, although more complex selectors will also work.

CobrowseIO.redactedViews = ['.redacted', ...some other selectors...]

Our web SDK also supports an un-redaction mechanism, where by you can define sub-elements inside of a redacted element that should be visible to the agent. You can specify un-redaction selectors like this:

CobrowseIO.unredactedViews = ['.unredacted', ...some other selectors...]

Implement the CobrowseIORedacted protocol on any UIViewController that contains sensitive views. This protocol contains one method:

// From this method you should return a list of the views you want
// Cobrowse to redact, for example:
- (NSArray*) redactedViews {
    return @[ redactedTextView ];
}

If making changes to your UIViewController subclasses isn't an option, we also support a delegate style method to allow you to supply this information in one place. Implement cobrowseRedactedViewsForViewController in your CobrowseIODelegate class, then you can pass redacted views for a specific UIViewController in a single method:

-(NSArray<UIView*>*) cobrowseRedactedViewsForViewController:(UIViewController*) vc {
    NSMutableArray<UIView*>* redacted = [[NSMutableArray alloc] init];
    // Return a list of redacted views for a provided UIViewController
    return redacted;
}

Redaction by default

Sometimes you may want to redact everything on the screen, then selectively "unredact" only the parts your support agents should be able to see. This is particularly useful on applications that require a higher privacy standard or where only specific sections of the App should be visible to the agent.

To achieve this, you'll need to follow the delegate implementation and ensure you pass the all your applications root views to the Cobrowse redaction delegate method:

-(NSArray<UIView*>*) cobrowseRedactedViewsForViewController:(UIViewController*) vc {
    return @[self.window.rootViewController.view];
}

Once you've done this, your application root views will be redacted by default and you'll be able to un-redact child components to make them visible to the agents by implementing cobrowseUnredactedViewsForViewController in your CobrowseIODelegate class:

-(NSArray<UIView*>*) cobrowseUnredactedViewsForViewController:(UIViewController *) vc {
    UIView *unredacted = [self findViewByAccessibilityLabel:self.window:@"viewToBeUnredacted"];
    if (unredacted) {
        return @[unredacted];
    }
    return @[];
}

Alternatively, you can implement CobrowseIOUnredacted protocol in your UIViewController subclasses:

-(NSArray*) unredactedViews {
    return @[viewToBeUnredacted];
}

Redaction of WebView content

Your app may show web content that contains elements that you wish to redact. This can be achieved by setting the webviewRedactedViews property to an array of CSS selectors that identify the elements to be redacted.

CobrowseIO.instance.webviewRedactedViews = @[ @".redacted", ...some other selectors... ];

Implement the CobrowseIO.Redacted interface on any Activity that contains sensitive views. This interface contains one method:

// From this method you should return a list of the views you want
// Cobrowse to redact, for example:
public List<View> redactedViews() {
    List<View> redacted = new ArrayList<>();
    redacted.add(findViewById(R.id.redact_me));
    return redacted;
}

If making changes to your Activity classes isn't an option, we also support a delegate style method to allow you to supply this information in one place. Implement CobrowseIO.RedactionDelegate interface in your CobrowseIO.Delegate class, then you can pass redacted views for a specific Activity in a single method:

@Override
public List<View> redactedViews(@NonNull Activity activity) {
    List<View> redacted = new ArrayList<>();
    // Return a list of redacted views for a provided activity
    return redacted;
}

Redaction by default

Sometimes you may want to redact everything on the screen, then selectively "unredact" only the parts your support agents should be able to see. This is particularly useful on applications that require a higher privacy standard or where only specific sections of the App should be visible to the agent.

To achieve this, you'll need to follow the delegate implementation and ensure you pass the all your applications root views to the Cobrowse redaction delegate method:

@Override
public List<View> redactedViews(@NonNull Activity activity) {
    return new ArrayList<View>() {{
        add(activity.getWindow().getDecorView());
    }};
}

Once you've done this, your application root views will be redacted by default and you'll be able to un-redact child components to make them visible to the agents by implementing CobrowseIO.UnredactionDelegate in your CobrowseIO.Delegate class:

@Override
public List<View> unredactedViews(@NonNull Activity activity) {
    return new ArrayList<View>(){{
        if (findViewById(R.id.view_to_be_unredacted) != null)
            add(findViewById(R.id.view_to_be_unredacted));
    }};
}

Alternatively, you can implement CobrowseIO.Unredacted interface in your Activity subclasses:

@Override
public List<View> unredactedViews() {
    return new ArrayList<View>(){{
        if (findViewById(R.id.view_to_be_unredacted) != null)
            add(findViewById(R.id.view_to_be_unredacted));
    }};
}

Redaction of WebView content

Your app may show web content that contains elements that you wish to redact. This can be achieved by setting the webviewRedactedViews property to an array of CSS selectors that identify the elements to be redacted.

CobrowseIO.instance().webviewRedactedViews(new String[] { ".redacted",  ...some other selectors... });A

To redact an element in your RN application you can wrap it in a tag provided by the Cobrowse module:

import { Redacted } from 'cobrowse-sdk-react-native';

// ...
<View style={styles.container}>
    <Redacted>
        <Text style={styles.instructions}>This text should be secret</Text>
    </Redacted>
</View>

Redaction by default

Sometimes you may want to redact everything on the screen, then selectively "unredact" only the parts your support agents should be able to see. This is particularly useful on applications that require a higher privacy standard or where only specific sections of the App should be visible to the agent.

Once you've done this, your application root views will be redacted by default and you'll be able to un-redact child components to make them visible to the agents:

import { Unredacted } from 'cobrowse-sdk-react-native';
// ...

<View style={styles.container}>
    <Text>This text should be secret due to the redaction by default implementation</Text>
    <Unredacted>
        <Text>This text will be visible to the agents because it's wrapped with an Unredacted component</Text>
        <Redacted>
            <Text>You can also nest redacted elements inside unredacted ones. This text will be hidden to the agents.</Text>
        </Redacted>
    </Unredacted>
</View>

Redaction of WebView content

Your app may show web content that contains elements that you wish to redact. This can be achieved by setting the webviewRedactedViews property to an array of CSS selectors that identify the elements to be redacted.

CobrowseIO.webviewRedactedViews = [ '.redacted', ...some other selectors... ];

Redacting views outside React Native

Xamarin.iOS implementation

Implement the ICobrowseIORedacted interface on any UIViewController that contains sensitive views. This interface contains one RedactedViews property:

public partial class ViewController : UIViewController, ICobrowseIORedacted
{
    // From this property you should return a list of the views you want Cobrowse to redact, for example:
    public UIView[] RedactedViews
        => new[] { redactedTextView };
}

Xamarin.Android implementation

Implement the CobrowseIO.IRedacted interface on any Activity that contains sensitive views. This interface contains one method:

[Activity]
public class MainActivity : AppCompatActivity, CobrowseIO.IRedacted
{
    // From this method you should return a list of the views you want Cobrowse to redact, for example:
    public IList<View> RedactedViews()
    {
        return new[]
        {
            FindViewById(Resource.Id.redact_me)
        }
    }
}

Xamarin.Forms implementation

In your cross-platform project declare a new Effect for marking Xamarin.Forms UI elements as redacted:

using Xamarin.Forms;

namespace YourAppNamespace.Forms
{
    /// <summary>
    /// A Xamarin.Forms effect that helps to redact Xamarin.Forms view in Cobrowse.io.
    /// </summary>
    public class CobrowseRedactedViewEffect : RoutingEffect
    {
        public bool IsRedacted { get; set; } = true;

        public CobrowseRedactedViewEffect()
            : base("YourAppName" + "." + nameof(CobrowseRedactedViewEffect))
        {
        }
    }
}

iOS-specific platform Effect would look like this:

using System.Collections.Generic;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ResolutionGroupName("YourAppName")]
[assembly: ExportEffect(typeof(YourAppNamespace.iOS.PlatformCobrowseRedactedViewEffect), "CobrowseRedactedViewEffect")]
namespace YourAppNamespace.iOS
{
    public class PlatformCobrowseRedactedViewEffect : PlatformEffect
    {
        private static readonly List<UIView> sRedacted = new List<UIView>();

        public static UIView[] RedactedViews => sRedacted.ToArray();

        public PlatformCobrowseRedactedViewEffect()
        {
        }

        protected override void OnAttached()
        {
            // We have to always use 'Container' and never 'Control'
            // because 'Control' is null in 'OnDetached', at least in Xamarin.Forms 4.5.0.356
            AddToRedacted(Container);
        }

        protected override void OnDetached()
        {
            RemoveFromRedacted(Container);
        }

        private static void AddToRedacted(UIView view)
        {
            if (view == null)
            {
                return;
            }
            sRedacted.Add(view);
        }

        private static void RemoveFromRedacted(UIView view)
        {
            if (view == null)
            {
                return;
            }
            if (sRedacted.Contains(view))
            {
                sRedacted.Remove(view);
            }
        }
    }
}

Then create a new default Xamarin.Forms.Page renderer which would implement ICobrowseIORedacted interface:

using UIKit;
using Xamarin.CobrowseIO;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(ContentPage), typeof(YourAppNamespace.iOS.CobrowseRedactedPageRenderer))]
namespace YourAppNamespace.iOS
{
    public class CobrowseRedactedPageRenderer : PageRenderer, ICobrowseIORedacted
    {
        public UIView[] RedactedViews => PlatformCobrowseRedactedViewEffect.RedactedViews;
    }
}

Android-specific platform Effect would look like this:

using System.Collections.Generic;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using AView = Android.Views.View;

[assembly: ResolutionGroupName("YourAppName")]
[assembly: ExportEffect(typeof(YourAppNamespace.Android.PlatformCobrowseRedactedViewEffect), "CobrowseRedactedViewEffect")]
namespace YourAppNamespace.Android
{
    public class PlatformCobrowseRedactedViewEffect : PlatformEffect
    {
        private static readonly List<AView> sRedacted = new List<AView>();

        public static IList<AView> RedactedViews => sRedacted;

        protected override void OnAttached()
        {
            AddToRedacted(Control ?? Container);
        }

        protected override void OnDetached()
        {
            RemoveFromRedacted(Control ?? Container);
        }

        private static void AddToRedacted(AView view)
        {
            if (view == null)
            {
                return;
            }
            sRedacted.Add(view);
        }

        private static void RemoveFromRedacted(AView view)
        {
            if (view == null)
            {
                return;
            }
            if (sRedacted.Contains(view))
            {
                sRedacted.Remove(view);
            }
        }
    }
}

Then implement CobrowseIO.IRedacted interface in your Forms activity:

using System.Collections.Generic;
using Android.App;
using Xamarin.CobrowseIO;
using AView = Android.Views.View;

namespace YourAppNamespace.Android
{
    [Activity]
    public class MainActivity
        : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity,
        CobrowseIO.IRedacted
    {
        public IList<AView> RedactedViews()
        {
            return PlatformCobrowseRedactedViewEffect.RedactedViews;
        }
    }
}

Redaction of WebView content

Your app may show web content that contains elements that you wish to redact. This can be achieved by setting the WebViewRedactedViews property to an array of CSS selectors that identify the elements to be redacted.

CobrowseIO.Instance.WebViewRedactedViews = new string[] { ".redacted", ...some other selectors... };

For any support write us at support@saleassist.ai

PreviousUse 6-digit codesNextStart and Stop Cobrowsing

Last updated 1 year ago

Was this helpful?

Finally, within React Native some packages will render in new Windows/Root Views. You can follow the same delegate implementation to identify this views and redact or unredact them by default as required. You can check the provided examples for and which redact by default the React Native Dev menu keeping one of the options unredacted to illustrate the technique.

While it is not possible to access platform-specific UI code directly from a cross-platform project, you can easily achieve it using and .

iOS
Android
Effects
Custom Renderers