Przejdź do treści stopki
PORóWNAJ Z INNYMI KOMPONENTAMI

BarcodeScanning.MAUI vs IronBarcode: Porównanie bibliotek kodów kreskowych C#

BarcodeScanning.Native.Maui to wtyczka do aparatu, a nie biblioteka kodów kreskowych. Jeśli Twoja aplikacja działa w systemie Windows, przetwarza przesłane pliki lub odczytuje BarCodes z plików PDF, to jest to niewłaściwe narzędzie — a plik README nie wyjaśnia tego wprost na początku. Strona pakietu opisuje go jako "bibliotekę skanowania BARCODE dla .NET MAUI", co jest technicznie poprawne, ale pomija kluczowe ograniczenie: jest to kontrolka CameraView, która wyzwala zdarzenie, gdy BARCODE znajdzie się w kadrze kamery na żywo. To jest pełny zestaw funkcji. W niniejszym porównaniu przeanalizowano różnice architektoniczne między biblioteką do sterowania kamerą a w pełni funkcjonalnym zestawem SDK do obsługi kodów kreskowych, pomagając zespołom zrozumieć, gdzie każde z tych narzędzi sprawdza się najlepiej, a gdzie ma swoje ograniczenia.

Zrozumienie BarcodeScanning.MAUI

BarCodeScanning.Native.Maui łączy natywne interfejsy API do wykrywania kodów kreskowych za pomocą aparatu w systemach iOS (framework Apple Vision) i Android (ML Kit) w kontrolkę MAUI CameraView. Programista umieszcza kontrolkę na stronie XAML, podłącza procedurę obsługi zdarzenia, a biblioteka wyzwala to zdarzenie za każdym razem, gdy w podglądzie na żywo z kamery wykryty zostanie BARCODE. Cały model interakcji opiera się na zasadzie "camera-in, event-out" — nie ma innej ścieżki.

Biblioteka jest oprogramowaniem typu open source i jest bezpłatna na licencji MIT. Cel projektowy jest wąski i jasno określony: zapewnienie wykrywania kodów BarCode na żywo z kamery dla aplikacji MAUI na iOS i Androida przy minimalnej możliwej powierzchni API. Cel ten osiąga poprzez delegowanie zadań do natywnych interfejsów API platformy, zamiast wdrażania własnego silnika dekodowania kodów kreskowych.

Kluczowe cechy architektury BarcodeScanning.Native.Maui:

  • Wprowadzanie wyłącznie z kamery: Biblioteka akceptuje wyłącznie klatki z kamery na żywo. W publicznym API nie ma nigdzie metod ReadFromFile(), ReadFromBytes(), ReadFromStream() ani ReadFromPdf().
  • Tylko iOS i Android: Biblioteka obsługuje natywne interfejsy API specyficzne dla iOS (framework Vision) i Androida (ML Kit). W MAUI nie ma implementacji dla systemu Windows i nie jest ona planowana.
  • Brak możliwości generowania: BarcodeScanning.Native.Maui odczytuje kody kreskowe z klatek z kamery. Nie może generować BARCODE-ów w żadnym formacie.
  • Nieścisłość dotycząca kodów UPC-A w systemie iOS: framework Apple Vision zwraca 13 cyfr dla kodów kreskowych UPC-A (dodając zerowy prefiks, aby dopasować się do kodowania EAN-13). Biblioteka przekazuje tę surową wartość bez korekty, co wymaga ręcznego obejścia w kodzie aplikacji.
  • Znany problem z niezawodnością PDF417: Własny system śledzenia błędów biblioteki na GitHubie dokumentuje skanowanie PDF417 jako "bardzo problematyczne — większość skanów nigdy nie dochodzi do skutku", co stanowi bezpośrednią przeszkodę w przypadku etykiet wysyłkowych, praw jazdy i kart pokładowych.
  • Minimalna powierzchnia publiczna: Publiczny interfejs API składa się z CameraView, OnDetectionFinished, OnDetectionFinishedEventArgs oraz BarcodeResult wraz z DisplayValue i BarcodeFormat. To wszystko, z czym współdziała kod aplikacji.
  • Licencja MIT, bezpłatna: Korzystanie z biblioteki jest bezpłatne i nie wiąże się z żadnymi opłatami licencyjnymi.

Wzór skanowania na żywo z kamery

Cały wzorzec API BarcodeScanning.Native.Maui to kontrolka XAML połączona z procedurą obsługi zdarzeń w języku C#:


<scanner:CameraView x:Name="CameraView"
                    OnDetectionFinished="OnBarcodeDetected"
                    CameraEnabled="True"
                    BarcodeFormats="All" />

<scanner:CameraView x:Name="CameraView"
                    OnDetectionFinished="OnBarcodeDetected"
                    CameraEnabled="True"
                    BarcodeFormats="All" />
XML
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArgs e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode != null)
        ResultLabel.Text = barcode.DisplayValue;
}
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArgs e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode != null)
        ResultLabel.Text = barcode.DisplayValue;
}
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArgs)
    Dim barcode = e.BarcodeResults.FirstOrDefault()
    If barcode IsNot Nothing Then
        ResultLabel.Text = barcode.DisplayValue
    End If
End Sub
$vbLabelText   $csharpLabel

Ten element sterujący zapewnia użytkownikom podgląd w czasie rzeczywistym osadzony na stronie MAUI. Wykrywanie BarCode działa w sposób ciągły, gdy kamera jest aktywna. Interfejs użytkownika jest naprawdę dobry w aplikacjach konsumenckich, gdzie podstawową interakcją jest "wyceluj i zeskanuj". Ograniczeniem jest to, że jest to jedyna interakcja obsługiwana przez bibliotekę — w momencie, gdy wymagania wykraczają poza wykrywanie na żywo z kamery w systemie iOS lub Android, BarcodeScanning.Native.Maui nie ma nic do zaoferowania.

Zrozumienie IronBarcode

IronBarcode to komercyjna biblioteka do odczytu i generowania kodów kreskowych dla platformy .NET, która działa na danych wejściowych, a nie na strumieniach z kamery. Odczytuje kody kreskowe z plików graficznych, tablic bajtów, strumieni i dokumentów PDF. W MAUI integruje się z aparatem systemówym poprzez MediaPicker — ten sam standardowy interfejs API MAUI, którego aplikacje używają do wyboru zdjęć — przechwytując zdjęcie, a następnie przetwarzając uzyskany obraz jako statyczne dane wejściowe.

IronBarcode wykorzystuje własny silnik dekodowania kodów kreskowych zamiast korzystać z natywnych interfejsów API specyficznych dla danej platformy. Oznacza to, że to samo wywołanie BarcodeReader.Read() działa spójnie na systemach iOS, Android, Windows, macOS, ASP.NET oraz w procesach serwerowych działających w tle. Biblioteka udostępnia również pełny interfejs API do generowania BARCODE-ów poprzez BarcodeWriter i QRCodeWriter.

Kluczowe cechy IronBarcode:

  • Statyczne API oparte na plikach: BarcodeReader.Read() akceptuje ścieżkę do pliku, tablicę bajtów, strumień lub plik PDF — dowolne statyczne źródło danych.
  • Pełna obsługa platform: obsługiwane są wszystkie platformy docelowe MAUI: iOS, Android, Windows i macOS. Ten sam kod działa na wszystkich czterech platformach bez rozgałęzień specyficznych dla danej platformy.
  • Generowanie barcode'ów: BarcodeWriter.CreateBarcode() i QRCodeWriter.CreateQrCode() generują formaty Code128, QR, DataMatrix i inne jako pliki graficzne lub tablice bajtów.
  • Obsługa plików PDF: BarCodes osadzone w dokumentach PDF są odczytywane bezpośrednio, bez pośredniego etapu wyodrębniania obrazu.
  • Dokładne dekodowanie UPC-A: Zwraca prawidłową 12-cyfrową wartość UPC-A bez konieczności ręcznego stosowania obejść normalizacyjnych.
  • Licencje komercyjne: Lite 749 USD, Plus 1499 USD, Professional License 2999 USD, Unlimited License 5999 USD — licencje wieczyste z rocznym wsparciem technicznym.
  • Wdrożenie po stronie serwera: Działa w środowisku ASP.NET, Azure Functions, kontenerach Docker oraz AWS Lambda bez zależności platformy od fizycznej kamery.

Porównanie funkcji

Poniższa tabela przedstawia podstawowe różnice między BarcodeScanning.Native.Maui a IronBarcode:

Funkcja BarcodeScanning.MAUI IronBarcode
Główny cel Wykrywanie BarCode na żywo za pomocą kamery Odczytywanie i generowanie BarCode'ów z dowolnego źródła danych
Źródła danych wejściowych Tylko klatki z kamery na żywo Pliki, tablice bajtów, strumienie, pliki PDF
Obsługa platform Tylko iOS i Android MAUI iOS, Android, Windows, macOS MAUI + strona serwerowa
Generowanie kodów kreskowych Nie Tak — BarcodeWriter + QRCodeWriter
Model licencji MIT (bezpłatne, open source) Komercyjne — od wersji Lite za 749 USD do wersji Unlimited za 5999 USD
Po stronie serwera / ASP.NET Nie Tak

Szczegółowe porównanie funkcji

Funkcja BarcodeScanning.MAUI IronBarcode
Czytanie
Odczytywanie klatek z kamery na żywo Tak — kontrolka CameraView Nie (użyj MediaPicker do przechwycenia, a następnie odczytania)
Wizjer aparatu w aplikacji Tak — w czasie rzeczywistym, w sposób ciągły Nie — korzysta z interfejsu użytkownika aparatu systemówego za pośrednictwem MediaPicker
Odczyt z pliku graficznego Nie Tak — BarcodeReader.Read(path)
Odczyt z tablicy bajtów Nie Tak — BarcodeReader.Read(bytes)
Odczyt z strumienia Nie Tak — BarcodeReader.Read(stream)
Czytaj z pliku PDF Nie Tak — BarcodeReader.Read(pdf)
Wykrywanie wielu kodów BarCode Tak (wiele na ramkę poprzez e.BarcodeResults) Tak (opcja ExpectMultipleBarcodes)
Kontrola prędkości czytania None ReadingSpeed.Balanced / Faster / Slower
Dokładność UPC-A w systemie iOS Zwraca 13 cyfr (błąd), wymaga ręcznej normalizacji Zwraca poprawny 12-cyfrowy kod UPC-A
Niezawodność PDF417 "Większość skanów nigdy nie ma miejsca" (zgłoszenia na GitHubie) Obsługiwane
Generacja
Generowanie BarCode'ów Nie Tak — BarcodeWriter.CreateBarcode()
Generowanie kodów QR Nie Tak — QRCodeWriter.CreateQrCode()
Wynik w formacie PNG / tablica bajtów Nie Tak
Platforma
iOS MAUI Tak Tak
Android MAUI Tak Tak
Windows MAUI Nie Tak
macOS MAUI Brak dokumentacji Tak
ASP.NET / strona serwera Nie Tak
Docker / Azure / AWS Lambda Nie Tak
Obsługa platformy .NET Framework Nie (tylko MAUI) Tak — .NET Framework 4.6.2+
Licencjonowanie
Rodzaj licencji MIT (open source) Komercjalna licencja wieczysta
Koszt Bezpłatne Lite 749 USD, Plus 1499 USD, Professional 2999 USD, Unlimited 5999 USD
Tryb oceny Nie dotyczy Dostępna bezpłatna wersja próbna

Architektura: Sterowanie kamerą a API przetwarzania plików

Najbardziej zasadniczą różnicą między tymi dwiema bibliotekami jest model wejściowy. BarcodeScanning.Native.Maui zostało zaprojektowane z myślą o ciągłym strumieniu obrazu z kamery; IronBarcode został zaprojektowany z myślą o dyskretnych danych wejściowych. Nie są to konkurencyjne implementacje tego samego pomysłu — są to różne wybory architektoniczne dla różnych przypadków użycia.

Podejście BarcodeScanning.MAUI

BarcodeScanning.Native.Maui wykorzystuje natywny proces wykrywania aparatu na każdej platformie. W systemie Android ML Kit przetwarza klatki. W systemie iOS klatki są przetwarzane przez framework Apple Vision. Biblioteka udostępnia to jako kontrolkę MAUI CameraView z wydarzeniem OnDetectionFinished. Kod aplikacji nigdy nie obsługuje bezpośrednio bajtów obrazu — obsługuje jedynie wykryte wartości BARCODE, które pojawiają się w zdarzeniu.

private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArgs e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode != null)
        ResultLabel.Text = barcode.DisplayValue;
}
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArgs e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode != null)
        ResultLabel.Text = barcode.DisplayValue;
}
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArgs)
    Dim barcode = e.BarcodeResults.FirstOrDefault()
    If barcode IsNot Nothing Then
        ResultLabel.Text = barcode.DisplayValue
    End If
End Sub
$vbLabelText   $csharpLabel

Konsekwencją tego projektu jest brak innego punktu wejścia. Kamera nie jest opcjonalna — jest to jedyne źródło danych, jakie biblioteka rozpoznaje. Serwer, plik, dokument PDF, komputer z systemem Windows — żadne z tych urządzeń nie posiada kamery w rozumieniu tej biblioteki.

Podejście IronBarcode

IronBarcode odbiera dane obrazu poprzez swoją metodę statyczną BarcodeReader.Read(). Użytkownik dostarcza dane — z dowolnego źródła — a biblioteka je dekoduje. W MAUI dane pochodzą z MediaPicker; na serwerze, pochodzi z przesłania formularza; w aplikacji desktopowej pochodzi z okna dialogowego plików.

// IronBarcode in MAUI: capture a photo, then read barcodes from it
// NuGet: dotnet add package IronBarcode
using IronBarCode;

private async void ScanBarcodeButton_Clicked(object sender, EventArgs e)
{
    var photo = await MediaPicker.CapturePhotoAsync();
    if (photo == null) return;

    using var stream = await photo.OpenReadAsync();
    using var ms = new MemoryStream();
    await stream.CopyToAsync(ms);

    var results = BarcodeReader.Read(ms.ToArray());
    foreach (var result in results)
        ResultLabel.Text = result.Value;
}
// IronBarcode in MAUI: capture a photo, then read barcodes from it
// NuGet: dotnet add package IronBarcode
using IronBarCode;

private async void ScanBarcodeButton_Clicked(object sender, EventArgs e)
{
    var photo = await MediaPicker.CapturePhotoAsync();
    if (photo == null) return;

    using var stream = await photo.OpenReadAsync();
    using var ms = new MemoryStream();
    await stream.CopyToAsync(ms);

    var results = BarcodeReader.Read(ms.ToArray());
    foreach (var result in results)
        ResultLabel.Text = result.Value;
}
Imports IronBarCode
Imports System.IO

Private Async Sub ScanBarcodeButton_Clicked(sender As Object, e As EventArgs)
    Dim photo = Await MediaPicker.CapturePhotoAsync()
    If photo Is Nothing Then Return

    Using stream = Await photo.OpenReadAsync()
        Using ms As New MemoryStream()
            Await stream.CopyToAsync(ms)

            Dim results = BarcodeReader.Read(ms.ToArray())
            For Each result In results
                ResultLabel.Text = result.Value
            Next
        End Using
    End Using
End Sub
$vbLabelText   $csharpLabel

Ten kod działa identycznie na systemach iOS, Android i Windows MAUI. W przypadku użycia po stronie serwera ta sama metoda BarcodeReader.Read() akceptuje tablicę bajtów przesłanego pliku lub ścieżkę do pliku PDF. Dokumentacja IronBarcode obejmuje wszystkie obsługiwane typy danych wejściowych.

Obsługa platform i systemu Windows

Obsługa platform jest obszarem, w którym ograniczenia strukturalne BarcodeScanning.Native.Maui stają się konkretne dla zespołów tworzących aplikacje MAUI.

Podejście BarcodeScanning.MAUI

BarcodeScanning.Native.Maui nie obsługuje środowiska docelowego Windows w MAUI. Nie jest to tymczasowa luka — jest to strukturalna konsekwencja architektury biblioteki. Biblioteka obsługuje natywne interfejsy API specyficzne dla systemów iOS (framework Vision) i Android (ML Kit). System Windows nie posiada żadnego z nich. Zespoły tworzące aplikację MAUI przeznaczoną dla systemów iOS, Android i Windows — standardowy scenariusz wielopłatformowy — nie mogą używać BarcodeScanning.Native.Maui jako rozwiązania do skanowania kodów kreskowych dla wszystkich trzech platform. Muszą oni albo osobno zaimplementować kod specyficzny dla platformy Windows, albo całkowicie zastąpić bibliotekę.

Podejście IronBarcode

Funkcja BarcodeReader.Read() w IronBarcode działa na platformach Windows, iOS, Android i macOS MAUI bez konieczności stosowania kodu specyficznego dla danej platformy. Nie ma bloków #if WINDOWS, nie ma warunkówego ładowania zależności i nie są potrzebne implementacje stubów. W przypadku plików i dokumentów PDF wzór jest również spójny:

using IronBarCode;

// Read barcodes from a file the user selected
var file = await FilePicker.PickAsync();
if (file != null)
{
    var results = BarcodeReader.Read(file.FullPath);
    foreach (var result in results)
        Console.WriteLine($"{result.Format}: {result.Value}");
}

// Read barcodes directly from a PDF — no image extraction step needed
var pdfResults = BarcodeReader.Read("shipment-manifest.pdf");
using IronBarCode;

// Read barcodes from a file the user selected
var file = await FilePicker.PickAsync();
if (file != null)
{
    var results = BarcodeReader.Read(file.FullPath);
    foreach (var result in results)
        Console.WriteLine($"{result.Format}: {result.Value}");
}

// Read barcodes directly from a PDF — no image extraction step needed
var pdfResults = BarcodeReader.Read("shipment-manifest.pdf");
Imports IronBarCode

' Read barcodes from a file the user selected
Dim file = Await FilePicker.PickAsync()
If file IsNot Nothing Then
    Dim results = BarcodeReader.Read(file.FullPath)
    For Each result In results
        Console.WriteLine($"{result.Format}: {result.Value}")
    Next
End If

' Read barcodes directly from a PDF — no image extraction step needed
Dim pdfResults = BarcodeReader.Read("shipment-manifest.pdf")
$vbLabelText   $csharpLabel

Przewodnik integracji IronBarcode MAUI zawiera kompletne instrukcje konfiguracji dla wszystkich celów MAUI. IronBarcode obsługuje również wdrażanie po stronie serwera w środowiskach ASP.NET, Docker, Azure Functions i AWS Lambda, gdzie BarcodeScanning.Native.Maui nie ma żadnej ścieżki.

Dokładność odczytu BarCode: UPC-A i PDF417

Dwie konkretne kwestie dotyczące dokładności formatowania w BarcodeScanning.Native.Maui mają bezpośrednie konsekwencje dla aplikacji produkcyjnych.

Podejście BarcodeScanning.MAUI

W systemie iOS funkcja wykrywania BarcodeScanning.Native.Maui (Apple Vision) zwraca 13 cyfr dla kodów kreskowych UPC-A. UPC-A to format 12-cyfrowy; dodatkowa zerowa cyfra na początku odpowiada kodowaniu EAN-13. Biblioteka przekazuje tę surową wartość bez korekty. Aplikacje, które przechowują wartości UPC-A w bazie danych, mogą gromadzić rekordy z niepotrzebnym zerem na początku.

Opisane obejście wymaga sprawdzenia formatu i przycięcia wartości:

// Workaround required for iOS UPC-A — strip the leading zero manually
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArgs e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode == null) return;

    var value = barcode.DisplayValue;
    if (barcode.BarcodeFormat == BarcodeFormat.UPC_A && value.Length == 13)
        value = value.Substring(1); // strip Apple's prepended leading zero

    ProcessBarcode(value);
}
// Workaround required for iOS UPC-A — strip the leading zero manually
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArgs e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode == null) return;

    var value = barcode.DisplayValue;
    if (barcode.BarcodeFormat == BarcodeFormat.UPC_A && value.Length == 13)
        value = value.Substring(1); // strip Apple's prepended leading zero

    ProcessBarcode(value);
}
' Workaround required for iOS UPC-A — strip the leading zero manually
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArgs)
    Dim barcode = e.BarcodeResults.FirstOrDefault()
    If barcode Is Nothing Then Return

    Dim value = barcode.DisplayValue
    If barcode.BarcodeFormat = BarcodeFormat.UPC_A AndAlso value.Length = 13 Then
        value = value.Substring(1) ' strip Apple's prepended leading zero
    End If

    ProcessBarcode(value)
End Sub
$vbLabelText   $csharpLabel

To obejście w sposób niezauważalny powoduje uszkodzenie barcode'ów EAN-13 zaczynających się od 0, jeśli pominięto sprawdzanie formatu. PDF417 jest oddzielnie udokumentówany w zgłoszeniach GitHub jako "bardzo problematyczny — większość skanów nigdy nie dochodzi do skutku", co ma wpływ na etykiety wysyłkowe, prawa jazdy i karty pokładowe.

Podejście IronBarcode

IronBarcode zwraca prawidłową 12-cyfrową wartość UPC-A bez konieczności ręcznej normalizacji. PDF417 jest obsługiwanym formatem, który odczytuje się niezawodnie. Funkcja generowania jest również dostępna za pośrednictwem API IronBarcode:

using IronBarCode;

// Generate a QR code
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .SaveAsPng("qr.png");

// Generate a Code128 barcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");
using IronBarCode;

// Generate a QR code
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .SaveAsPng("qr.png");

// Generate a Code128 barcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");
Imports IronBarCode

' Generate a QR code
QRCodeWriter.CreateQrCode("https://example.com", 500) _
    .SaveAsPng("qr.png")

' Generate a Code128 barcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ResizeTo(400, 100) _
    .SaveAsPng("barcode.png")
$vbLabelText   $csharpLabel

W aplikacjach, w których dokładność danych kodów kreskowych ma bezpośredni wpływ na wyszukiwanie zapasów, transakcje w punktach sprzedaży lub integrację łańcucha dostaw, poprawna obsługa formatów przez IronBarcode eliminuje kategorię błędów produkcyjnych, które BarcodeScanning.Native.Maui pozostawia w kodzie aplikacji. Dokumentacja dotycząca odczytu kodów kreskowych IronBarcode szczegółowo opisuje zachowanie w zależności od formatu.

Przewodnik po mapowaniu API

BarcodeScanning.Native.Maui IronBarcode
CameraView Kontrolka XAML Brak kontroli kamery — użyj MediaPicker.CapturePhotoAsync() do przechwycenia
OnDetectionFinished wydarzenie BarcodeReader.Read(imageBytes)
e.BarcodeResults Wartość zwracana BarcodeReader.Read() (IEnumerable)
e.BarcodeResults.FirstOrDefault() results.FirstOrDefault()
barcode.DisplayValue result.Value
barcode.BarcodeFormat result.Format
BarcodeFormats="All" Wykrywane automatycznie — nie wymaga konfiguracji dla wielu formatów
CameraEnabled="True" MediaPicker.CapturePhotoAsync() call
Tylko iOS + Android iOS, Android, Windows, macOS (MAUI) + ASP.NET, komputery stacjonarne
Tylko ramki aparatu Pliki, tablice bajtów, strumienie, pliki PDF
Brak pliku/API PDF BarcodeReader.Read(path) — akceptuje pliki graficzne i PDF
Brak Windows MAUI Pełna obsługa Windows MAUI
Brak API generowania BarcodeWriter.CreateBarcode() + QRCodeWriter.CreateQrCode()

Kiedy zespoły rozważają przejście z BarcodeScanning.MAUI na IronBarcode

Dodano cel Windows MAUI do kompilacji

Aplikacje MAUI zazwyczaj powstają z myślą o systemach iOS i Android, a później, w miarę dojrzewania aplikacji lub rozszerzania się wymagań dotyczących dystrybucji w Enterprise, dodaje się do nich system Windows. Po dodaniu platformy docelowej Windows, BarcodeScanning.Native.Maui staje się natychmiastową przeszkodą — nie ma implementacji dla Windows i nie ma obejścia w bibliotece. Zespoły w tej sytuacji muszą albo utrzymać oddzielną implementację BarCode dla systemu Windows przy użyciu innej biblioteki, albo przenieść całą warstwę BarCode do biblioteki, która działa spójnie we wszystkich środowiskach docelowych MAUI. Druga ścieżka jest prostsza pod względem operacyjnym i eliminuje nakłady związane z utrzymaniem rozgałęzień specyficznych dla platformy.

Dodano wymagania dotyczące przesyłania plików lub przetwarzania plików PDF

Aplikacje mobilne często zaczynają od skanowania na żywo za pomocą kamery jako jedynej metody wprowadzania danych, a później rozszerzają się, aby akceptować przesłane obrazy lub dokumenty. Gdy użytkownik musi zeskanować kod kreskowy ze zdjęcia w swojej galerii, z obrazu otrzymanego pocztą elektroniczną lub z pliku PDF zawierającego listy przewozowe lub karty pokładowe, BarcodeScanning.Native.Maui nie ma do zaoferowania żadnej ścieżki kodu. Zespoły, które osiągają tę granicę wymagań, stają przed wyborem: dodać drugą bibliotekę kodów kreskowych obok BarcodeScanning.Native.Maui dla danych wejściowych w postaci plików i PDF-ów lub przejść na pojedynczą bibliotekę obsługującą wszystkie typy danych wejściowych. Zarządzanie dwoma pakietami kodów kreskowych z różnymi interfejsami API, różnymi typami wyników i różnymi tabelami obsługi formatów powoduje długoterminową złożoność, której pozwala uniknąć rozwiązanie oparte na jednym pakiecie.

Wprowadzenie przetwarzania BarCodes po stronie serwera

Aplikacje skanujące kody kreskowe na urządzeniach mobilnych często wykorzystują komponent po stronie serwera — punkt końcowy API ASP.NET, który weryfikuje kody kreskowe, zadanie w tle przetwarzające pliki PDF lub funkcję w chmurze, która wyodrębnia numery śledzenia z przesłanych dokumentów. BarcodeScanning.Native.Maui to biblioteka elementów interfejsu użytkownika, która opiera się na kontekście sprzętowym kamery; nie może działać w procesie serwera. Zespół, który potrzebuje tej samej logiki odczytu BarCode'ów zarówno na urządzeniach mobilnych, jak i na serwerze, musi użyć innej biblioteki po stronie serwera. Kiedy pojawia się wymóg po stronie serwera, zespoły często oceniają, czy konsolidacja do jednej biblioteki, która obejmuje zarówno urządzenia mobilne, jak i serwer, jest lepszym rozwiązaniem niż utrzymywanie dwóch oddzielnych implementacji.

Dokładność danych UPC-A staje się problemem produkcyjnym

Zachowanie 13-cyfrowego kodu UPC-A w systemie iOS nie zawsze jest wykrywane podczas tworzenia oprogramowania. BARCODE-y UPC-A skanowane podczas tworzenia mogą wydawać się działać poprawnie, ale w bazie danych pojawia się zerowy prefiks wprowadzony przez framework Apple Vision. Zespoły, które wykrywają 13-cyfrowe wartości UPC-A w rejestrach zapasów, systemach kasowych lub integracjach łańcucha dostaw, borykają się nie tylko z problemem kodowania, ale także z problemem korekty danych. Rozwiązanie opisane w zgłoszeniach na GitHubie w sekcji BarcodeScanning.Native.Maui koryguje nowe skany, ale nie naprawia danych historycznych. Kiedy zakres problemu związanego z jakością danych staje się jasny, przejście na bibliotekę, która zwraca poprawne wartości UPC-A bez normalizacji na poziomie aplikacji, jest często czystszym rozwiązaniem w perspektywie długoterminowej.

Wymagane skanowanie dokumentów PDF417

PDF417 to format BARCODE stosowany w etykietach wysyłkowych, prawach jazdy i kartach pokładowych w Ameryce Północnej. Są to typowe cele skanowania w aplikacjach logistycznych, do weryfikacji tożsamości i aplikacjach turystycznych. System śledzenia błędów BarcodeScanning.Native.Maui na GitHubie opisuje format PDF417 jako "bardzo problematyczny — większość skanów nigdy nie dochodzi do skutku". W przypadku każdej aplikacji, w której niezawodność formatu PDF417 jest wymogiem funkcjonalnym, a nie tylko miłym dodatkiem, ta znana usterka stanowi bezpośrednią przeszkodę, która wymusza rozważenie alternatywnych bibliotek.

Typowe kwestie związane z migracją

Zdarzenie kamery do MediaPicker i odczyt statyczny

Podstawową zmianą strukturalną w migracji jest zastąpienie wzorca ciągłego zdarzenia kamery przez przechwycenie MediaPicker, po którym następuje BarcodeReader.Read(). Obsługa zdarzeń OnDetectionFinished, kontrolka XAML CameraView oraz deklaracja przestrzeni nazw XML scanner: zostały usunięte. Zamiast tego przycisk uruchamia MediaPicker.CapturePhotoAsync(), a wynikowe bajty zdjęcia są przekazywane do BarcodeReader.Read(). Zmienia to wrażenia użytkownika z podglądu na żywo na ekran aparatu systemówego — odpowiedni dla większości zastosowań biznesowych.

Zmiany w marshalingu wątków

BarcodeScanning.Native.Maui uruchamia OnDetectionFinished w wątku w tle, więc wszystkie istniejące procedury obsługi, które aktualizują elementy interfejsu użytkownika, zawijają swoje aktualizacje w MainThread.BeginInvokeOnMainThread(). Dzięki wzorcowi asynchronicznemu MediaPicker stosowanemu przez IronBarcode kontynuacja po await powraca do kontekstu wywołującego, którym zazwyczaj jest główny wątek. W większości przypadków można usunąć opakowania MainThread.BeginInvokeOnMainThread(), co upraszcza kod obsługi zdarzeń.

Usunięcie obejścia UPC-A

Każdy kod źródłowy obsługujący zachowanie 13-cyfrowego kodu UPC-A w BarcodeScanning.Native.Maui na iOS będzie zawierał kod sprawdzający BarcodeFormat.UPC_A i wywołujący Substring(1) w celu usunięcia początkowego zera. Ten kod należy usunąć po migracji — IronBarcode zwraca prawidłową 12-cyfrową wartość, a pozostawienie tego obejścia spowodowałoby nieprawidłowe usuwanie pierwszej cyfry z prawidłowych odczytów UPC-A.

Uprawnienia MAUI

BarcodeScanning.Native.Maui automatycznie dodaje uprawnienia do kamery do manifestów systemów Android i iOS w ramach konfiguracji pakietu. W przypadku korzystania z IronBarcode przy użyciu MediaPicker wymagańe są standardowe uprawnienia kamery MAUI w AndroidManifest.xml i Info.plist — te same uprawnienia, których potrzebuje każda aplikacja MAUI do MediaPicker.CapturePhotoAsync(). Uprawnienia te są zazwyczaj już obecne w projektach MAUI, które wykorzystują kamerę w dowolnym celu.

Dodatkowe możliwości IronBarcode

Oprócz możliwości omówionych w tym porównaniu, IronBarcode oferuje funkcje, których BarcodeScanning.Native.Maui nie obsługuje na żadnym poziomie:

  • Generowanie barcode'ów: Generuj kody Code128, QR, DataMatrix, PDF417 i inne formaty jako pliki PNG, SVG lub tablice bajtów — do wykorzystania w interfejsie użytkownika MAUI, odpowiedziąch API lub drukowanych etykietach.
  • Generowanie kodów QR: Twórz stylizowane kody QR z osadzonym logo, dostosowaniem kolorów i kontrolą poziomu korekcji błędów.
  • Odczyt wielu BarCodes: Opcja ExpectMultipleBarcodes odczytuje wszystkie BarCodes obecne na jednym obrazie w jednym przebiegu.
  • Wyodrębnianie kodów kreskowych z plików PDF: Bezpośredni odczyt kodów kreskowych osadzonych w dokumentach PDF — bez konieczności pośredniej konwersji obrazów.
  • Wdrożenie po stronie serwera: Wdroż tę samą logikę odczytu i generowania BarCode'ów w ASP.NET, Azure Functions, Dockerze i AWS Lambda bez żadnej zależności od kamery.
  • Konfiguracja prędkości odczytu: ustawienia ReadingSpeed.Faster, Balanced i Slower pozwalają na dostosowanie stosunku przepustowości do dokładności w zależności od jakości obrazu.
  • Obsługa MAUI w systemie macOS: Pełna obsługa aplikacji desktopowych MAUI w systemie macOS, obejmująca czwarty cel MAUI, którego nie dokumentuje BarcodeScanning.Native.Maui.

Zgodność z platformą .NET i gotowość na przyszłość

IronBarcode obsługuje .NET 6, .NET 7, .NET 8 i .NET 9, a także .NET Framework 4.6.2 i nowsze wersje. Oznacza to, że działa on na pełnym zestawie docelowym MAUI, a także w starszych środowiskach serwerowych, które nie zostały jeszcze przeniesione do nowoczesnego środowiska .NET. IronBarcode jest regularnie aktualizowany i jest kompatybilny z .NET 10, a jego popularność będzie rosła do 2026 roku. BarcodeScanning.Native.Maui to biblioteka przeznaczona wyłącznie dla MAUI, bez obsługi .NET Framework i bez ścieżki wdrożenia po stronie serwera. Dla zespołów, których kod obejmuje zarówno MAUI, jak i istniejące aplikacje serwerowe .NET Framework lub .NET Core, IronBarcode zapewnia spójny interfejs API we wszystkich środowiskach, bez konieczności stosowania oddzielnego pakietu kodów kreskowych dla każdego kontekstu uruchomieniowego.

Wnioski

BarcodeScanning.Native.Maui i IronBarcode rozwiązują różne problemy. BarcodeScanning.Native.Maui to biblioteka do sterowania aparatem, która zapewnia podgląd w czasie rzeczywistym z automatycznym wykrywaniem kodów kreskowych na systemach iOS i Android. Biblioteka IronBarcode do odczytu i generowania kodów kreskowych, która przetwarza statyczne dane obrazówe z dowolnego źródła na wszystkich platformach .NET. Różnica w architekturze — ciągły strumień z kamery w porównaniu z dyskretnym wprowadzaniem danych — decyduje o tym, która biblioteka jest odpowiednia dla danego zestawu wymagań.

BarcodeScanning.Native.Maui to właściwy wybór, gdy aplikacja jest mobilną aplikacją konsumencką przeznaczoną wyłącznie dla systemów iOS i Android, gdy wymagańym wzorcem UX jest podgląd na żywo z kamery w aplikacji z ciągłym wykrywaniem klatek, a wymagania nie obejmują systemu Windows, przesyłania plików, przetwarzania plików PDF ani obsługi kodów kreskowych po stronie serwera. W ramach tych ograniczeń jest on bezpłatny, minimalistyczny i funkcjonalny.

IronBarcode to właściwy wybór, gdy obsługa platformy musi obejmować Windows MAUI, gdy dane kodów kreskowych pochodzą z plików, plików PDF lub tablic bajtów, oprócz lub zamiast obrazu z kamery na żywo, gdy przetwarzanie kodów kreskowych po stronie serwera jest częścią architektury lub gdy oprócz odczytu wymagańe jest generowanie kodów kreskowych. Jest to również właściwe, gdy dokładność UPC-A lub niezawodność PDF417 są wymaganiami produkcyjnymi, a nie akceptowalnymi ograniczeniami. Koszt licencji komercyjnej stanowi kompromis za te możliwości.

Dla zespołów, których wymagania obecnie mieszczą się w wąskim zakresie BarcodeScanning.Native.Maui, biblioteka ta jest rozsądnym i opłacalnym wyborem. Dla zespołów, których wymagania wzrosły lub mają wzrosnąć poza skanowanie na żywo za pomocą kamery na dwóch platformach, niezgodność zakresu z BarcodeScanning.Native.Maui nie jest problemem konfiguracyjnym — jest to problem architektoniczny. Spójny interfejs API IronBarcode dla wszystkich typów danych wejściowych, platform i miejsc wdrożenia stanowi praktyczne rozwiązanie tego niedopasowania.

Często Zadawane Pytania

Czym jest BarcodeScanning.MAUI?

BarcodeScanning.MAUI to biblioteka kodów kreskowych .NET służąca do generowania i odczytywania kodów kreskowych w aplikacjach C#. Jest to jedna z kilku alternatyw rozważanych przez programistów przy wyborze rozwiązania do obsługi kodów kreskowych w projektach .NET.

Jakie są główne różnice między BarcodeScanning.MAUI a IronBarcode?

IronBarcode wykorzystuje statyczne, bezstanowe API, które nie wymaga zarządzania instancjami, podczas gdy BarcodeScanning.MAUI zazwyczaj wymaga utworzenia i konfiguracji instancji przed użyciem. IronBarcode zapewnia również natywną obsługę plików PDF, automatyczne wykrywanie formatów oraz licencjonowanie za pomocą jednego klucza we wszystkich środowiskach.

Czy licencja na IronBarcode jest łatwiejsza do uzyskania niż na BarcodeScanning.MAUI?

IronBarcode wykorzystuje pojedynczy klucz licencyjny obejmujący zarówno wdrożenia deweloperskie, jak i produkcyjne. Upraszcza to procesy CI/CD oraz konfiguracje Docker w porównaniu z systemami licencyjnymi, które oddzielają klucze SDK od kluczy środowiska uruchomieniowego.

Czy IronBarcode obsługuje wszystkie formaty kodów kreskowych obsługiwane przez BarcodeScanning.MAUI?

IronBarcode obsługuje ponad 30 symboli kodów kreskowych, w tym QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 i wiele innych. Automatyczne wykrywanie formatu oznacza, że nie jest wymagane jawne wyliczanie formatów.

Czy IronBarcode obsługuje natywne odczytywanie kodów kreskowych z plików PDF?

Tak. IronBarcode odczytuje kody kreskowe bezpośrednio z plików PDF za pomocą BarcodeReader.Read("document.pdf") bez konieczności korzystania z oddzielnej biblioteki do renderowania plików PDF. Wyniki dla każdej strony obejmują numer strony, format kodu kreskowego, wartość oraz wskaźnik pewności.

W jaki sposób IronBarcode radzi sobie z przetwarzaniem wsadowym w porównaniu z BarcodeScanning.MAUI?

Metody statyczne IronBarcode są bezstanowe i z natury bezpieczne dla wątków, co umożliwia bezpośrednie użycie Parallel.ForEach bez zarządzania instancjami dla poszczególnych wątków. Nie ma ograniczeń przepustowości w żadnym przedziale cenowym.

Jakie wersje .NET obsługuje IronBarcode?

IronBarcode obsługuje .NET Framework 4.6.2+, .NET Core 3.1 oraz .NET 5, 6, 7, 8 i 9 w jednym pakiecie NuGet. Obsługiwane platformy to Windows x64/x86, Linux x64 oraz macOS x64/ARM.

Jak zainstalować IronBarcode w projekcie .NET?

Zainstaluj IronBarcode za pomocą NuGet: uruchom polecenie „Install-Package IronBarCode” w konsoli menedżera pakietów lub „dotnet add package IronBarCode” w interfejsie CLI. Nie są wymagane żadne dodatkowe instalatory SDK ani pliki uruchomieniowe.

Czy mogę przetestować IronBarcode przed zakupem, w przeciwieństwie do BarcodeScanning.MAUI?

Tak. Tryb próbny IronBarcode zwraca pełne, zdekodowane wartości BarCode — tylko wygenerowane obrazy wyjściowe są opatrzone znakiem wodnym. Przed podjęciem decyzji o zakupie można sprawdzić dokładność odczytu na własnych dokumentach.

Jaka jest różnica w cenie między BarcodeScanning.MAUI a IronBarcode?

Cena IronBarcode zaczyna się od 749 USD za Licencję wieczystą dla jednego programisty, obejmującą etapy rozwoju i produkcji. Szczegóły dotyczące cen i opcji zakupu hurtowego są dostępne na stronie licencyjnej IronBarcode. Nie ma wymogu posiadania oddzielnej licencji na środowisko uruchomieniowe.

Czy migracja z BarcodeScanning.MAUI do IronBarcode jest prosta?

Migracja z BarcodeScanning.MAUI do IronBarcode polega głównie na zastąpieniu wywołań API opartych na instancjach statycznymi metodami IronBarcode, usunięciu standardowych fragmentów kodu dotyczących licencji oraz aktualizacji nazw właściwości wyników. Większość migracji wiąże się raczej z redukcją kodu niż z jego dodawaniem.

Czy IronBarcode generuje kody QR z logo?

Tak. Funkcja QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") osadza obraz marki w kodzie QR w sposób natywny z konfigurowalną korekcją błędów. Kolorowe kody QR są również obsługiwane za pomocą funkcji ChangeBarCodeColor().

Jordi Bardia
Inżynier oprogramowania
Jordi jest najbardziej biegły w Pythonie, C# i C++. Kiedy nie wykorzystuje swoich umiejętności w Iron Software, programuje gry. Dzieląc odpowiedzialność za testowanie produktów, rozwój produktów i badania, Jordi wnosi ogromną wartość do ciągłej poprawy produktów. Różnorodne doświadczenia ...
Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie