【问题标题】:iOS only prints once using Epos2PrinteriOS 仅使用 Epos2Printer 打印一次
【发布时间】:2017-06-28 11:41:59
【问题描述】:

我正在使用以下代码使用Epson ePOS SDK for iOS SDKEpson TM-T20 上打印一些东西。问题是该应用程序只打印一次。必须重新启动应用程序才能再次打印。代码有什么问题?

    printer = Epos2Printer(printerSeries: 2, lang: 1)
    printer?.setReceiveEventDelegate(self)
    printer?.addText("text")

    printer!.connect("TCP:192.168.1.185", timeout:Int(EPOS2_PARAM_DEFAULT))
    printer!.beginTransaction()

    printer?.sendData(Int(EPOS2_PARAM_DEFAULT))
    printer?.endTransaction()
    // printer?.disconnect()
    printer?.clearCommandBuffer()
    printer?.setReceiveEventDelegate(nil)

尽管在文档中使用了printer?.disconnect(),但应用程序会冻结,所以我不得不将其注释掉。

如果您想查看 API 文档,the SDK's download 中有一个 PDF。

更新根据答案更新代码(应用仍然冻结):

func printReceipt() {
    var printer: Epos2Printer?
    printer = Epos2Printer(printerSeries: 2, lang: 1)
    if printer == nil {
      print(“Printer not found!! 11")
    }
    printer?.setReceiveEventDelegate(self)

    printer?.addTextFont(2)
    printer?.addTextSize(1, height: 1)
    printer?.addText(“My Text")
    printer?.addFeedUnit(10)
    printer?.addCut(0)

    var result: Int = Int(EPOS2_SUCCESS.rawValue)

    result = Int(printer!.connect("TCP:192.168.1.185", timeout:Int(EPOS2_PARAM_DEFAULT)));
    result = Int(printer!.beginTransaction())

    printer?.sendData(Int(EPOS2_PARAM_DEFAULT))

    DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async {
      printer?.clearCommandBuffer()
      printer?.setReceiveEventDelegate(nil)
      printer?.endTransaction()
      printer?.disconnect()
      printer = nil;
    }
  }

【问题讨论】:

  • 无论我在哪里调用disconnect(),它总是冻结应用程序。如果我不使用它,打印机似乎被应用程序占用,以至于在我之后的几分钟内其他人都无法打印。
  • 您的发行人是否已修复?我也面临同样的问题。就我而言,它只打印一次,当我尝试第二次打印时,它会引发连接错误。我正在为目标 c 使用演示中提供的相同代码。

标签: ios epson


【解决方案1】:

我也有同样的问题,您必须实现 Epos2PtrReceiveDelegate 并使用 onPtrReceive 遵守其协议,并包括断开该委托内的打印机。 p>

示例如下:

希望对你有帮助!

public func onPtrReceive(_ printerObj: Epos2Printer!, code: Int32, status: Epos2PrinterStatusInfo!, printJobId: String!) {

        printerObj.endTransaction()
        printerObj.disconnect()
        printerObj.clearCommandBuffer()
        printerObj.setReceiveEventDelegate(nil)

    }

干杯!

【讨论】:

  • 感谢您的回答。那么只能在委托方法中使用断开连接吗?那么不异步使用它不是问题吗?
  • 是的,兄弟,您不需要异步方法,因为在您正确实现委托后,它总是在 sendData 完成时被调用。因此,在该委托中,您可以断开当前的打印机对象,以便下次再次调用打印机时,它将生成一个新的打印机对象。
  • 这很有启发性,非常感谢您的解释!我会尽快尝试的。
  • 您好,请查看我的代码 sn-p 以防您仍然遇到任何错误以及遇到与您相同问题的其他人。干杯!
  • @rjcruz 我也面临同样的问题,我有带 ios12 操作系统的 iPad pro。我已经使用了您的代码,并且使用此代码我可以打印 2 或 3 次,但之后它会自动断开连接。我的代码在目标 c 中并且每次都面临“EPOS2_ERR_CONNECT”这个错误。请帮忙..
【解决方案2】:

供日后参考。

请看示例代码:

class ReportsViewController: UIViewController, Epos2PtrReceiveDelegate {

    func printReport() {

        let header = printer_model.getReportHeader()
        let content = printer_model.getReportContent()

        printer = Epos2Printer(printerSeries: EPOS2_TM_T88.rawValue, lang: EPOS2_MODEL_ANK.rawValue)

        printer!.setReceiveEventDelegate(self) 

        printer!.addFeedLine(1)

        printer!.addTextFont(1)
        printer!.addTextAlign(1)

        let logoData = UIImage(named: "logo.png")

        printer!.add(logoData!, x: 0, y:0,
                     width:Int(logoData!.size.width),
                     height:Int(logoData!.size.height),
                     color:EPOS2_COLOR_1.rawValue,
                     mode:EPOS2_MODE_MONO.rawValue,
                     halftone:EPOS2_HALFTONE_DITHER.rawValue,
                     brightness:Double(EPOS2_PARAM_DEFAULT),
                     compress:EPOS2_COMPRESS_AUTO.rawValue)

        printer!.addText("\n")
        printer!.addText(header)
        printer!.addText(content)
        printer!.addText(constants.PRINTER_LINE)

        printer!.addFeedLine(1)

        printer!.addCut(EPOS2_CUT_FEED.rawValue)

        let status = printer!.connect("TCP:\(PRINTER_IP_ADDRESS)", timeout: PRINTER_TIMEOUT)

        if status != 0 {

            // error
            // handle your logic here if you cannot connect to the printer

            self.printerErrorPrompt()

        } else {

            // send your data to the printer

            printer!.beginTransaction()
            printer!.sendData(Int(EPOS2_PARAM_DEFAULT))

        }
    }

}

在这里实现委托方法

public func onPtrReceive(_ printerObj: Epos2Printer!, code: Int32, status: Epos2PrinterStatusInfo!, printJobId: String!) {
      DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async(execute: {
          printerObj.endTransaction()
          printerObj.disconnect()
          printerObj.clearCommandBuffer()
          printerObj.setReceiveEventDelegate(nil)
      })


}

干杯!

【讨论】:

  • 我注意到您在委托消息 onPtrReceive 中向打印机对象发送消息。请注意,Epson SDK 文档明确表示此时不要向它发送消息。我调度了一个块供以后执行。
  • 在我的情况下,我面临一个问题,即右侧的收据无法打印完整的收据。它在纸上的一点点装饰和静止的纸从两侧都有空间。我的收据是纸质的。所以请帮助我@DavidH
  • 我也面临同样的问题,我有 iOS12 操作系统的 iPad pro。我已经使用了您的代码,并且使用此代码我可以打印 2 或 3 次,但之后它会自动断开连接。我的代码在目标 c 中并且每次都面临“EPOS2_ERR_CONNECT”这个错误。请帮忙..
  • @KaushikMovaliya 你的问题解决了吗?如果您有任何解决方案,请帮我解决。
【解决方案3】:

我使用了 Yun Chen 和 rjcruz 提供的类似代码。我的打印机也是 Epson TM-T20。我发现,disconnect() 函数本身会使我的应用程序冻结,无论它放在哪里。唯一可行的解​​决方案是完全避免 disconnect()。所以为了避免卡顿,你可以试试rjcruz提供的代码,只是去掉了disconnect()函数。 希望这会有所帮助!

示例代码:

func print() {
        printer = Epos2Printer(printerSeries: 2, lang: 1)
        printer?.setReceiveEventDelegate(self)
        printer?.addTextSize(2, height: 2)
        printer?.addText("My text")            
        printer?.addFeedUnit(10)
        printer?.addCut(0)
        printer!.connect("TCP:192.168.1.185", timeout:Int(EPOS2_PARAM_DEFAULT))
        printer!.beginTransaction()
        printer?.sendData(Int(EPOS2_PARAM_DEFAULT))
}

public func onPtrReceive(_ printerObj: Epos2Printer!, code: Int32, status: Epos2PrinterStatusInfo!, printJobId: String!) {
        printer?.clearCommandBuffer()
        printer?.setReceiveEventDelegate(nil)
        printer?.endTransaction()
}

【讨论】:

  • 这正是我需要的解决方案。
【解决方案4】:

根据 SDK 中的 iOS 演示,断开连接动作应该在子线程中,这样可以避免应用程序被冻结。我猜想在disconnect()函数被成功调用后,它将能够打印多次。

尝试(Swift3):

DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async {
    printer?.endTransaction()
    printer?.disconnect()

    DispatchQueue.main.async {
        //Do UI updating work in Main thread, like enable Print button again.
    }
}

【讨论】:

  • 感谢您的回答,但应用程序仍然以这种方式冻结。
  • 我也面临同样的问题,我有 iOS12 操作系统的 iPad pro。我已经使用了您的代码,并且使用此代码我可以打印 2 或 3 次,但之后它会自动断开连接。我的代码在目标 c 中并且每次都面临“EPOS2_ERR_CONNECT”这个错误。请帮忙..
  • @KaushikMovaliya,其他答案有更多的函数执行,你试过了吗?
  • @KaushikMovaliya 你是怎么解决的?我现在面临同样的问题,在 iOS 12 之前,我的代码可以毫无问题地打印。现在它只打印一次或两次,我得到“EPOS2_ERR_TIMEOUT”
  • @RichardMcCluskey 请检查您的代码并将委托方法名称设为“onPtrReceive”。
【解决方案5】:

我遇到了同样的问题,您必须实现 Epos2PtrReceiveDelegate 并使用 onPtrReceive 遵守其协议,并包括断开该委托内的打印机。 p>

这是一个代码示例:

public func onPtrReceive(_ printerObj: Epos2Printer!, code: Int32, status: Epos2PrinterStatusInfo!, printJobId: String!) {
        
    printerObj.endTransaction()
    printerObj.disconnect()
    printerObj.clearCommandBuffer()
    printerObj.setReceiveEventDelegate(nil)
}

【讨论】:

  • 我也面临同样的问题,我有 iOS12 操作系统的 iPad pro。我已经使用了您的代码,并且使用此代码我可以打印 2 或 3 次,但之后它会自动断开连接。我的代码在目标 c 中并且每次都面临“EPOS2_ERR_CONNECT”这个错误。请帮忙..
猜你喜欢
  • 2012-06-19
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 2021-07-03
  • 2018-08-26
相关资源
最近更新 更多