Flutter Barcode SDK para iOS e macOS

A série SDK de código de barras Flutter está chegando ao fim. Esta semana, mudamos o ambiente de codificação para o macOS para finalizar o restante das plataformas de plug-in — iOS e MacOS — usando Swift.

A série de SDK de código de barras Flutter

  • Como implementar o scanner de código de barras Flutter para Android
  • Plugin Flutter Barcode — Escrevendo código C++ para a área de trabalho do Windows
  • Plugin Flutter Barcode para Web: Interoperabilidade entre Dart e JavaScript
  • Plugin Flutter Barcode para Linux: do Dart ao C++
  • flutter_barcode_sdk
  • SDK de código de barras do iOS
  • SDK de código de barras do macOS

https://www.dynamsoft.com/customer/license/trialLicense/?product=dbr

Plugin de código de barras Flutter para iOS

Como sempre, adicionamos primeiro o modelo iOS ao projeto de plug-in existente:

flutter create --template=plugin --platforms=ios .

Você pode definir vendored_frameworksou dependencypara vincular em flutter_barcode_sdk.podspec. A diferença é vendored_frameworksque são os caminhos dos pacotes de estrutura enviados com o plug-in, enquanto a configuração dependencydispara pod installse a estrutura não estiver armazenada em cache localmente. Se você tiver problemas em construir o projeto com dependency, vendored_frameworkspode ser a alternativa. O único problema de usar vendored_frameworksé que você não pode publicar o pacote no pub.dev se o tamanho do pacote for superior a 100 MB.

Em seguida, abrimos o Classes/SwiftFlutterBarcodeSdkPlugin.swiftarquivo para iniciar a codificação.

Aqui está o trecho de código para importar e inicializar o Dynamsoft Barcode Reader:

import DynamsoftBarcodeReader

public override init() {
    super.init()
    let lts = iDMLTSConnectionParameters()
    lts.organizationID = "200001"
    reader = DynamsoftBarcodeReader(licenseFromLTS: lts, verificationDelegate: self)

    reader!.initRuntimeSettings(with: "{\"ImageParameter\":{\"Name\":\"Balance\",\"DeblurLevel\":5,\"ExpectedBarcodesCount\":512,\"LocalizationModes\":[{\"Mode\":\"LM_CONNECTED_BLOCKS\"},{\"Mode\":\"LM_SCAN_DIRECTLY\"}]}}", conflictMode: EnumConflictMode.overwrite, error:nil)
    let settings = try! reader!.getRuntimeSettings()
    settings.barcodeFormatIds = Int(EnumBarcodeFormat.ONED.rawValue) | Int(EnumBarcodeFormat.PDF417.rawValue) | Int(EnumBarcodeFormat.QRCODE.rawValue) | Int(EnumBarcodeFormat.DATAMATRIX.rawValue)
    reader!.update(settings, error: nil)
    reader!.setModeArgument("BinarizationModes", index: 0, argumentName: "EnableFillBinaryVacancy", argumentValue: "0", error: nil)
    reader!.setModeArgument("BinarizationModes", index: 0, argumentName: "BlockSizeX", argumentValue: "81", error: nil)
    reader!.setModeArgument("BinarizationModes", index: 0, argumentName: "BlockSizeY", argumentValue: "81", error: nil)
}

A public func handle()função é usada para manipular a chamada do método Flutter:

public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
    switch call.method {
    case "getPlatformVersion":
        result("iOS " + UIDevice.current.systemVersion)
    case "setLicense":
        self.setLicense(arg: call.arguments as! NSDictionary)
        result(.none)
    case "setBarcodeFormats":
        self.setBarcodeFormats(arg: call.arguments as! NSDictionary)
        result(.none)
    case "decodeFile":
        let res = self.decodeFile(arg: call.arguments as! NSDictionary)
        result(res)
    case "decodeImageBuffer":
        DispatchQueue.global().async {
            let res = self.decodeBuffer(arguments: call.arguments as! NSDictionary)
            result(res)
        }
    default:
        result(.none)
    }
}

func decodeBuffer(arguments:NSDictionary) -> NSArray {
    let buffer:FlutterStandardTypedData = arguments.value(forKey: "bytes") as! FlutterStandardTypedData
    let w:Int = arguments.value(forKey: "width") as! Int
    let h:Int = arguments.value(forKey: "height") as! Int
    let stride:Int = arguments.value(forKey: "stride") as! Int
    let ret:[iTextResult] = try! reader!.decodeBuffer(buffer.data, withWidth: w, height: h, stride: stride, format:.ARGB_8888, templateName: "")
    return self.wrapResults(results: ret)
}

func setBarcodeFormats(arg:NSDictionary) {
    let formats:Int = arg.value(forKey: "formats") as! Int
    let settings = try! reader!.getRuntimeSettings()
    settings.barcodeFormatIds = formats
    reader!.update(settings, error: nil)
}

func decodeFile(arg:NSDictionary) -> NSArray {
    let path:String = arg.value(forKey: "filename") as! String
    let ret:[iTextResult] = try! self.reader!.decodeFile(withName: path, templateName: "")
    return self.wrapResults(results: ret)
}

func setLicense(arg:NSDictionary) {
    let lic:String = arg.value(forKey: "license") as! String
    reader = DynamsoftBarcodeReader(license: lic)
}

func wrapResults(results:[iTextResult]) -> NSArray {
    let outResults = NSMutableArray(capacity: 8)
    for item in results {
        let subDic = NSMutableDictionary(capacity: 8)
        if item.barcodeFormat_2 != EnumBarcodeFormat2.Null {
            subDic.setObject(item.barcodeFormatString_2 ?? "", forKey: "format" as NSCopying)
        }else{
            subDic.setObject(item.barcodeFormatString ?? "", forKey: "format" as NSCopying)
        }
        subDic.setObject(item.barcodeText ?? "", forKey: "text" as NSCopying)
        let points = item.localizationResult?.resultPoints as! [CGPoint]
        subDic.setObject(Int(points[0].x), forKey: "x1" as NSCopying)
        subDic.setObject(Int(points[0].x), forKey: "y1" as NSCopying)
        subDic.setObject(Int(points[1].x), forKey: "x2" as NSCopying)
        subDic.setObject(Int(points[1].x), forKey: "y2" as NSCopying)
        subDic.setObject(Int(points[2].x), forKey: "x3" as NSCopying)
        subDic.setObject(Int(points[2].x), forKey: "y3" as NSCopying)
        subDic.setObject(Int(points[3].x), forKey: "x4" as NSCopying)
        subDic.setObject(Int(points[3].x), forKey: "y4" as NSCopying)
        subDic.setObject(item.localizationResult?.angle ?? 0, forKey: "angle" as NSCopying)
        outResults.add(subDic)
    }

    return outResults
}

Plugin de código de barras Flutter para macOS

Depois que o plug-in de código de barras Flutter estiver pronto para iOS, desenvolver o plug-in para macOS é muito mais fácil. Provavelmente você notou que não há framework para macOS, mas apenas dylib. Para utilizar o SDK de código de barras para macOS, precisamos criar um cabeçalho de ponte.

Aqui estão os passos:

  1. Adicione o modelo Flutter macOS ao projeto de plug-in atual:
  2. flutter create --template=plugin --platforms=macos .
    

    #import "DynamsoftBarcodeReader.h"
    

Embora o aplicativo macOS agora possa ser executado com êxito, ele não conseguirá acessar os arquivos devido à restrição do sandbox. Para habilitar o carregamento do arquivo por meio da string do caminho do arquivo, desabilitamos o direito com.apple.security.app-sandbox em example/macos/Runner/DebugProfile.entitlements:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>com.apple.security.app-sandbox</key>
	<false/>
	<key>com.apple.security.cs.allow-jit</key>
	<true/>
	<key>com.apple.security.network.server</key>
	<true/>
</dict>
</plist>

flutter run -d macos

      

Até agora, o SDK de código de barras Flutter cobriu Windows, Linux, macOS, iOS, Android e web. Ele também suportará o Fuchsia OS em um futuro próximo.

Código fonte

https://github.com/yushulx/flutter_barcode_sdk

Publicado originalmente em https://www.dynamsoft.com em 26 de maio de 2021.

Suggested posts

“Aquela pequena ilha muda tudo”

Como projetamos as Lyft Live Activities para elevar a experiência do passageiro

“Aquela pequena ilha muda tudo”

Uma virada de jogo para o compartilhamento de viagens De todas as coisas que fazemos na Lyft, coreografar pickups entre passageiros e motoristas é uma das mais complexas e consequentes. Pregar essa coreografia depende de Lyft fazer muitas coisas bem, mas simplesmente manter os pilotos atualizados é essencial.

Ciclo de vida do aplicativo

Ciclo de vida do aplicativo

: Ciclo do lançamento do aplicativo ao desligamento: Usabilidade gerenciando memória ou dados ⬆️ A segurança pode ser processada UIApplication, situação AppDelegate:Define as funções que o objeto AppDelegate recebe msg enviada do objeto UIApplication e executa cada uma Não em execução: O estado em que o aplicativo não está em execuçãoInativo: O estado em que o aplicativo está em execução, mas nenhum evento é recebidoAtivo: O estado em que o aplicativo está em execução e ocorre um eventoBackground: O estado em que o aplicativo está em segundo plano, mas o código está sendo executadoSuspened: O estado em que o aplicativo está no plano de fundo e sem execução de código para delegar funções no arquivo AppDelegate.swift SceneDelegate Para responder bem à função de cena múltipla suportada a partir do iOS 13 AppDelegate / SceneDelegate AppDelegate 1.

Related posts

A perseguição aos cristãos: o crime de ódio do qual não falamos

Esqueça a islamofobia: cristãos (e judeus) são as principais vítimas de crimes de ódio religioso.

A perseguição aos cristãos: o crime de ódio do qual não falamos

Qualquer mente racional sabe que os círculos políticos e midiáticos são dominados pela esquerda, até mesmo pela extrema esquerda, um estado de coisas que cria um desequilíbrio no discurso político. No campo da religião, esse desequilíbrio é bem visível: jornais e redes de esquerda não se apressam em defender a fé cristã.

A lenta erosão: revelando como as pessoas desperdiçam em suas carreiras

A lenta erosão: revelando como as pessoas desperdiçam em suas carreiras

No mundo acelerado e competitivo de hoje, a carreira desempenha um papel significativo no crescimento pessoal, na estabilidade financeira e na satisfação geral com a vida. No entanto, muitos indivíduos encontram-se presos em um ciclo implacável de estagnação e insatisfação, definhando gradualmente em suas vidas profissionais.

O que você pode fazer em sua temporada de espera (esperando para conseguir seu primeiro emprego em tecnologia)

O que você pode fazer em sua temporada de espera (esperando para conseguir seu primeiro emprego em tecnologia)

Mudar para uma nova carreira pode ser extremamente desafiador se você tentar fazer isso sozinho. É importante encontrar parceiros de responsabilidade que estejam no mesmo nível de aprendizado que você, que compartilhem objetivos, tenacidade e motivação semelhantes.

Repensando a mídia: as cinco verdades de McChesney e o futuro das comunicações

No mundo hiperconectado de hoje, os sistemas de mídia desempenham um papel fundamental na formação da opinião pública e, consequentemente, na tomada de decisões democráticas. Em sua análise profunda da economia política da comunicação, o estudioso Robert McChesney desafia a sabedoria convencional e apresenta o que chama de “cinco verdades” sobre a mídia.