Flutter’s iOS target is a runner plus plugins plus a Dart snapshot. Crab’s v1.6 line treats Dart as one of the languages it can rename, expand, and encrypt, together with the ObjC/Swift runner. The risk is not “Dart cannot be touched”; it is touching the contracts the engine and plugins still expect at runtime.

Keep channels stable

MethodChannel names, notification names, and @objc selectors that plugins call as strings must remain. Put those names in the exclusion lists (file level or language level). Inheritance-based exclusion helps when a whole plugin base class should stay readable.

Assets and the runner

Asset catalogs in the runner are visible in the IPA. If two Flutter clients share the same catalog names and AppIcon folder, they look related. Crab’s resource pass can rename and encrypt; you should still give each product its own icons and display name before you obfuscate. See Flutter iOS obfuscation.

Debug after the pass

Xcode debugging of the obfuscated binary is supported. Reproduce on a build that matches Release. If a plugin crashes only after obfuscation, read the tool’s error list first, then exclude the native class rather than the entire Dart tree. Operator detail: docs, especially exclusion settings.

For store issues that are about duplicates or leftover brands, use the 4.3 and 2.3.1 articles. For crash pipelines, use dSYM restore.

Request a trial, then archive and submit

Download App Center, choose the General or Uni-app edition, then apply for a license on the registration-code page. The docs cover the operator steps.