spotny-sdk 0.3.5 → 0.3.6
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.
Potentially problematic release.
This version of spotny-sdk might be problematic. Click here for more details.
- package/README.md +32 -33
- package/android/src/main/java/com/spotnysdk/SpotnySdkModule.kt +2 -2
- package/ios/SpotnyBeaconScanner.swift +4 -12
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/index.d.ts +0 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/index.tsx +0 -2
package/README.md
CHANGED
|
@@ -32,10 +32,11 @@ Add the following keys to your `Info.plist`:
|
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
Enable **Background Modes** in Xcode → your app target → **Signing & Capabilities** → **+ Capability** → Background Modes:
|
|
35
|
+
|
|
35
36
|
- ✅ Location updates
|
|
36
37
|
- ✅ Uses Bluetooth LE accessories
|
|
37
38
|
|
|
38
|
-
> **Important — avoid crash on launch:** If your app does **not** enable the
|
|
39
|
+
> **Important — avoid crash on launch:** If your app does **not** enable the _Location updates_ background mode, the SDK will still work for foreground-only scanning. However, if you enable it in Xcode, the `UIBackgroundModes: [location]` entry is added to `Info.plist` and the SDK will automatically enable background scanning. Omitting this while calling `startScanner` is safe — the SDK detects the missing capability at runtime and skips the background-location setting. Earlier versions (< 0.3.4) would crash with `NSInternalInconsistencyException` if the background mode was not declared; this is fixed in **0.3.4+**.
|
|
39
40
|
|
|
40
41
|
### Android
|
|
41
42
|
|
|
@@ -102,10 +103,10 @@ export default function App() {
|
|
|
102
103
|
|
|
103
104
|
Starts BLE beacon scanning and begins ranging / monitoring regions.
|
|
104
105
|
|
|
105
|
-
| Parameter | Type | Required | Description
|
|
106
|
-
|
|
107
|
-
| `userUUID` | `string` | Yes | Unique identifier for this installation/session
|
|
108
|
-
| `userId` | `number \| null` | No | Authenticated user ID (sent to the backend)
|
|
106
|
+
| Parameter | Type | Required | Description |
|
|
107
|
+
| ---------- | ---------------- | -------- | ----------------------------------------------- |
|
|
108
|
+
| `userUUID` | `string` | Yes | Unique identifier for this installation/session |
|
|
109
|
+
| `userId` | `number \| null` | No | Authenticated user ID (sent to the backend) |
|
|
109
110
|
|
|
110
111
|
Returns `Promise<string>` — resolves with a status message.
|
|
111
112
|
|
|
@@ -143,25 +144,23 @@ const scanning = await isScanning();
|
|
|
143
144
|
|
|
144
145
|
Overrides SDK defaults. **Must be called before `startScanner`.**
|
|
145
146
|
|
|
146
|
-
| Option
|
|
147
|
-
|
|
148
|
-
| `
|
|
149
|
-
|
|
147
|
+
| Option | Type | Default | Description |
|
|
148
|
+
| ---------------------- | -------- | ------- | ---------------------------------------- |
|
|
149
|
+
| `maxDetectionDistance` | `number` | `8.0` | Maximum beacon detection radius (metres) |
|
|
150
|
+
|
|
151
|
+
> The backend URL and Kontakt.io API key are fixed internally and cannot be overridden by consumers.
|
|
150
152
|
|
|
151
153
|
Returns `Promise<string>`.
|
|
152
154
|
|
|
153
155
|
```ts
|
|
154
|
-
await configure({
|
|
155
|
-
backendURL: 'https://api.spotny.app',
|
|
156
|
-
maxDetectionDistance: 12,
|
|
157
|
-
});
|
|
156
|
+
await configure({ maxDetectionDistance: 12 });
|
|
158
157
|
```
|
|
159
158
|
|
|
160
159
|
---
|
|
161
160
|
|
|
162
161
|
### Permissions
|
|
163
162
|
|
|
164
|
-
#### `requestNotificationPermissions()`
|
|
163
|
+
#### `requestNotificationPermissions()` _(iOS only)_
|
|
165
164
|
|
|
166
165
|
Prompts the user for local-notification permissions. Safe to call on Android (no-op).
|
|
167
166
|
|
|
@@ -181,7 +180,7 @@ Fires approximately every second while beacons are within `maxDetectionDistance`
|
|
|
181
180
|
|
|
182
181
|
```ts
|
|
183
182
|
const subscription = addBeaconsRangedListener(({ beacons, region }) => {
|
|
184
|
-
beacons.forEach(b => {
|
|
183
|
+
beacons.forEach((b) => {
|
|
185
184
|
console.log(`${b.uuid} — ${b.distance.toFixed(1)} m (${b.proximity})`);
|
|
186
185
|
});
|
|
187
186
|
});
|
|
@@ -192,21 +191,21 @@ subscription.remove();
|
|
|
192
191
|
|
|
193
192
|
**Callback payload — `BeaconRangedEvent`:**
|
|
194
193
|
|
|
195
|
-
| Field | Type | Description
|
|
196
|
-
|
|
197
|
-
| `beacons` | `BeaconData[]` | Array of visible beacons
|
|
198
|
-
| `region` | `string` | Beacon region identifier
|
|
194
|
+
| Field | Type | Description |
|
|
195
|
+
| --------- | -------------- | ------------------------ |
|
|
196
|
+
| `beacons` | `BeaconData[]` | Array of visible beacons |
|
|
197
|
+
| `region` | `string` | Beacon region identifier |
|
|
199
198
|
|
|
200
199
|
**`BeaconData`:**
|
|
201
200
|
|
|
202
|
-
| Field | Type | Description
|
|
203
|
-
|
|
204
|
-
| `uuid` | `string` | Proximity UUID
|
|
205
|
-
| `major` | `number` | Major value
|
|
206
|
-
| `minor` | `number` | Minor value
|
|
207
|
-
| `distance` | `number` | Estimated distance in metres
|
|
208
|
-
| `rssi` | `number` | Signal strength (dBm)
|
|
209
|
-
| `proximity` | `string` | `'immediate'` \| `'near'` \| `'far'` \| `'unknown'`
|
|
201
|
+
| Field | Type | Description |
|
|
202
|
+
| ----------- | -------- | --------------------------------------------------- |
|
|
203
|
+
| `uuid` | `string` | Proximity UUID |
|
|
204
|
+
| `major` | `number` | Major value |
|
|
205
|
+
| `minor` | `number` | Minor value |
|
|
206
|
+
| `distance` | `number` | Estimated distance in metres |
|
|
207
|
+
| `rssi` | `number` | Signal strength (dBm) |
|
|
208
|
+
| `proximity` | `string` | `'immediate'` \| `'near'` \| `'far'` \| `'unknown'` |
|
|
210
209
|
|
|
211
210
|
---
|
|
212
211
|
|
|
@@ -217,7 +216,7 @@ Fires on region enter, exit, and state-determination events. Works in **foregrou
|
|
|
217
216
|
```ts
|
|
218
217
|
const subscription = addBeaconRegionListener(({ region, event, state }) => {
|
|
219
218
|
if (event === 'enter') console.log('Entered', region);
|
|
220
|
-
if (event === 'exit')
|
|
219
|
+
if (event === 'exit') console.log('Exited', region);
|
|
221
220
|
});
|
|
222
221
|
|
|
223
222
|
// When done:
|
|
@@ -226,10 +225,10 @@ subscription.remove();
|
|
|
226
225
|
|
|
227
226
|
**Callback payload — `BeaconRegionEvent`:**
|
|
228
227
|
|
|
229
|
-
| Field | Type | Description
|
|
230
|
-
|
|
231
|
-
| `region` | `string` | Region identifier
|
|
232
|
-
| `event` | `string` | `'enter'` \| `'exit'` \| `'determined'`
|
|
228
|
+
| Field | Type | Description |
|
|
229
|
+
| -------- | -------- | ---------------------------------------------------------- |
|
|
230
|
+
| `region` | `string` | Region identifier |
|
|
231
|
+
| `event` | `string` | `'enter'` \| `'exit'` \| `'determined'` |
|
|
233
232
|
| `state` | `string` | `'inside'` \| `'outside'` \| `'unknown'` (determined only) |
|
|
234
233
|
|
|
235
234
|
---
|
|
@@ -302,7 +301,7 @@ import type {
|
|
|
302
301
|
## Platform Notes
|
|
303
302
|
|
|
304
303
|
| Feature | iOS | Android |
|
|
305
|
-
|
|
304
|
+
| ------------------------ | --- | ------- |
|
|
306
305
|
| Region monitoring | ✅ | ✅ |
|
|
307
306
|
| Background scanning | ✅ | ✅ |
|
|
308
307
|
| Terminated-state wakeup | ✅ | ✅ |
|
|
@@ -42,7 +42,8 @@ class SpotnySdkModule(private val reactContext: ReactApplicationContext) :
|
|
|
42
42
|
@Volatile private var scanning = false
|
|
43
43
|
|
|
44
44
|
// ── Configuration ─────────────────────────────────────────────────────────
|
|
45
|
-
|
|
45
|
+
// backendURL is fixed — not overridable by consumers.
|
|
46
|
+
private val backendURL = "https://api.spotny.app"
|
|
46
47
|
private var maxDetectionDistance = 8.0 // metres
|
|
47
48
|
|
|
48
49
|
// ── Timing constants ──────────────────────────────────────────────────────
|
|
@@ -134,7 +135,6 @@ class SpotnySdkModule(private val reactContext: ReactApplicationContext) :
|
|
|
134
135
|
override fun isScanning(promise: Promise) = promise.resolve(scanning)
|
|
135
136
|
|
|
136
137
|
override fun configure(config: ReadableMap?, promise: Promise) {
|
|
137
|
-
config?.getString("backendURL")?.let { backendURL = it; Log.d(TAG, "backendURL = $it") }
|
|
138
138
|
config?.getDouble("maxDetectionDistance").takeIf { config?.hasKey("maxDetectionDistance") == true }
|
|
139
139
|
?.let { maxDetectionDistance = it; Log.d(TAG, "maxDetectionDistance = $it m") }
|
|
140
140
|
promise.resolve("Configuration updated")
|
|
@@ -44,10 +44,11 @@ public class SpotnyBeaconScanner: NSObject {
|
|
|
44
44
|
private var userId: Int?
|
|
45
45
|
private var scanning: Bool = false
|
|
46
46
|
|
|
47
|
-
// ── Configuration
|
|
48
|
-
|
|
47
|
+
// ── Configuration ────────────────────────────────────────────────────────────
|
|
48
|
+
// backendURL and kontaktAPIKey are fixed — not overridable by consumers.
|
|
49
|
+
private let backendURL: String = "https://api.spotny.app"
|
|
50
|
+
private let kontaktAPIKey: String = "mgrz08TOKNHafeY02cWIs9mxUHbynNQJ"
|
|
49
51
|
private var maxDetectionDistance: Double = 8.0
|
|
50
|
-
private var kontaktAPIKey: String = "mgrz08TOKNHafeY02cWIs9mxUHbynNQJ"
|
|
51
52
|
|
|
52
53
|
// ── Beacon UUID (standard Kontakt.io default) ─────────────────────────────
|
|
53
54
|
private let beaconUUID = UUID(uuidString: "f7826da6-4fa2-4e98-8024-bc5b71e0893e")!
|
|
@@ -180,19 +181,10 @@ public class SpotnyBeaconScanner: NSObject {
|
|
|
180
181
|
resolve: @escaping (Any?) -> Void,
|
|
181
182
|
reject: @escaping (String?, String?, Error?) -> Void
|
|
182
183
|
) {
|
|
183
|
-
if let url = config["backendURL"] as? String {
|
|
184
|
-
backendURL = url
|
|
185
|
-
print("⚙️ SpotnySDK: backendURL = \(url)")
|
|
186
|
-
}
|
|
187
184
|
if let dist = config["maxDetectionDistance"] as? Double {
|
|
188
185
|
maxDetectionDistance = dist
|
|
189
186
|
print("⚙️ SpotnySDK: maxDetectionDistance = \(dist)m")
|
|
190
187
|
}
|
|
191
|
-
if let key = config["kontaktAPIKey"] as? String {
|
|
192
|
-
kontaktAPIKey = key
|
|
193
|
-
Kontakt.setAPIKey(key)
|
|
194
|
-
print("⚙️ SpotnySDK: Kontakt.io API key updated")
|
|
195
|
-
}
|
|
196
188
|
resolve("Configuration updated")
|
|
197
189
|
}
|
|
198
190
|
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeEventEmitter","NativeModules","NativeSpotnySdk","SpotnyEvents","ON_BEACONS_RANGED","ON_BEACON_REGION_EVENT","eventEmitter","SpotnySdk","startScanner","userUUID","userId","stopScanner","isScanning","configure","config","requestNotificationPermissions","getDebugLogs","clearDebugLogs","setDebounceInterval","interval","clearDebounceCache","getDebounceStatus","addBeaconsRangedListener","callback","addListener","addBeaconRegionListener"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,kBAAkB,EAAEC,aAAa,QAAQ,cAAc;AAChE,OAAOC,eAAe,MAAM,sBAAmB;;AAE/C;AACA,OAAO,MAAMC,YAAY,GAAG;EAC1BC,iBAAiB,EAAE,iBAAiB;EACpCC,sBAAsB,EAAE;AAC1B,CAAU;;AAEV;;
|
|
1
|
+
{"version":3,"names":["NativeEventEmitter","NativeModules","NativeSpotnySdk","SpotnyEvents","ON_BEACONS_RANGED","ON_BEACON_REGION_EVENT","eventEmitter","SpotnySdk","startScanner","userUUID","userId","stopScanner","isScanning","configure","config","requestNotificationPermissions","getDebugLogs","clearDebugLogs","setDebounceInterval","interval","clearDebounceCache","getDebounceStatus","addBeaconsRangedListener","callback","addListener","addBeaconRegionListener"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,kBAAkB,EAAEC,aAAa,QAAQ,cAAc;AAChE,OAAOC,eAAe,MAAM,sBAAmB;;AAE/C;AACA,OAAO,MAAMC,YAAY,GAAG;EAC1BC,iBAAiB,EAAE,iBAAiB;EACpCC,sBAAsB,EAAE;AAC1B,CAAU;;AAEV;;AA8BA;AACA,MAAMC,YAAY,GAAG,IAAIN,kBAAkB,CAACC,aAAa,CAACM,SAAS,CAAC;;AAEpE;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAC1BC,QAAgB,EAChBC,MAAsB,EACL;EACjB,OAAOR,eAAe,CAACM,YAAY,CAACC,QAAQ,EAAEC,MAAM,IAAI,IAAI,CAAC;AAC/D;;AAEA;AACA,OAAO,SAASC,WAAWA,CAAA,EAAoB;EAC7C,OAAOT,eAAe,CAACS,WAAW,CAAC,CAAC;AACtC;;AAEA;AACA,OAAO,SAASC,UAAUA,CAAA,EAAqB;EAC7C,OAAOV,eAAe,CAACU,UAAU,CAAC,CAAC;AACrC;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAACC,MAAuB,EAAmB;EAClE,OAAOZ,eAAe,CAACW,SAAS,CAACC,MAAgB,CAAC;AACpD;;AAEA;;AAEA;AACA,OAAO,SAASC,8BAA8BA,CAAA,EAAoB;EAChE,OAAOb,eAAe,CAACa,8BAA8B,CAAC,CAAC;AACzD;;AAEA;;AAEA;AACA,OAAO,SAASC,YAAYA,CAAA,EAAoB;EAC9C,OAAOd,eAAe,CAACc,YAAY,CAAC,CAAC;AACvC;;AAEA;AACA,OAAO,SAASC,cAAcA,CAAA,EAAoB;EAChD,OAAOf,eAAe,CAACe,cAAc,CAAC,CAAC;AACzC;;AAEA;;AAEA;AACA,OAAO,SAASC,mBAAmBA,CAACC,QAAgB,EAAmB;EACrE,OAAOjB,eAAe,CAACgB,mBAAmB,CAACC,QAAQ,CAAC;AACtD;;AAEA;AACA,OAAO,SAASC,kBAAkBA,CAAA,EAAoB;EACpD,OAAOlB,eAAe,CAACkB,kBAAkB,CAAC,CAAC;AAC7C;;AAEA;AACA,OAAO,SAASC,iBAAiBA,CAAA,EAAoB;EACnD,OAAOnB,eAAe,CAACmB,iBAAiB,CAAC,CAAC;AAC5C;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,wBAAwBA,CACtCC,QAA4C,EAC5C;EACA,OAAOjB,YAAY,CAACkB,WAAW,CAC7BrB,YAAY,CAACC,iBAAiB,EAC9BmB,QACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASE,uBAAuBA,CACrCF,QAA4C,EAC5C;EACA,OAAOjB,YAAY,CAACkB,WAAW,CAC7BrB,YAAY,CAACE,sBAAsB,EACnCkB,QACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -23,8 +23,6 @@ export type BeaconRegionEvent = {
|
|
|
23
23
|
state?: 'inside' | 'outside' | 'unknown';
|
|
24
24
|
};
|
|
25
25
|
export type SpotnySdkConfig = {
|
|
26
|
-
/** Base URL for the backend API (default: https://api.spotny.app) */
|
|
27
|
-
backendURL?: string;
|
|
28
26
|
/** Maximum BLE detection distance in metres (default: 8.0) */
|
|
29
27
|
maxDetectionDistance?: number;
|
|
30
28
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAIX,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC;IACvC,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAIX,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC;IACvC,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAOF;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GACrB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,mDAAmD;AACnD,wBAAgB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAE7C;AAED,uDAAuD;AACvD,wBAAgB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAE7C;AAID;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAElE;AAID,gEAAgE;AAChE,wBAAgB,8BAA8B,IAAI,OAAO,CAAC,MAAM,CAAC,CAEhE;AAID,yCAAyC;AACzC,wBAAgB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAE9C;AAED,2CAA2C;AAC3C,wBAAgB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAEhD;AAID,gEAAgE;AAChE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAErE;AAED,2DAA2D;AAC3D,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAEpD;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAEnD;AAID;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,4CAM7C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,4CAM7C"}
|
package/package.json
CHANGED
package/src/index.tsx
CHANGED
|
@@ -33,8 +33,6 @@ export type BeaconRegionEvent = {
|
|
|
33
33
|
};
|
|
34
34
|
|
|
35
35
|
export type SpotnySdkConfig = {
|
|
36
|
-
/** Base URL for the backend API (default: https://api.spotny.app) */
|
|
37
|
-
backendURL?: string;
|
|
38
36
|
/** Maximum BLE detection distance in metres (default: 8.0) */
|
|
39
37
|
maxDetectionDistance?: number;
|
|
40
38
|
};
|