序
公司由於業務須要,開發安卓掃描槍打印快遞單之類的,踩了一天的坑,終於在隊友幫助下搞定
原理很簡單,利用打印機的socket通訊
話很少說,直接擼代碼
由於js不支持Socket通訊,因此須要本身編寫原生去實現前端
@ReactMethod public void print(String ip,Integer port, String msg, Promise promise) { try{ Socket socket = new Socket(ip, port); if (socket.isConnected() ) { InputStream inputStream = socket.getInputStream(); OutputStream os = socket.getOutputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); bw.write(msg); bw.flush(); promise.resolve("success"); } else { promise.reject("鏈接打印機失敗"); } }catch (Exception ex){ promise.reject(ex.fillInStackTrace()); } }
上面是一個原生方法,怎麼寫原生我就不說了,百度下就知道
開始的時候也遇到個小坑,VSCode的import java Class 是在糟糕,求看到人推薦個好用的插件,總之就是盡然不識別 promise類!!
啊,尷尬,後來看了下react-native-camera的源碼,看到的是加了java
import com.facebook.react.bridge.Promise;
好吧,仍是手動引入了(勿噴,本人以前沒寫過原生,總有第一次嘛,?)
以後的話就是在前端調用就能夠了react
import { NativeModules } from 'react-native' NativeModules.PrintExtension.print( printAddr.split(':')[0], printAddr.split(':')[1]*1, '^XA^FO100,75^BY3^B3N,N,100,Y,N^FD123ABC^XZ').then((c) => { console.log(c) if (c!=="success") { Modal.alert('打印失敗', c, [ { text: '肯定'}, ]) } },(c)=>{ console.log(c) })
記得以前看過某我的寫的文章說到,你寫RN,就得有寫原生的準備,嗯,如今也是深表贊成react-native