Skip to content

8.11.0

Compare
Choose a tag to compare
@getsentry-bot getsentry-bot released this 10 Dec 12:07

Features

  • Support for screenshot PII content masking (#2361)
    By default, masking is enabled for SessionReplay. To also enable it for screenshots captured with events, you can specify options.experimental.privacy:

    await SentryFlutter.init(
      (options) {
        ...
        // the defaults are:
        options.experimental.privacy.maskAllText = true;
        options.experimental.privacy.maskAllImages = true;
        options.experimental.privacy.maskAssetImages = false;
        // you cal also set up custom masking, for example:
        options.experimental.privacy.mask<WebView>();
      },
      appRunner: () => runApp(MyApp()),
    );

    Actually, just accessing this field will cause it to be initialized with the default settings to mask all text and images:

    await SentryFlutter.init(
      (options) {
        ...
        // this has a side-effect of creating the default privacy configuration, thus enabling Screenshot masking:
        options.experimental.privacy;
      },
      appRunner: () => runApp(MyApp()),
    );
  • Linux native error & obfuscation support (#2431)

  • Improve Device context on plain Dart and Flutter desktop apps (#2441)

  • Add debounce to capturing screenshots (#2368)

    • Per default, screenshots are debounced for 2 seconds.

    • If you need more granular screenshots, you can opt out of debouncing:

      await SentryFlutter.init((options) {
        options.beforeCaptureScreenshot = (event, hint, debounce) {
          if (debounce) {
            return true; // Capture screenshot even if the SDK wants to debounce it.
          } else {
            // check event and hint
            ...
          }
        };
      });
    • Replace deprecated BeforeScreenshotCallback with new BeforeCaptureCallback.

  • Windows native error & obfuscation support (#2286, #2426)

  • Improve app start measurements by using addTimingsCallback instead of addPostFrameCallback to determine app start end (#2405)

    • ⚠️ This change may result in reporting of shorter app start durations
  • Improve frame tracking accuracy (#2372)

    • Introduces SentryWidgetsFlutterBinding that tracks a frame starting from handleBeginFrame and ending in handleDrawFrame, this is approximately the buildDuration time

    • By default, SentryFlutter.init() automatically initializes SentryWidgetsFlutterBinding through the WidgetsFlutterBindingIntegration

    • If you need to initialize the binding before SentryFlutter.init, use SentryWidgetsFlutterBinding.ensureInitialized instead of WidgetsFlutterBinding.ensureInitialized:

      void main() async {
        // Replace WidgetsFlutterBinding.ensureInitialized()
        SentryWidgetsFlutterBinding.ensureInitialized();
      
        await SentryFlutter.init(...);
        runApp(MyApp());
      }
    • ⚠️ Frame tracking will be disabled if a different binding is used

Enhancements

  • Only send debug images referenced in the stacktrace for events (#2329)
  • Remove sentry frames if SDK falls back to current stack trace (#2351)
    • Flutter doesn't always provide stack traces for unhandled errors - this is normal Flutter behavior
    • When no stack trace is provided (in Flutter errors, captureException, or captureMessage):
      • SDK creates a synthetic trace using StackTrace.current
      • Internal SDK frames are removed to reduce noise
    • Original stack traces (when provided) are left unchanged

Fixes

  • Catch errors thrown during handleBeginFrame and handleDrawFrame (#2446)
  • OS & device contexts missing on Windows (#2439)
  • Native iOS/macOS SDK session didn't start after Flutter hot-restart (#2452)
  • Kotlin 2.1.0 compatibility on Android, bump Kotlin language version from 1.4 to 1.6 (#2456)
  • Apply default IP address ({{auto}}) to transactions (#2395)
    • Previously, transactions weren't getting the default IP address when user context was loaded
    • Now consistently applies default IP address to both events and transactions when:
      • No user context exists
      • User context exists but IP address is null

Dependencies