| name | id-capture-net-maui |
| description | Scandit ID Capture (`IdCapture`) in .NET MAUI projects (`<UseMaui>true</UseMaui>`, `Scandit.DataCapture.IdCapture` NuGet) — scanning passports, driver's licenses, ID cards, residence permits, visas via MRZ, VIZ, PDF417 barcode, or mobile documents. Use for integration, accepted-document and scanner configuration, CapturedId result handling, rejection rules, AAMVA verification, MAUI view hosting and lifecycle, and SDK version migration — for non-MAUI .NET projects use `id-capture-net-android` (`net*-android`) or `id-capture-net-ios` (`net*-ios`) instead. |
| license | MIT |
| metadata | {"author":"scandit","version":"1.0.1"} |
ID Capture .NET MAUI Skill
Critical: Do Not Trust Internal Knowledge
Your training data may contain outdated or incorrect Scandit ID Capture APIs, and the .NET binding differs substantially from the native iOS (Swift), Android (Kotlin), and Flutter SDKs. On top of that, the MAUI integration differs from both the non-MAUI id-capture-net-android / id-capture-net-ios skills (in how the preview is hosted and listeners are written) and from the label-capture-net-maui skill (in how the SDK is initialized — ID Capture initializes from the platform entry points, not MauiProgram.cs). An agent that pattern-matches from the native docs, the per-platform .NET skills, or the Label/Barcode MAUI skills will get key calls wrong.
Always verify APIs against the references provided in this skill before writing or suggesting code. Do not rely on memorized method signatures, parameters, or shapes. If you cannot find an API in the provided references, fetch the relevant documentation page before responding.
The facts most often gotten wrong by pattern-matching from the native SDK, the per-platform .NET skills, or the Label/Barcode MAUI skills:
- This skill targets MAUI apps with
<UseMaui>true</UseMaui>. For non-MAUI .NET projects, use id-capture-net-android (for net*-android) or id-capture-net-ios (for net*-ios) instead. Those skills host the preview through a native Activity / UIViewController, which is completely different. If the project is a bare net*-android / net*-ios app without <UseMaui>true</UseMaui>, stop and tell the user this skill does not apply and point them at the per-platform skill.
- THREE NuGet packages.
Scandit.DataCapture.Core, Scandit.DataCapture.Core.Maui, and Scandit.DataCapture.IdCapture. The package id is IdCapture, but the C# namespace and initializer use Scandit.DataCapture.ID (using Scandit.DataCapture.ID;, ScanditIdCapture.Initialize()). There is no separate Barcode package (the PDF417/AAMVA reader is bundled in Scandit.DataCapture.IdCapture) and no Scandit.DataCapture.IdCapture.Maui package — ID Capture reuses the generic <scandit:DataCaptureView> from Core.Maui.
- Initialization is SPLIT and platform-specific — this is the biggest MAUI-vs-Label gotcha.
ScanditIdCapture.Initialize() is called from the platform entry points, not MauiProgram.cs: in Platforms/Android/MainApplication.OnCreate() (before base.OnCreate()) and in Platforms/iOS/AppDelegate.FinishedLaunching (before base.FinishedLaunching(...)). In MauiProgram.CreateMauiApp() you only chain .UseScanditCore(configure => configure.AddDataCaptureView()) (which calls ScanditCaptureCore.Initialize() and registers the DataCaptureView MAUI handler). There is no UseScanditIdCapture() builder extension. (Contrast: label-capture-net-maui calls ScanditLabelCapture.Initialize() directly in MauiProgram.cs — do not copy that pattern here.)
IdCaptureSettings is configured with an object initializer / property sets — NOT a builder and NOT a bitmask. You set AcceptedDocuments (an IList<IIdCaptureDocument>) and Scanner (an IdCaptureScanner). The Swift/Kotlin/old supportedDocuments + IdDocumentType bitmask does not exist in .NET.
- Documents are constructed with
new, taking an IdCaptureRegion: new Passport(IdCaptureRegion.Any), new DriverLicense(IdCaptureRegion.Us), new IdCard(IdCaptureRegion.Any), new ResidencePermit(...), new HealthInsuranceCard(...), new VisaIcao(...), and new RegionSpecific(RegionSpecificSubtype.X). IdCaptureRegion values are C# PascalCase (Any, Us, EuAndSchengen, …), not the Swift/Kotlin style.
- The scanner is a wrapper:
new IdCaptureScanner(physicalDocument: <IPhysicalDocumentScanner?>, mobileDocument: <MobileDocumentScanner?>). Physical = new FullDocumentScanner() (front+back, the default choice) or new SingleSideScanner(barcode, machineReadableZone, visualInspectionZone). Mobile = new MobileDocumentScanner(iso180135, ocr). Assign it to settings.Scanner.
IdCapture is created with a FACTORY, not new: IdCapture.Create(dataCaptureContext, settings) (the constructor is private). There is also a Create(settings) overload.
- The preview is the generic
<scandit:DataCaptureView> XAML control with namespace xmlns:scandit="clr-namespace:Scandit.DataCapture.Core.UI.Maui;assembly=ScanditCaptureCoreMaui". DataCaptureContext="{Binding DataCaptureContext}" is mandatory — without it the preview renders as a black/blank camera even though the code compiles. The page's BindingContext must expose a DataCaptureContext property; x:Name alone is not enough.
- The overlay must be created AFTER the platform handler attaches. Subscribe to
dataCaptureView.HandlerChanged and create IdCaptureOverlay.Create(idCapture) (the single-arg factory) there, then dataCaptureView.AddOverlay(overlay). Creating an overlay before HandlerChanged fires fails silently — there's no native view yet. The two-arg Create(idCapture, dataCaptureView) overload expects a native iOS/Android view, not the MAUI XAML control.
- You manage the camera yourself, and
RecommendedCameraSettings is applied to the camera (not passed to GetDefaultCamera): Camera.GetCamera(CameraPosition.WorldFacing) (or Camera.GetDefaultCamera()), then camera.ApplySettingsAsync(IdCapture.RecommendedCameraSettings), then dataCaptureContext.SetFrameSourceAsync(camera), then camera.SwitchToDesiredStateAsync(FrameSourceState.On/Off) across the page lifecycle. RecommendedCameraSettings is a static property on IdCapture.
- Listeners are PLAIN C# classes implementing
IIdCaptureListener (often the view model itself). They do not derive from NSObject (that's the iOS skill) or Java.Lang.Object (that's the Android skill) — a single MAUI build serves both platforms, so no platform base class.
- Results come via
IIdCaptureListener with TWO callbacks: OnIdCaptured(IdCapture, CapturedId) and OnIdRejected(IdCapture, CapturedId?, RejectionReason) (the idiomatic C# alternative is the IdCaptured / IdRejected events). Both run on a background/arbitrary thread — set idCapture.Enabled = false while a result dialog is shown (re-enable afterwards), and dispatch UI work to the main thread via MainThread.BeginInvokeOnMainThread(...) / MainThread.InvokeOnMainThreadAsync(...) / Application.Current.Dispatcher.DispatchAsync(...) (not Android's RunOnUiThread, not iOS's DispatchQueue.MainQueue).
- Read field values via
CapturedId: top-level FullName / FirstName / LastName (string?), DateOfBirth / DateOfExpiry / DateOfIssue (a DateResult? with Day/Month/Year ints plus UtcDate / LocalDate), DocumentNumber, Nationality, Sex (raw string) / SexType (Sex enum), Age, Address, and the document via Document?.DocumentType (IdCaptureDocumentType). The richer sub-results are capturedId.Mrz / capturedId.Viz / capturedId.Barcode / capturedId.MobileDocument / capturedId.MobileDocumentOcr (note: properties are Mrz/Viz/Barcode, not MrzResult/VizResult/BarcodeResult), plus capturedId.Images and capturedId.VerificationResult.
- Document images are platform-typed.
capturedId.Images.Face / .Frame / .GetCroppedDocument(IdSide) / .GetFrame(IdSide) (and DataConsistencyResult.FrontReviewImage) return Android.Graphics.Bitmap? on Android and UIKit.UIImage? on iOS. In portable MAUI code, guard image access with #if ANDROID / #if IOS, or convert to a Stream / byte[] behind a service. The common scalar fields (name, dates, document number) are platform-neutral and need no #if.
- Verification is settings-driven on .NET — there is NO
AamvaBarcodeVerifier / DataConsistencyVerifier class. Enable checks via IdCaptureSettings flags (RejectForgedAamvaBarcodes, RejectInconsistentData, RejectNotRealIdCompliant, …) and read the outcome from capturedId.VerificationResult (DataConsistency / AamvaBarcodeVerification). See references/advanced.md.
- NFC chip reading and the deserializer API are NOT in the .NET surface. Do not reference
NfcScanner, NfcResult, CapturedId.Nfc, or IdCaptureDeserializer — they don't exist on .NET.
- Camera permission & platform config: iOS needs
NSCameraUsageDescription in Platforms/iOS/Info.plist (plus a matching MinimumOSVersion of 15.0) and SupportedOSPlatformVersion ≥ 15.0; Android needs android.permission.CAMERA (MAUI's Permissions.Camera adds it, or add it to AndroidManifest.xml) and SupportedOSPlatformVersion ≥ 24 (the MAUI template defaults to 21, which fails the build against Scandit's Android AAR with uses-sdk:minSdkVersion 21 cannot be smaller than version 24).
net10.0-android runtime gotcha — mandatory kotlinx-serialization-json override. Scandit.DataCapture.IdCapture's nuspec declares a transitive Org.Jetbrains.Kotlinx.KotlinxSerializationJson 1.7.3 — a community Gradle-sync binding (tuyen-vuduc/dotnet-binding-utils) that does not pack kotlinx-serialization-json-jvm.jar into the APK on net10.0-android36.0. The app builds cleanly, then the first scan crashes with Java.Lang.NoClassDefFoundError: Failed resolution of: Lkotlinx/serialization/json/JsonKt; from BlinkIdSdk.initializeSdk → PingManager inside the VIZ backend. Override in the .csproj with an Android-only <ItemGroup> that suppresses the community pair (both KotlinxSerializationJson and KotlinxSerializationJsonJvm need ExcludeAssets="all", or you'll get XA4215 duplicate-binding errors) and adds Microsoft's Xamarin.KotlinX.Serialization.Json 1.11.0 (which targets net10.0-android36.0 and ships a real AAR with JsonKt.class packed via the standard AndroidLibrary mechanism). See references/integration.md for the exact snippet.
Forbidden APIs (commonly hallucinated — do NOT emit these)
These compile-fail against the real .NET packages or break the MAUI integration. Use the right-hand form:
| Do NOT write | Use instead |
|---|
new IdCapture(...) / IdCapture.ForDataCaptureContext(...) | IdCapture.Create(context, settings) |
IdCaptureSettings.builder() / settings.SupportedDocuments / IdDocumentType bitmask | new IdCaptureSettings { AcceptedDocuments = [ … ], Scanner = … } |
settings.ScannerType = ... | settings.Scanner = new IdCaptureScanner(physicalDocument: …, mobileDocument: …) |
ScanditIdCapture.Initialize() in MauiProgram.cs / UseScanditIdCapture() builder extension | ScanditIdCapture.Initialize() in MainApplication.OnCreate (Android) and AppDelegate.FinishedLaunching (iOS) + .UseScanditCore(c => c.AddDataCaptureView()) in MauiProgram.cs |
IdCaptureOverlay.Create(idCapture, dataCaptureView) with the MAUI <scandit:DataCaptureView> | IdCaptureOverlay.Create(idCapture) in HandlerChanged, then dataCaptureView.AddOverlay(overlay) |
IdCaptureOverlay.NewInstance(...) | IdCaptureOverlay.Create(idCapture) |
RunOnUiThread(...) (Android) / DispatchQueue.MainQueue.DispatchAsync(...) (iOS) | MainThread.BeginInvokeOnMainThread(...) / Application.Current.Dispatcher.DispatchAsync(...) |
listener : NSObject (iOS) / : Java.Lang.Object (Android) | a plain C# class implementing IIdCaptureListener |
capturedId.MrzResult / capturedId.VizResult / capturedId.BarcodeResult | capturedId.Mrz / capturedId.Viz / capturedId.Barcode |
capturedId.IsPassport() / IsDriverLicense() / IsIdCard() | capturedId.Document?.DocumentType (IdCaptureDocumentType) or capturedId.IsRegionSpecific(subtype) |
new AamvaBarcodeVerifier(...) / new DataConsistencyVerifier(...) | settings.RejectForgedAamvaBarcodes = true / RejectInconsistentData = true + read capturedId.VerificationResult |
NfcScanner / NfcResult / capturedId.Nfc / IdCaptureDeserializer | (not available on .NET — no NFC / deserializer API) |
Scandit.DataCapture.IdCapture.Maui package / Scandit.DataCapture.Barcode package | Scandit.DataCapture.Core + Scandit.DataCapture.Core.Maui + Scandit.DataCapture.IdCapture (three packages) |
relying on the transitive Org.Jetbrains.Kotlinx.KotlinxSerializationJson 1.7.3 on net10.0-android (builds clean but crashes at runtime in BlinkIdSdk.initializeSdk → PingManager with NoClassDefFoundError: kotlinx.serialization.json.JsonKt) | add an Android-only <ItemGroup> to the .csproj with ExcludeAssets="all" on the community pair (Org.Jetbrains.Kotlinx.KotlinxSerializationJson and Org.Jetbrains.Kotlinx.KotlinxSerializationJsonJvm — both are required, otherwise XA4215) + Microsoft's Xamarin.KotlinX.Serialization.Json 1.11.0 (see references/integration.md) |
reading capturedId.Viz.DateOfBirth / .Nationality / .DocumentNumber | those VIZ fields aren't on .NET — read them from the top-level capturedId.DateOfBirth / .Nationality / .DocumentNumber |
Product Guidance
Apply these rules whenever the user is making a design decision, not just an API question.
- Accept only the documents you actually need. A narrow
AcceptedDocuments list (e.g. just new DriverLicense(IdCaptureRegion.Us)) is faster and more accurate than IdCaptureRegion.Any across every document type. Ask the user which documents and regions they expect before defaulting to "everything".
- Pick the scanner that matches the data you need.
FullDocumentScanner() reads front and back automatically (best for most ID/DL use cases). SingleSideScanner(barcode, machineReadableZone, visualInspectionZone) reads a single side from the zone(s) you enable — use it when you only need, say, the PDF417 barcode on the back of a US DL, or only the MRZ of a passport. MobileDocumentScanner is for mobile driver's licenses (mDL).
- Handle
OnIdRejected, not just OnIdCaptured. Rejections (RejectionReason.Timeout, NotAcceptedDocumentType, DocumentExpired, DocumentVoided, ForgedAamvaBarcode, InconsistentData, …) are how the user learns why a scan didn't succeed. A production integration must surface a message for them.
- Anonymize by default if you don't need every field.
IdCaptureSettings.AnonymizationMode and per-field anonymization keep regulated data (document images, sensitive fields) out of the result unless you opt in. Recommend the minimum that satisfies the use case.
- Hand off to the
data-capture-sdk skill for non-ID-Capture questions. If the user asks about another Scandit product (Barcode Capture, SparkScan, MatrixScan, Label Capture, etc.) or about choosing between products, defer to the data-capture-sdk skill instead of guessing.
Intent Routing
Based on the user's request, load the appropriate reference file before responding:
- Integrating ID Capture from scratch, configuring accepted documents and the scanner, creating the mode, wiring SDK init across
MauiProgram.cs + the platform entry points, hosting the <scandit:DataCaptureView> + IdCaptureOverlay, managing the camera lifecycle, handling captured/rejected IDs, and reading the common CapturedId fields (e.g. "add passport / driver's license scanning to my MAUI app", "read the holder's name and date of birth in MAUI", "my MAUI preview is black after adding ID Capture") → read references/integration.md and follow it.
- Tuning the scanner (single-side / mobile docs), rejection rules (expired / voided / underage / expiring / forged-AAMVA / inconsistent), data-consistency & AAMVA verification, anonymization, reading the rich sub-results (MRZ / VIZ / PDF417 barcode / mobile document / images / driving-license details), or customizing the overlay (e.g. "reject expired IDs", "only read the back barcode of a US license", "verify the AAMVA barcode and detect forgeries", "anonymize the document images", "read the full MRZ", "change the viewfinder style") → read
references/advanced.md and follow it.
API Usage Policy
Only use APIs that are explicitly documented in the Scandit references below. Do not invent or guess method signatures, parameters, property names, or imports. If unsure whether an API exists or how it is called — or if a compile error occurs — fetch the relevant reference page before responding. Do not tell the user to check the docs themselves. After answering, always include the relevant link so the user can explore further.
Never construct or guess documentation URLs. When you need a specific class or property's API page:
- First check whether the page you already fetched contains a direct hyperlink to it — topic pages link directly to relevant API symbols. Always request links alongside content in your fetch prompt.
- If no direct link was found, fetch the API index (see Full API reference in the table below), extract the actual link from it, and follow that.
URL structures can vary (e.g. an api/ui/ subdirectory) and guessing will lead to 404s.
References
Scandit publishes the .NET API reference per underlying TFM (dotnet.android and dotnet.ios). For MAUI projects both pages apply — the ID Capture API surface is identical between them; only a few platform notes differ (e.g. the document-image type, Bitmap vs UIImage).
API surface this skill covers
All classes documented with :available: dotnet.android and/or :available: dotnet.ios in the official RST docs (docs/source/id-capture/api/**) are addressed in the references. The .NET managed binding is shared across iOS and Android — the API surface is identical; only the platform plumbing (init location, camera permission, document-image type) differs, and MAUI adds the XAML hosting layer. ID Capture is available on dotnet.android / dotnet.ios since 6.16, but the modern document/scanner API (AcceptedDocuments, IdCaptureScanner, FullDocumentScanner) landed at 7.0, the rejection flags at 7.6, and the verification result model at 8.0 — so this skill targets a current 8.x stable.
IdCapture (Scandit.DataCapture.ID.Capture) — static Create(DataCaptureContext?, IdCaptureSettings) / Create(IdCaptureSettings); Context (get); Enabled (get/set — false while a result is shown, true to scan); ApplySettings(IdCaptureSettings); AddListener / RemoveListener(IIdCaptureListener); static RecommendedCameraSettings (property); Feedback (get/set); Reset(); event EventHandler<IdCapturedEventArgs> IdCaptured; event EventHandler<IdRejectedEventArgs> IdRejected; Dispose().
IdCaptureSettings — new IdCaptureSettings() then set properties: Scanner (IdCaptureScanner), AcceptedDocuments / RejectedDocuments (IList<IIdCaptureDocument>), RejectVoidedIds, RejectExpiredIds, RejectIdsExpiringIn (Duration?), RejectNotRealIdCompliant, RejectForgedAamvaBarcodes, RejectInconsistentData, RejectHolderBelowAge (int?), DecodeBackOfEuropeanDrivingLicense, AnonymizationMode (IdAnonymizationMode), AnonymizeDefaultFields; methods AddAnonymizedField(doc, IdFieldType), Get/SetShouldPassImageTypeToResult(IdImageType, bool), SetProperty/GetProperty. No builder.
IdCaptureScanner — new IdCaptureScanner(IPhysicalDocumentScanner? physicalDocument, MobileDocumentScanner? mobileDocument); PhysicalDocument / MobileDocument (get).
- Physical scanners (
IPhysicalDocumentScanner): new FullDocumentScanner(); new SingleSideScanner(bool barcode, bool machineReadableZone, bool visualInspectionZone) (props Barcode/MachineReadableZone/VisualInspectionZone).
MobileDocumentScanner — new MobileDocumentScanner(bool iso180135, bool ocr); Ocr (get). (The ISO getter is bound as GetIso180135 — rarely read.)
- Documents (
IIdCaptureDocument, props Region + DocumentType): new IdCard(IdCaptureRegion), new DriverLicense(IdCaptureRegion), new Passport(IdCaptureRegion), new VisaIcao(IdCaptureRegion), new ResidencePermit(IdCaptureRegion), new HealthInsuranceCard(IdCaptureRegion), new RegionSpecific(RegionSpecificSubtype) (also exposes Subtype).
IdCaptureRegion enum — Any, EuAndSchengen, and ~250 PascalCase country values (Us, Uk, Uae, Germany, …).
IIdCaptureListener — OnIdCaptured(IdCapture, CapturedId), OnIdRejected(IdCapture, CapturedId?, RejectionReason). Implementations are plain C# classes in MAUI (no NSObject / Java.Lang.Object base). IdCapturedEventArgs (IdCapture, CapturedId) / IdRejectedEventArgs (IdCapture, CapturedId?, Reason).
CapturedId (Scandit.DataCapture.ID.Data) — FirstName/LastName/FullName, Sex/SexType, DateOfBirth/DateOfExpiry/DateOfIssue (DateResult?), Nationality/NationalityISO, Address, Age (int?), Expired (bool?), Document (IIdCaptureDocument?), IssuingCountry/IssuingCountryIso, DocumentNumber/DocumentAdditionalNumber, Barcode/Mrz/Viz/MobileDocument/MobileDocumentOcr (sub-results), Images (IdImages), VerificationResult, UsRealIdStatus, CitizenPassport, AnonymizedFields; methods IsRegionSpecific(subtype), IsAnonymized(field).
DateResult — Day/Month/Year (int), LocalDate/UtcDate (DateTime).
- Sub-results:
MrzResult, VizResult, BarcodeResult (large AAMVA surface), MobileDocumentResult, MobileDocumentOcrResult, DrivingLicenseDetails / DrivingLicenseCategory, ProfessionalDrivingPermit, VehicleRestriction — see references/advanced.md and the docs for full field lists.
IdImages — Face, Frame, GetCroppedDocument(IdSide), GetFrame(IdSide) (each Android.Graphics.Bitmap? on Android / UIKit.UIImage? on iOS — guard with #if ANDROID/#if IOS in portable MAUI code).
IdCaptureOverlay (Scandit.DataCapture.ID.UI.Overlay) — static Create(IdCapture) (use this in MAUI) / Create(IdCapture, DataCaptureView?) (native view only); IdLayoutStyle (Rounded/Square), IdLayoutLineStyle (Bold/Light), TextHintPosition, ShowTextHints, CapturedBrush/LocalizedBrush/RejectedBrush + static Default*Brush; SetFrontSideTextHint/SetBackSideTextHint.
IdCaptureFeedback — static DefaultFeedback (property); IdCaptured / IdRejected (Feedback).
- Verification (
Scandit.DataCapture.ID.Verification) — VerificationResult (DataConsistency / AamvaBarcodeVerification), DataConsistencyResult (AllChecksPassed, FailedChecks/PassedChecks/SkippedChecks as DataConsistencyCheck flags, FrontReviewImage — Bitmap?/UIImage?), AamvaBarcodeVerificationResult (AllChecksPassed, Status), AamvaBarcodeVerificationStatus (Authentic/LikelyForged/Forged). No verifier classes — settings-driven.
- Enums:
RejectionReason, IdCaptureDocumentType, RegionSpecificSubtype, IdSide, CapturedSides, Sex, UsRealIdStatus, IdAnonymizationMode, IdImageType, IdFieldType. Duration — new Duration(days, months, years).
- MAUI-specific glue:
ScanditIdCapture.Initialize() in MainApplication.OnCreate / AppDelegate.FinishedLaunching, MauiAppBuilder.UseScanditCore(configure => configure.AddDataCaptureView()), <scandit:DataCaptureView> XAML control + DataCaptureContext="{Binding …}", dataCaptureView.HandlerChanged, dataCaptureView.AddOverlay(overlay), MAUI Permissions.Camera, MainThread.BeginInvokeOnMainThread. (DI helpers builder.Services.AddDataCaptureContext(licenseKey) / AddCamera(...) from Core.Maui are also available as an alternative to a manual singleton — see references/integration.md.)
Documented for other platforms but NOT on .NET — do not use
- NFC (
NfcScanner, NfcResult, NfcScannerListener, CapturedId.Nfc) — native iOS/Android only; not in the .NET surface.
- Deserializer (
IdCaptureDeserializer, IIdCaptureDeserializerListener) — not on .NET.
- Standalone
AamvaBarcodeVerifier — web/Xamarin only; on .NET use RejectForgedAamvaBarcodes + CapturedId.VerificationResult.
CapturedId.VisaDetails / VisaDetails / ApplicationStatus, PassportType, MobileDocumentDataElement / MobileDocumentScanner.ElementsToRetain, LocalizedOnlyId, BarcodeMetadata, IdCaptureTrigger — not available on .NET.
CapturedId.IsIdCard() / IsPassport() / IsDriverLicense() / … helper methods — not on .NET; use Document?.DocumentType.
- Most name/identity fields on
VizResult (Sex, DateOfBirth, Nationality, Address, DocumentNumber, DateOfExpiry, DateOfIssue) — not on .NET; read them from the top-level CapturedId.
MAUI vs per-platform / Label-MAUI differences (do not cross-pollinate)
- Packages: ID-Capture MAUI = 3 packages (
Core, Core.Maui, IdCapture), no IdCapture.Maui, no Barcode. (The per-platform skills use 2 packages — Core + IdCapture — with no Core.Maui.)
- Init: ID-Capture MAUI =
ScanditIdCapture.Initialize() in the platform entry points (MainApplication.OnCreate / AppDelegate.FinishedLaunching) + .UseScanditCore(c => c.AddDataCaptureView()) in MauiProgram.cs. (Label-MAUI calls ScanditLabelCapture.Initialize() directly in MauiProgram.cs — different. The per-platform skills call ScanditCaptureCore.Initialize() + ScanditIdCapture.Initialize() in MainApplication/AppDelegate.)
- Hosting: MAUI
<scandit:DataCaptureView> XAML + overlay in HandlerChanged (single-arg IdCaptureOverlay.Create(idCapture) + AddOverlay). (iOS DataCaptureView.Create(context, CGRect) + AddSubview + two-arg overlay; Android DataCaptureView.Create(context) + container.AddView + two-arg overlay.)
- Listener base class: MAUI plain class; iOS
NSObject; Android Java.Lang.Object.
- Main-thread dispatch: MAUI
MainThread.BeginInvokeOnMainThread / Application.Current.Dispatcher.DispatchAsync; iOS DispatchQueue.MainQueue / InvokeOnMainThread; Android RunOnUiThread.
- Document images: MAUI is platform-typed (
Bitmap? on Android, UIImage? on iOS) and needs #if ANDROID/#if IOS; the per-platform skills each have a single concrete type.