@nitra/zebra 7.1.1 → 7.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -7
- package/ios/Sources/ZebraPlugin/Zebra.swift +18 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @nitra/zebra
|
|
2
2
|
|
|
3
|
-
Capacitor-плагін для друку ZPL на принтерах Zebra з підтримкою веб (Web Serial API), iOS та Android
|
|
3
|
+
Capacitor-плагін для друку ZPL на принтерах Zebra з підтримкою веб (Web Serial API), iOS та Android
|
|
4
4
|
|
|
5
5
|
## Вимоги
|
|
6
6
|
|
|
@@ -16,6 +16,8 @@ npm install @nitra/zebra
|
|
|
16
16
|
npx cap sync
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
+
Патч-реліз гілки 7.x: за версією — `@nitra/zebra@7.1.2`, або за тегом — `@nitra/zebra@patch` (npm/bun).
|
|
20
|
+
|
|
19
21
|
## API
|
|
20
22
|
|
|
21
23
|
### `print(zpl: string | PrintOptions): Promise<{ sent?: boolean }>`
|
|
@@ -37,10 +39,10 @@ npx cap sync
|
|
|
37
39
|
**Приклад:**
|
|
38
40
|
|
|
39
41
|
```javascript
|
|
40
|
-
import { Zebra } from
|
|
42
|
+
import { Zebra } from "@nitra/zebra";
|
|
41
43
|
|
|
42
|
-
const zpl =
|
|
43
|
-
await Zebra.print(zpl)
|
|
44
|
+
const zpl = "^XA^FO50,50^A0N,28,28^FDHello World^FS^XZ";
|
|
45
|
+
await Zebra.print(zpl);
|
|
44
46
|
```
|
|
45
47
|
|
|
46
48
|
### `setPrinterAddress(options: { address: string, port?: number }): Promise<{ address }>` (Android / iOS)
|
|
@@ -55,8 +57,8 @@ await Zebra.print(zpl)
|
|
|
55
57
|
**Приклад (Android):**
|
|
56
58
|
|
|
57
59
|
```javascript
|
|
58
|
-
await Zebra.setPrinterAddress({ address:
|
|
59
|
-
await Zebra.print(zpl)
|
|
60
|
+
await Zebra.setPrinterAddress({ address: "00:11:22:33:44:55" });
|
|
61
|
+
await Zebra.print(zpl);
|
|
60
62
|
```
|
|
61
63
|
|
|
62
64
|
**Приклад (iOS):** використовуйте `address` з `getPairedDevices()` (серійний номер або ім'я принтера).
|
|
@@ -68,7 +70,7 @@ await Zebra.print(zpl)
|
|
|
68
70
|
**Приклад (Android):**
|
|
69
71
|
|
|
70
72
|
```javascript
|
|
71
|
-
const { devices } = await Zebra.getPairedDevices()
|
|
73
|
+
const { devices } = await Zebra.getPairedDevices();
|
|
72
74
|
// devices: [{ address: "00:11:22:33:44:55", name: "Zebra ZD420" }, ...]
|
|
73
75
|
```
|
|
74
76
|
|
|
@@ -87,6 +87,10 @@ import ExternalAccessory
|
|
|
87
87
|
private weak var owner: Zebra?
|
|
88
88
|
private var startTime = Date()
|
|
89
89
|
private let session: EASession
|
|
90
|
+
/// Чи отримано openCompleted; перший запис робимо тільки після нього + невеликої затримки (інакше при першому визові дані можуть не дійти до пристрою)
|
|
91
|
+
private var openCompleted = false
|
|
92
|
+
/// Затримка після відкриття потоку перед першим записом (External Accessory потребує часу на встановлення з'єднання)
|
|
93
|
+
private static let delayAfterOpen: TimeInterval = 0.35
|
|
90
94
|
|
|
91
95
|
init(owner: Zebra, session: EASession, output: OutputStream, data: [UInt8], address: String, timeout: TimeInterval = 5.0, completion: @escaping (Result<PrintResult, ZebraError>) -> Void) {
|
|
92
96
|
self.owner = owner
|
|
@@ -117,7 +121,7 @@ import ExternalAccessory
|
|
|
117
121
|
|
|
118
122
|
/// Після запису всіх байтів дає час на флаш буфера (iOS може не встигнути відправити на пристрій при миттєвому закритті)
|
|
119
123
|
private func flushThenClose() {
|
|
120
|
-
let flushDuration: TimeInterval =
|
|
124
|
+
let flushDuration: TimeInterval = 1.2
|
|
121
125
|
let deadline = Date().addingTimeInterval(flushDuration)
|
|
122
126
|
while Date() < deadline {
|
|
123
127
|
RunLoop.current.run(mode: .default, before: Date().addingTimeInterval(0.05))
|
|
@@ -148,7 +152,7 @@ import ExternalAccessory
|
|
|
148
152
|
}
|
|
149
153
|
|
|
150
154
|
// 4) Затримка, щоб iOS встиг звільнити EASession до наступного відкриття
|
|
151
|
-
Thread.sleep(forTimeInterval: 0.
|
|
155
|
+
Thread.sleep(forTimeInterval: 0.6)
|
|
152
156
|
if let completion = completion {
|
|
153
157
|
completion(result)
|
|
154
158
|
}
|
|
@@ -166,9 +170,20 @@ import ExternalAccessory
|
|
|
166
170
|
}
|
|
167
171
|
switch eventCode {
|
|
168
172
|
case .openCompleted:
|
|
169
|
-
// Потік
|
|
173
|
+
// Потік відкрито; даємо час EA встановити з'єднання з пристроєм перед першим записом
|
|
170
174
|
owner?.log("Stream open completed")
|
|
175
|
+
openCompleted = true
|
|
171
176
|
case .hasSpaceAvailable:
|
|
177
|
+
// Не пишемо до отримання openCompleted (порядок подій не гарантований)
|
|
178
|
+
guard openCompleted else { return }
|
|
179
|
+
// Після першого openCompleted чекаємо невелику затримку перед першим записом (при першому визові printZpl з'єднання може ще не бути готове)
|
|
180
|
+
if totalWritten == 0 {
|
|
181
|
+
let deadline = Date().addingTimeInterval(StreamWriter.delayAfterOpen)
|
|
182
|
+
while Date() < deadline {
|
|
183
|
+
RunLoop.current.run(mode: .default, before: Date().addingTimeInterval(0.05))
|
|
184
|
+
}
|
|
185
|
+
owner?.log("Delay after open done, starting write")
|
|
186
|
+
}
|
|
172
187
|
// Є простір для запису, пишемо дані порціями
|
|
173
188
|
if totalWritten >= data.count {
|
|
174
189
|
// Усі байти записані — даємо час на флаш буфера перед закриттям (iOS часто не встигає відправити на пристрій)
|