spotny-sdk 0.3.4 → 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 +36 -35
- 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
|
@@ -31,9 +31,12 @@ Add the following keys to your `Info.plist`:
|
|
|
31
31
|
<string>We use Bluetooth to scan for nearby beacons.</string>
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
Enable **Background Modes** in Xcode → Signing & Capabilities:
|
|
35
|
-
|
|
36
|
-
-
|
|
34
|
+
Enable **Background Modes** in Xcode → your app target → **Signing & Capabilities** → **+ Capability** → Background Modes:
|
|
35
|
+
|
|
36
|
+
- ✅ Location updates
|
|
37
|
+
- ✅ Uses Bluetooth LE accessories
|
|
38
|
+
|
|
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+**.
|
|
37
40
|
|
|
38
41
|
### Android
|
|
39
42
|
|
|
@@ -100,10 +103,10 @@ export default function App() {
|
|
|
100
103
|
|
|
101
104
|
Starts BLE beacon scanning and begins ranging / monitoring regions.
|
|
102
105
|
|
|
103
|
-
| Parameter | Type | Required | Description
|
|
104
|
-
|
|
105
|
-
| `userUUID` | `string` | Yes | Unique identifier for this installation/session
|
|
106
|
-
| `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) |
|
|
107
110
|
|
|
108
111
|
Returns `Promise<string>` — resolves with a status message.
|
|
109
112
|
|
|
@@ -141,25 +144,23 @@ const scanning = await isScanning();
|
|
|
141
144
|
|
|
142
145
|
Overrides SDK defaults. **Must be called before `startScanner`.**
|
|
143
146
|
|
|
144
|
-
| Option
|
|
145
|
-
|
|
146
|
-
| `
|
|
147
|
-
|
|
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.
|
|
148
152
|
|
|
149
153
|
Returns `Promise<string>`.
|
|
150
154
|
|
|
151
155
|
```ts
|
|
152
|
-
await configure({
|
|
153
|
-
backendURL: 'https://api.spotny.app',
|
|
154
|
-
maxDetectionDistance: 12,
|
|
155
|
-
});
|
|
156
|
+
await configure({ maxDetectionDistance: 12 });
|
|
156
157
|
```
|
|
157
158
|
|
|
158
159
|
---
|
|
159
160
|
|
|
160
161
|
### Permissions
|
|
161
162
|
|
|
162
|
-
#### `requestNotificationPermissions()`
|
|
163
|
+
#### `requestNotificationPermissions()` _(iOS only)_
|
|
163
164
|
|
|
164
165
|
Prompts the user for local-notification permissions. Safe to call on Android (no-op).
|
|
165
166
|
|
|
@@ -179,7 +180,7 @@ Fires approximately every second while beacons are within `maxDetectionDistance`
|
|
|
179
180
|
|
|
180
181
|
```ts
|
|
181
182
|
const subscription = addBeaconsRangedListener(({ beacons, region }) => {
|
|
182
|
-
beacons.forEach(b => {
|
|
183
|
+
beacons.forEach((b) => {
|
|
183
184
|
console.log(`${b.uuid} — ${b.distance.toFixed(1)} m (${b.proximity})`);
|
|
184
185
|
});
|
|
185
186
|
});
|
|
@@ -190,21 +191,21 @@ subscription.remove();
|
|
|
190
191
|
|
|
191
192
|
**Callback payload — `BeaconRangedEvent`:**
|
|
192
193
|
|
|
193
|
-
| Field | Type | Description
|
|
194
|
-
|
|
195
|
-
| `beacons` | `BeaconData[]` | Array of visible beacons
|
|
196
|
-
| `region` | `string` | Beacon region identifier
|
|
194
|
+
| Field | Type | Description |
|
|
195
|
+
| --------- | -------------- | ------------------------ |
|
|
196
|
+
| `beacons` | `BeaconData[]` | Array of visible beacons |
|
|
197
|
+
| `region` | `string` | Beacon region identifier |
|
|
197
198
|
|
|
198
199
|
**`BeaconData`:**
|
|
199
200
|
|
|
200
|
-
| Field | Type | Description
|
|
201
|
-
|
|
202
|
-
| `uuid` | `string` | Proximity UUID
|
|
203
|
-
| `major` | `number` | Major value
|
|
204
|
-
| `minor` | `number` | Minor value
|
|
205
|
-
| `distance` | `number` | Estimated distance in metres
|
|
206
|
-
| `rssi` | `number` | Signal strength (dBm)
|
|
207
|
-
| `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'` |
|
|
208
209
|
|
|
209
210
|
---
|
|
210
211
|
|
|
@@ -215,7 +216,7 @@ Fires on region enter, exit, and state-determination events. Works in **foregrou
|
|
|
215
216
|
```ts
|
|
216
217
|
const subscription = addBeaconRegionListener(({ region, event, state }) => {
|
|
217
218
|
if (event === 'enter') console.log('Entered', region);
|
|
218
|
-
if (event === 'exit')
|
|
219
|
+
if (event === 'exit') console.log('Exited', region);
|
|
219
220
|
});
|
|
220
221
|
|
|
221
222
|
// When done:
|
|
@@ -224,10 +225,10 @@ subscription.remove();
|
|
|
224
225
|
|
|
225
226
|
**Callback payload — `BeaconRegionEvent`:**
|
|
226
227
|
|
|
227
|
-
| Field | Type | Description
|
|
228
|
-
|
|
229
|
-
| `region` | `string` | Region identifier
|
|
230
|
-
| `event` | `string` | `'enter'` \| `'exit'` \| `'determined'`
|
|
228
|
+
| Field | Type | Description |
|
|
229
|
+
| -------- | -------- | ---------------------------------------------------------- |
|
|
230
|
+
| `region` | `string` | Region identifier |
|
|
231
|
+
| `event` | `string` | `'enter'` \| `'exit'` \| `'determined'` |
|
|
231
232
|
| `state` | `string` | `'inside'` \| `'outside'` \| `'unknown'` (determined only) |
|
|
232
233
|
|
|
233
234
|
---
|
|
@@ -300,7 +301,7 @@ import type {
|
|
|
300
301
|
## Platform Notes
|
|
301
302
|
|
|
302
303
|
| Feature | iOS | Android |
|
|
303
|
-
|
|
304
|
+
| ------------------------ | --- | ------- |
|
|
304
305
|
| Region monitoring | ✅ | ✅ |
|
|
305
306
|
| Background scanning | ✅ | ✅ |
|
|
306
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
|
};
|