Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions _source
Submodule _source added at a9c636
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ description: Integrate or upgrade the Contentsquare Flutter SDK -- Session Repla

```yaml
dependencies:
contentsquare: ^4.4.0
contentsquare: ^4.4.2
```

Then run `flutter pub get`.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ To use Contentsquare in-app features on iOS (screenshot capture, SDK logs, Log V
The app must be opened via a custom URL scheme.

**Using Xcode:**

1. Open the project settings
2. Select the app target
3. Select the `Info` settings
Expand Down Expand Up @@ -119,33 +118,27 @@ struct MyApp: App {
Once configured, in-app features can be enabled by:

### 1. Scanning QR code (physical device)

From the Contentsquare platform menu, scan the displayed QR code with the device.

### 2. Custom link (simulator)

Copy the deeplink from the Contentsquare platform and paste it in Safari on the Simulator.

### 3. Terminal command (simulator)

```bash
xcrun simctl openurl booted "CUSTOM_LINK"
```

Replace `CUSTOM_LINK` with the actual deeplink from the Contentsquare platform.

## Debugging with logs

By default, only one startup log is visible:

```
CSLIB ℹ️ Info: Contentsquare SDK vX.X.X starting in app: {{bundleID}}
```

To enable all logs, activate in-app features. Logs appear when in-app features are enabled and stop when disabled.

**To view logs:**

1. Connect the device to Mac (or use same Wi-Fi for wireless debugging)
2. Open macOS Console app (enable Info messages via Action > Include Info Messages) or Xcode
3. Filter logs on `CSLIB`
Expand All @@ -161,9 +154,9 @@ After completing the setup:

## Troubleshooting

| Issue | Solution |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| Deeplink doesn't open the app | Verify the URL scheme in `Info.plist` matches `cs-$(PRODUCT_BUNDLE_IDENTIFIER)`. Check bundle identifier in Xcode. |
| No overlay appears | Ensure `CSQ.handle(url:)` is called in the correct lifecycle method. Check console for errors. |
| `ContentsquareModule` not found | Run `pod install` in the `ios/` directory. Ensure the Contentsquare Flutter plugin is properly installed. |
| Logs not appearing | Ensure in-app features are enabled. Check Console app filter settings (include Info messages). |
| Issue | Solution |
|-------|----------|
| Deeplink doesn't open the app | Verify the URL scheme in `Info.plist` matches `cs-$(PRODUCT_BUNDLE_IDENTIFIER)`. Check bundle identifier in Xcode. |
| No overlay appears | Ensure `CSQ.handle(url:)` is called in the correct lifecycle method. Check console for errors. |
| `ContentsquareModule` not found | Run `pod install` in the `ios/` directory. Ensure the Contentsquare Flutter plugin is properly installed. |
| Logs not appearing | Ensure in-app features are enabled. Check Console app filter settings (include Info messages). |
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,15 @@ When no `maskingConfig` is provided, the SDK applies sensible defaults. See [def

### What each field masks

| Field | What gets masked | Example widgets |
| ------------------ | -------------------- | ----------------------------------------------- |
| `maskTexts` | All text content | `Text`, `RichText` |
| `maskTextFields` | Input field content | `TextField`, `TextFormField` |
| `maskImages` | Image content | `Image`, `Image.network`, `Image.asset` |
| `maskSvgImages` | SVG pictures | `flutter_svg` widgets |
| `maskCharts` | Chart content | `fl_chart` widgets |
| Field | What gets masked | Example widgets |
|-------|-----------------|-----------------|
| `maskTexts` | All text content | `Text`, `RichText` |
| `maskTextFields` | Input field content | `TextField`, `TextFormField` |
| `maskImages` | Image content | `Image`, `Image.network`, `Image.asset` |
| `maskSvgImages` | SVG pictures | `flutter_svg` widgets |
| `maskCharts` | Chart content | `fl_chart` widgets |
| `maskCustomPaints` | Custom-drawn content | Your `CustomPaint` widgets (not framework ones) |
| `maskInteractions` | User interactions | Taps, swipes (Product Analytics only) |
| `maskInteractions` | User interactions | Taps, swipes (Product Analytics only) |

### Masking precedence

Expand Down Expand Up @@ -101,10 +101,10 @@ await CSQ().startSessionReplay();
await CSQ().stopSessionReplay();
```

| Method | Effect |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startSessionReplay()` | Starts SR. Behaves like the automatic start once invoked. **One-shot:** intended to be called at most once when `sessionReplayAutoStart: false`. |
| `stopSessionReplay()` | Stops SR only. Other tracking (events, pageviews, identify, etc.) keeps running. **Terminal:** once called, SR cannot be re-started -- subsequent `startSessionReplay()` calls have no effect. Use `CSQ().stop()` to stop everything. |
| Method | Effect |
|--------|--------|
| `startSessionReplay()` | Starts SR. Behaves like the automatic start once invoked. **One-shot:** intended to be called at most once when `sessionReplayAutoStart: false`. |
| `stopSessionReplay()` | Stops SR only. Other tracking (events, pageviews, identify, etc.) keeps running. **Terminal:** once called, SR cannot be re-started -- subsequent `startSessionReplay()` calls have no effect. Use `CSQ().stop()` to stop everything. |

> **No restart support.** This API only handles **starting** and **stopping** SR -- it is not a pause/resume mechanism. Plan the customer's flow accordingly: start SR at the beginning of the journey you want to record, and only call `stopSessionReplay()` when you are sure the recording is complete for the rest of the session.

Expand Down
2 changes: 1 addition & 1 deletion skills/contentsquare-flutter-sdk/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ description: Integrate or upgrade the Contentsquare Flutter SDK -- Session Repla

```yaml
dependencies:
contentsquare: ^4.4.0
contentsquare: ^4.4.2
```

Then run `flutter pub get`.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ To use Contentsquare in-app features on iOS (screenshot capture, SDK logs, Log V
The app must be opened via a custom URL scheme.

**Using Xcode:**

1. Open the project settings
2. Select the app target
3. Select the `Info` settings
Expand Down Expand Up @@ -119,33 +118,27 @@ struct MyApp: App {
Once configured, in-app features can be enabled by:

### 1. Scanning QR code (physical device)

From the Contentsquare platform menu, scan the displayed QR code with the device.

### 2. Custom link (simulator)

Copy the deeplink from the Contentsquare platform and paste it in Safari on the Simulator.

### 3. Terminal command (simulator)

```bash
xcrun simctl openurl booted "CUSTOM_LINK"
```

Replace `CUSTOM_LINK` with the actual deeplink from the Contentsquare platform.

## Debugging with logs

By default, only one startup log is visible:

```
CSLIB ℹ️ Info: Contentsquare SDK vX.X.X starting in app: {{bundleID}}
```

To enable all logs, activate in-app features. Logs appear when in-app features are enabled and stop when disabled.

**To view logs:**

1. Connect the device to Mac (or use same Wi-Fi for wireless debugging)
2. Open macOS Console app (enable Info messages via Action > Include Info Messages) or Xcode
3. Filter logs on `CSLIB`
Expand All @@ -161,9 +154,9 @@ After completing the setup:

## Troubleshooting

| Issue | Solution |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| Deeplink doesn't open the app | Verify the URL scheme in `Info.plist` matches `cs-$(PRODUCT_BUNDLE_IDENTIFIER)`. Check bundle identifier in Xcode. |
| No overlay appears | Ensure `CSQ.handle(url:)` is called in the correct lifecycle method. Check console for errors. |
| `ContentsquareModule` not found | Run `pod install` in the `ios/` directory. Ensure the Contentsquare Flutter plugin is properly installed. |
| Logs not appearing | Ensure in-app features are enabled. Check Console app filter settings (include Info messages). |
| Issue | Solution |
|-------|----------|
| Deeplink doesn't open the app | Verify the URL scheme in `Info.plist` matches `cs-$(PRODUCT_BUNDLE_IDENTIFIER)`. Check bundle identifier in Xcode. |
| No overlay appears | Ensure `CSQ.handle(url:)` is called in the correct lifecycle method. Check console for errors. |
| `ContentsquareModule` not found | Run `pod install` in the `ios/` directory. Ensure the Contentsquare Flutter plugin is properly installed. |
| Logs not appearing | Ensure in-app features are enabled. Check Console app filter settings (include Info messages). |
24 changes: 12 additions & 12 deletions skills/contentsquare-flutter-sdk/references/session-replay.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,15 @@ When no `maskingConfig` is provided, the SDK applies sensible defaults. See [def

### What each field masks

| Field | What gets masked | Example widgets |
| ------------------ | -------------------- | ----------------------------------------------- |
| `maskTexts` | All text content | `Text`, `RichText` |
| `maskTextFields` | Input field content | `TextField`, `TextFormField` |
| `maskImages` | Image content | `Image`, `Image.network`, `Image.asset` |
| `maskSvgImages` | SVG pictures | `flutter_svg` widgets |
| `maskCharts` | Chart content | `fl_chart` widgets |
| Field | What gets masked | Example widgets |
|-------|-----------------|-----------------|
| `maskTexts` | All text content | `Text`, `RichText` |
| `maskTextFields` | Input field content | `TextField`, `TextFormField` |
| `maskImages` | Image content | `Image`, `Image.network`, `Image.asset` |
| `maskSvgImages` | SVG pictures | `flutter_svg` widgets |
| `maskCharts` | Chart content | `fl_chart` widgets |
| `maskCustomPaints` | Custom-drawn content | Your `CustomPaint` widgets (not framework ones) |
| `maskInteractions` | User interactions | Taps, swipes (Product Analytics only) |
| `maskInteractions` | User interactions | Taps, swipes (Product Analytics only) |

### Masking precedence

Expand Down Expand Up @@ -101,10 +101,10 @@ await CSQ().startSessionReplay();
await CSQ().stopSessionReplay();
```

| Method | Effect |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startSessionReplay()` | Starts SR. Behaves like the automatic start once invoked. **One-shot:** intended to be called at most once when `sessionReplayAutoStart: false`. |
| `stopSessionReplay()` | Stops SR only. Other tracking (events, pageviews, identify, etc.) keeps running. **Terminal:** once called, SR cannot be re-started -- subsequent `startSessionReplay()` calls have no effect. Use `CSQ().stop()` to stop everything. |
| Method | Effect |
|--------|--------|
| `startSessionReplay()` | Starts SR. Behaves like the automatic start once invoked. **One-shot:** intended to be called at most once when `sessionReplayAutoStart: false`. |
| `stopSessionReplay()` | Stops SR only. Other tracking (events, pageviews, identify, etc.) keeps running. **Terminal:** once called, SR cannot be re-started -- subsequent `startSessionReplay()` calls have no effect. Use `CSQ().stop()` to stop everything. |

> **No restart support.** This API only handles **starting** and **stopping** SR -- it is not a pause/resume mechanism. Plan the customer's flow accordingly: start SR at the beginning of the journey you want to record, and only call `stopSessionReplay()` when you are sure the recording is complete for the rest of the session.

Expand Down
Loading