@apex-inc/capacitor-plugin 0.1.0 → 0.3.0
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 +66 -0
- package/dist/batch-sender.d.ts +2 -0
- package/dist/batch-sender.d.ts.map +1 -1
- package/dist/batch-sender.js +4 -0
- package/dist/batch-sender.js.map +1 -1
- package/dist/definitions.d.ts +100 -0
- package/dist/definitions.d.ts.map +1 -1
- package/dist/esm/batch-sender.d.ts +2 -0
- package/dist/esm/batch-sender.d.ts.map +1 -1
- package/dist/esm/batch-sender.js +4 -0
- package/dist/esm/batch-sender.js.map +1 -1
- package/dist/esm/definitions.d.ts +100 -0
- package/dist/esm/definitions.d.ts.map +1 -1
- package/dist/esm/web.d.ts +16 -1
- package/dist/esm/web.d.ts.map +1 -1
- package/dist/esm/web.js +61 -0
- package/dist/esm/web.js.map +1 -1
- package/dist/web.d.ts +16 -1
- package/dist/web.d.ts.map +1 -1
- package/dist/web.js +61 -0
- package/dist/web.js.map +1 -1
- package/ios/Sources/ApexCapacitorPlugin/PushNotificationManager.swift +151 -0
- package/ios/Sources/ApexCapacitorPluginBridge/ApexCapacitorPlugin.swift +94 -2
- package/ios/Tests/ApexCapacitorPluginTests/PushNotificationManagerTests.swift +42 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,6 +6,8 @@ Ships alongside `apex.js` (the web snippet) so a Capacitor app gets unified iden
|
|
|
6
6
|
|
|
7
7
|
> **Scope.** This plugin is for Capacitor apps. Native iOS (Swift), native Android (Kotlin), React Native, and Flutter apps need their own SDKs — see https://apex.inc/docs/mobile/which-sdk.
|
|
8
8
|
|
|
9
|
+
> **Try it in 5 minutes.** The [sample app](https://github.com/apex-incorporated/capacitor-sample-app) is a three-screen Capacitor + React app that exercises every API in this plugin. `git clone`, `npm install`, `npm run dev`, watch events land in your Apex dashboard.
|
|
10
|
+
|
|
9
11
|
## Install
|
|
10
12
|
|
|
11
13
|
```sh
|
|
@@ -53,6 +55,70 @@ await Apex.track({
|
|
|
53
55
|
|
|
54
56
|
Every event gets a client-generated UUIDv4 `id` automatically. Server-side idempotency means replayed events never double-count.
|
|
55
57
|
|
|
58
|
+
## Push notifications (iOS)
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
const { permission, token } = await Apex.registerForPushNotifications();
|
|
62
|
+
if (permission === "granted" && token) {
|
|
63
|
+
console.log(`APNs token: ${token}`);
|
|
64
|
+
// The plugin already POSTed it to /api/mobile/push-token for you.
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Subsequent token rotations:
|
|
68
|
+
await Apex.addListener("pushTokenReceived", ({ token }) => {
|
|
69
|
+
console.log("New token", token);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Foreground push payloads:
|
|
73
|
+
await Apex.addListener("pushReceived", (event) => {
|
|
74
|
+
console.log("Push:", event.title, event.body, event.data);
|
|
75
|
+
});
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
You also need three small additions to your iOS app's `AppDelegate` so the
|
|
79
|
+
plugin can observe the OS-side callbacks. Paste this into
|
|
80
|
+
`ios/App/App/AppDelegate.swift`:
|
|
81
|
+
|
|
82
|
+
```swift
|
|
83
|
+
import UIKit
|
|
84
|
+
|
|
85
|
+
extension AppDelegate {
|
|
86
|
+
func application(_ application: UIApplication,
|
|
87
|
+
didRegisterForRemoteNotificationsWithDeviceToken token: Data) {
|
|
88
|
+
NotificationCenter.default.post(
|
|
89
|
+
name: Notification.Name("ApexCapacitor.didRegisterForRemoteNotifications"),
|
|
90
|
+
object: nil,
|
|
91
|
+
userInfo: ["deviceToken": token]
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
func application(_ application: UIApplication,
|
|
96
|
+
didFailToRegisterForRemoteNotificationsWithError error: Error) {
|
|
97
|
+
NotificationCenter.default.post(
|
|
98
|
+
name: Notification.Name("ApexCapacitor.didFailToRegisterForRemoteNotifications"),
|
|
99
|
+
object: nil,
|
|
100
|
+
userInfo: ["error": error]
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
func application(_ application: UIApplication,
|
|
105
|
+
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
|
|
106
|
+
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
|
|
107
|
+
NotificationCenter.default.post(
|
|
108
|
+
name: Notification.Name("ApexCapacitor.didReceiveRemoteNotification"),
|
|
109
|
+
object: nil,
|
|
110
|
+
userInfo: userInfo as? [AnyHashable: Any] ?? [:]
|
|
111
|
+
)
|
|
112
|
+
completionHandler(.noData)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Then enable the **Push Notifications** capability in Xcode (Signing &
|
|
118
|
+
Capabilities → + → Push Notifications). Sandbox builds (Xcode-built
|
|
119
|
+
installs to a real device) hit Apple's sandbox APNs endpoint —
|
|
120
|
+
configure that environment in your Apex project settings.
|
|
121
|
+
|
|
56
122
|
## iOS App Tracking Transparency
|
|
57
123
|
|
|
58
124
|
```ts
|
package/dist/batch-sender.d.ts
CHANGED
|
@@ -40,6 +40,8 @@ export interface FlushResult {
|
|
|
40
40
|
export declare class BatchSender {
|
|
41
41
|
private readonly apiUrl;
|
|
42
42
|
private readonly projectKey;
|
|
43
|
+
/** Exposed for callers (e.g. getVariant) that need to address the same server. */
|
|
44
|
+
getApiUrl(): string;
|
|
43
45
|
private readonly batchSize;
|
|
44
46
|
private readonly maxRetries;
|
|
45
47
|
private readonly baseBackoffMs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch-sender.d.ts","sourceRoot":"","sources":["../src/batch-sender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,iBAAiB,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,sDAAsD;IACtD,cAAc,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;IAC3C,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;
|
|
1
|
+
{"version":3,"file":"batch-sender.d.ts","sourceRoot":"","sources":["../src/batch-sender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,iBAAiB,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,sDAAsD;IACtD,cAAc,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;IAC3C,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,kFAAkF;IAClF,SAAS,IAAI,MAAM;IAInB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA4B;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;gBAEpB,OAAO,EAAE,kBAAkB;IAiBvC;;;;OAIG;IACG,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;YAgCxC,kBAAkB;YAyClB,SAAS;CAoBxB"}
|
package/dist/batch-sender.js
CHANGED
|
@@ -14,6 +14,10 @@
|
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.BatchSender = void 0;
|
|
16
16
|
class BatchSender {
|
|
17
|
+
/** Exposed for callers (e.g. getVariant) that need to address the same server. */
|
|
18
|
+
getApiUrl() {
|
|
19
|
+
return this.apiUrl;
|
|
20
|
+
}
|
|
17
21
|
constructor(options) {
|
|
18
22
|
this.apiUrl = (options.apiUrl ?? "https://api.apex.inc").replace(/\/+$/, "");
|
|
19
23
|
this.projectKey = options.projectKey;
|
package/dist/batch-sender.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch-sender.js","sourceRoot":"","sources":["../src/batch-sender.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAgCH,MAAa,WAAW;
|
|
1
|
+
{"version":3,"file":"batch-sender.js","sourceRoot":"","sources":["../src/batch-sender.ts"],"names":[],"mappings":"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"}
|
package/dist/definitions.d.ts
CHANGED
|
@@ -12,6 +12,32 @@
|
|
|
12
12
|
import type { PluginListenerHandle } from "@capacitor/core";
|
|
13
13
|
/** iOS App Tracking Transparency authorization status. */
|
|
14
14
|
export type AttStatus = "authorized" | "denied" | "restricted" | "not-determined";
|
|
15
|
+
/** User-notification permission state returned by `registerForPushNotifications`. */
|
|
16
|
+
export type PushPermissionStatus = "granted" | "denied" | "default";
|
|
17
|
+
/** Result of {@link ApexCapacitorPlugin.registerForPushNotifications}. */
|
|
18
|
+
export interface PushRegistrationResult {
|
|
19
|
+
/** OS-reported notification authorization state. */
|
|
20
|
+
permission: PushPermissionStatus;
|
|
21
|
+
/**
|
|
22
|
+
* Hex-encoded APNs (iOS) or FCM (Android) device token, when registration
|
|
23
|
+
* succeeded. Null when permission was denied, the user backgrounded the
|
|
24
|
+
* prompt, or registration is still pending. The `pushTokenReceived`
|
|
25
|
+
* listener fires when the token actually arrives.
|
|
26
|
+
*/
|
|
27
|
+
token: string | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Payload of an incoming push delivered while the app is in the
|
|
31
|
+
* foreground. Background pushes wake the app via the OS and aren't
|
|
32
|
+
* surfaced through this listener.
|
|
33
|
+
*/
|
|
34
|
+
export interface PushReceivedEvent {
|
|
35
|
+
title?: string;
|
|
36
|
+
body?: string;
|
|
37
|
+
data?: Record<string, unknown>;
|
|
38
|
+
/** Original raw payload. Use `data` for the typed slice. */
|
|
39
|
+
raw?: Record<string, unknown>;
|
|
40
|
+
}
|
|
15
41
|
/** Supported tracking platforms. */
|
|
16
42
|
export type ApexPlatform = "ios" | "android" | "web";
|
|
17
43
|
/** Fallback source when the primary advertising identifier is unavailable. */
|
|
@@ -112,6 +138,28 @@ export interface SessionInfo {
|
|
|
112
138
|
sessionId: string | null;
|
|
113
139
|
startedAt: string | null;
|
|
114
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Result of {@link ApexCapacitorPlugin.getVariant}.
|
|
143
|
+
*
|
|
144
|
+
* `variant` is the key of the variant this visitor was assigned to (stable
|
|
145
|
+
* for the visitor's lifetime unless the server invalidates). `payload` is
|
|
146
|
+
* the mobile surface's JSON payload for that variant — arbitrary keys
|
|
147
|
+
* defined by your app. `eligible` is false when the visitor is in a
|
|
148
|
+
* mutex-conflict, holdout, or the experiment is not running; in those
|
|
149
|
+
* cases, treat the visitor as control.
|
|
150
|
+
*/
|
|
151
|
+
export interface VariantAssignmentResult {
|
|
152
|
+
/** Variant key — e.g. "control" | "variant_b". */
|
|
153
|
+
variant: string;
|
|
154
|
+
/** Mobile-surface JSON payload for the assigned variant. Empty when not applicable. */
|
|
155
|
+
payload: Record<string, unknown>;
|
|
156
|
+
/** False when the visitor should see no variant (mutex/holdout/not-running). */
|
|
157
|
+
eligible: boolean;
|
|
158
|
+
/** Reason when `eligible` is false. */
|
|
159
|
+
reason?: "mutex_conflict" | "holdout" | "audience_exclude" | "not_started" | "completed" | "not_found";
|
|
160
|
+
/** Experiment id this assignment belongs to. */
|
|
161
|
+
experimentId: string;
|
|
162
|
+
}
|
|
115
163
|
/**
|
|
116
164
|
* The primary plugin contract. Matches Phase 1b API surface locked in
|
|
117
165
|
* `plans/mobile-measurement-platform.md`.
|
|
@@ -130,6 +178,19 @@ export interface ApexCapacitorPlugin {
|
|
|
130
178
|
requestTrackingAuthorization(): Promise<{
|
|
131
179
|
status: AttStatus;
|
|
132
180
|
}>;
|
|
181
|
+
/**
|
|
182
|
+
* Requests notification permission and registers for remote notifications.
|
|
183
|
+
*
|
|
184
|
+
* On iOS this presents the system permission prompt (once per install)
|
|
185
|
+
* and, when granted, calls `UIApplication.registerForRemoteNotifications`.
|
|
186
|
+
* The APNs device token arrives asynchronously via the `pushTokenReceived`
|
|
187
|
+
* listener AND is auto-registered with Apex via `POST /api/mobile/push-token`
|
|
188
|
+
* so the dashboard sees it immediately.
|
|
189
|
+
*
|
|
190
|
+
* On Android (FCM) and on web this is currently a no-op returning
|
|
191
|
+
* `permission: "denied"`. Android FCM ships in a follow-up.
|
|
192
|
+
*/
|
|
193
|
+
registerForPushNotifications(): Promise<PushRegistrationResult>;
|
|
133
194
|
/**
|
|
134
195
|
* Returns the current ATT status without prompting. Android always returns
|
|
135
196
|
* `"authorized"`.
|
|
@@ -184,6 +245,27 @@ export interface ApexCapacitorPlugin {
|
|
|
184
245
|
endSession(): Promise<void>;
|
|
185
246
|
/** Returns info about the current session, or null fields if none. */
|
|
186
247
|
getCurrentSession(): Promise<SessionInfo>;
|
|
248
|
+
/**
|
|
249
|
+
* Fetches this visitor's assignment for the given mobile experiment.
|
|
250
|
+
*
|
|
251
|
+
* Hits the server's unified assign endpoint (`GET /api/experiments/:id/
|
|
252
|
+
* assign?unified=true`) and returns the variant key, surface-appropriate
|
|
253
|
+
* payload, and eligibility flags. Cached per-experiment in memory for the
|
|
254
|
+
* session lifetime unless `forceRefresh` is true.
|
|
255
|
+
*
|
|
256
|
+
* Typical usage:
|
|
257
|
+
*
|
|
258
|
+
* const { variant, payload, eligible } = await Apex.getVariant({
|
|
259
|
+
* experimentId: "exp_123",
|
|
260
|
+
* });
|
|
261
|
+
* if (!eligible) return renderControl();
|
|
262
|
+
* if (variant === "variant_b") return render(payload);
|
|
263
|
+
* return renderControl();
|
|
264
|
+
*/
|
|
265
|
+
getVariant(options: {
|
|
266
|
+
experimentId: string;
|
|
267
|
+
forceRefresh?: boolean;
|
|
268
|
+
}): Promise<VariantAssignmentResult>;
|
|
187
269
|
/**
|
|
188
270
|
* Enqueues an event for delivery. If network is available, events are
|
|
189
271
|
* batched and sent within ~1s; otherwise they persist in the offline queue
|
|
@@ -218,6 +300,24 @@ export interface ApexCapacitorPlugin {
|
|
|
218
300
|
sessionId: string;
|
|
219
301
|
durationSeconds: number;
|
|
220
302
|
}) => void): Promise<PluginListenerHandle>;
|
|
303
|
+
/**
|
|
304
|
+
* Fires when the OS provides a push notification device token after a
|
|
305
|
+
* successful `registerForPushNotifications()` call. The token is
|
|
306
|
+
* already auto-registered with Apex by the time this fires; the event
|
|
307
|
+
* is a hook for app code that wants to associate the token with its
|
|
308
|
+
* own user-id system or surface it in UI for debugging.
|
|
309
|
+
*/
|
|
310
|
+
addListener(eventName: "pushTokenReceived", listenerFunc: (event: {
|
|
311
|
+
token: string;
|
|
312
|
+
platform: "ios" | "android";
|
|
313
|
+
}) => void): Promise<PluginListenerHandle>;
|
|
314
|
+
/**
|
|
315
|
+
* Fires when a push notification arrives while the app is in the
|
|
316
|
+
* foreground. Background push delivery wakes the app via the OS and
|
|
317
|
+
* isn't surfaced here; use deep links or the OS-provided handlers for
|
|
318
|
+
* the cold-start path.
|
|
319
|
+
*/
|
|
320
|
+
addListener(eventName: "pushReceived", listenerFunc: (event: PushReceivedEvent) => void): Promise<PluginListenerHandle>;
|
|
221
321
|
/** Removes all listeners registered by this plugin instance. */
|
|
222
322
|
removeAllListeners(): Promise<void>;
|
|
223
323
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../src/definitions.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../src/definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,0DAA0D;AAC1D,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,gBAAgB,CAAC;AAElF,qFAAqF;AACrF,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEpE,0EAA0E;AAC1E,MAAM,WAAW,sBAAsB;IACrC,oDAAoD;IACpD,UAAU,EAAE,oBAAoB,CAAC;IACjC;;;;;OAKG;IACH,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,oCAAoC;AACpC,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;AAErD,8EAA8E;AAC9E,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC;AAEjE,wCAAwC;AACxC,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE;QACT,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,gDAAgD;IAChD,YAAY,CAAC,EAAE;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EACF,SAAS,GACT,SAAS,GACT,WAAW,GACX,SAAS,GACT,cAAc,GACd,QAAQ,GACR,SAAS,GACT,eAAe,GACf,iBAAiB,GACjB,eAAe,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACxD,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,yEAAyE;IACzE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,oEAAoE;AACpE,MAAM,WAAW,mBAAmB;IAClC,uEAAuE;IACvE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,kEAAkE;IAClE,QAAQ,EAAE,qBAAqB,CAAC;CACjC;AAED,6EAA6E;AAC7E,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,yDAAyD;AACzD,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,+BAA+B;AAC/B,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,uBAAuB;IACtC,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,gFAAgF;IAChF,QAAQ,EAAE,OAAO,CAAC;IAClB,uCAAuC;IACvC,MAAM,CAAC,EAAE,gBAAgB,GAAG,SAAS,GAAG,kBAAkB,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;IACvG,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAGlC;;;;OAIG;IACH,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAItD;;;OAGG;IACH,4BAA4B,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,SAAS,CAAA;KAAE,CAAC,CAAC;IAI/D;;;;;;;;;;;OAWG;IACH,4BAA4B,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAEhE;;;OAGG;IACH,iBAAiB,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,SAAS,CAAA;KAAE,CAAC,CAAC;IAIpD;;;;OAIG;IACH,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAEjD;;;OAGG;IACH,kBAAkB,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAE3D,0CAA0C;IAC1C,YAAY,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/C,+EAA+E;IAC/E,YAAY,CAAC,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAI5D;;;;OAIG;IACH,qBAAqB,CAAC,OAAO,EAAE;QAC7B,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,eAAe,CAAC;KAC/B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAIlB;;;;OAIG;IACH,kBAAkB,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAItD,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAIrC,0DAA0D;IAC1D,YAAY,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/C,4CAA4C;IAC5C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B,sEAAsE;IACtE,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAI1C;;;;;;;;;;;;;;;;OAgBG;IACH,UAAU,CAAC,OAAO,EAAE;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAIrC;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvC,qEAAqE;IACrE,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAErC,iFAAiF;IACjF,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAInC;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAI1D,wEAAwE;IACxE,WAAW,CACT,SAAS,EAAE,UAAU,EACrB,YAAY,EAAE,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAC7C,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEjC,kEAAkE;IAClE,WAAW,CACT,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GACnD,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEjC,uCAAuC;IACvC,WAAW,CACT,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GACnD,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEjC,2CAA2C;IAC3C,WAAW,CACT,SAAS,EAAE,YAAY,EACvB,YAAY,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAC5E,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEjC;;;;;;OAMG;IACH,WAAW,CACT,SAAS,EAAE,mBAAmB,EAC9B,YAAY,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAA;KAAE,KAAK,IAAI,GAC5E,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEjC;;;;;OAKG;IACH,WAAW,CACT,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAC/C,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEjC,gEAAgE;IAChE,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC"}
|
|
@@ -40,6 +40,8 @@ export interface FlushResult {
|
|
|
40
40
|
export declare class BatchSender {
|
|
41
41
|
private readonly apiUrl;
|
|
42
42
|
private readonly projectKey;
|
|
43
|
+
/** Exposed for callers (e.g. getVariant) that need to address the same server. */
|
|
44
|
+
getApiUrl(): string;
|
|
43
45
|
private readonly batchSize;
|
|
44
46
|
private readonly maxRetries;
|
|
45
47
|
private readonly baseBackoffMs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch-sender.d.ts","sourceRoot":"","sources":["../../src/batch-sender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,iBAAiB,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,sDAAsD;IACtD,cAAc,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;IAC3C,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;
|
|
1
|
+
{"version":3,"file":"batch-sender.d.ts","sourceRoot":"","sources":["../../src/batch-sender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,iBAAiB,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,sDAAsD;IACtD,cAAc,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;IAC3C,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,kFAAkF;IAClF,SAAS,IAAI,MAAM;IAInB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA4B;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;gBAEpB,OAAO,EAAE,kBAAkB;IAiBvC;;;;OAIG;IACG,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;YAgCxC,kBAAkB;YAyClB,SAAS;CAoBxB"}
|
package/dist/esm/batch-sender.js
CHANGED
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
* to swap in native HTTP clients (e.g. on restricted networks).
|
|
12
12
|
*/
|
|
13
13
|
export class BatchSender {
|
|
14
|
+
/** Exposed for callers (e.g. getVariant) that need to address the same server. */
|
|
15
|
+
getApiUrl() {
|
|
16
|
+
return this.apiUrl;
|
|
17
|
+
}
|
|
14
18
|
constructor(options) {
|
|
15
19
|
this.apiUrl = (options.apiUrl ?? "https://api.apex.inc").replace(/\/+$/, "");
|
|
16
20
|
this.projectKey = options.projectKey;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch-sender.js","sourceRoot":"","sources":["../../src/batch-sender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgCH,MAAM,OAAO,WAAW;
|
|
1
|
+
{"version":3,"file":"batch-sender.js","sourceRoot":"","sources":["../../src/batch-sender.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,32 @@
|
|
|
12
12
|
import type { PluginListenerHandle } from "@capacitor/core";
|
|
13
13
|
/** iOS App Tracking Transparency authorization status. */
|
|
14
14
|
export type AttStatus = "authorized" | "denied" | "restricted" | "not-determined";
|
|
15
|
+
/** User-notification permission state returned by `registerForPushNotifications`. */
|
|
16
|
+
export type PushPermissionStatus = "granted" | "denied" | "default";
|
|
17
|
+
/** Result of {@link ApexCapacitorPlugin.registerForPushNotifications}. */
|
|
18
|
+
export interface PushRegistrationResult {
|
|
19
|
+
/** OS-reported notification authorization state. */
|
|
20
|
+
permission: PushPermissionStatus;
|
|
21
|
+
/**
|
|
22
|
+
* Hex-encoded APNs (iOS) or FCM (Android) device token, when registration
|
|
23
|
+
* succeeded. Null when permission was denied, the user backgrounded the
|
|
24
|
+
* prompt, or registration is still pending. The `pushTokenReceived`
|
|
25
|
+
* listener fires when the token actually arrives.
|
|
26
|
+
*/
|
|
27
|
+
token: string | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Payload of an incoming push delivered while the app is in the
|
|
31
|
+
* foreground. Background pushes wake the app via the OS and aren't
|
|
32
|
+
* surfaced through this listener.
|
|
33
|
+
*/
|
|
34
|
+
export interface PushReceivedEvent {
|
|
35
|
+
title?: string;
|
|
36
|
+
body?: string;
|
|
37
|
+
data?: Record<string, unknown>;
|
|
38
|
+
/** Original raw payload. Use `data` for the typed slice. */
|
|
39
|
+
raw?: Record<string, unknown>;
|
|
40
|
+
}
|
|
15
41
|
/** Supported tracking platforms. */
|
|
16
42
|
export type ApexPlatform = "ios" | "android" | "web";
|
|
17
43
|
/** Fallback source when the primary advertising identifier is unavailable. */
|
|
@@ -112,6 +138,28 @@ export interface SessionInfo {
|
|
|
112
138
|
sessionId: string | null;
|
|
113
139
|
startedAt: string | null;
|
|
114
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Result of {@link ApexCapacitorPlugin.getVariant}.
|
|
143
|
+
*
|
|
144
|
+
* `variant` is the key of the variant this visitor was assigned to (stable
|
|
145
|
+
* for the visitor's lifetime unless the server invalidates). `payload` is
|
|
146
|
+
* the mobile surface's JSON payload for that variant — arbitrary keys
|
|
147
|
+
* defined by your app. `eligible` is false when the visitor is in a
|
|
148
|
+
* mutex-conflict, holdout, or the experiment is not running; in those
|
|
149
|
+
* cases, treat the visitor as control.
|
|
150
|
+
*/
|
|
151
|
+
export interface VariantAssignmentResult {
|
|
152
|
+
/** Variant key — e.g. "control" | "variant_b". */
|
|
153
|
+
variant: string;
|
|
154
|
+
/** Mobile-surface JSON payload for the assigned variant. Empty when not applicable. */
|
|
155
|
+
payload: Record<string, unknown>;
|
|
156
|
+
/** False when the visitor should see no variant (mutex/holdout/not-running). */
|
|
157
|
+
eligible: boolean;
|
|
158
|
+
/** Reason when `eligible` is false. */
|
|
159
|
+
reason?: "mutex_conflict" | "holdout" | "audience_exclude" | "not_started" | "completed" | "not_found";
|
|
160
|
+
/** Experiment id this assignment belongs to. */
|
|
161
|
+
experimentId: string;
|
|
162
|
+
}
|
|
115
163
|
/**
|
|
116
164
|
* The primary plugin contract. Matches Phase 1b API surface locked in
|
|
117
165
|
* `plans/mobile-measurement-platform.md`.
|
|
@@ -130,6 +178,19 @@ export interface ApexCapacitorPlugin {
|
|
|
130
178
|
requestTrackingAuthorization(): Promise<{
|
|
131
179
|
status: AttStatus;
|
|
132
180
|
}>;
|
|
181
|
+
/**
|
|
182
|
+
* Requests notification permission and registers for remote notifications.
|
|
183
|
+
*
|
|
184
|
+
* On iOS this presents the system permission prompt (once per install)
|
|
185
|
+
* and, when granted, calls `UIApplication.registerForRemoteNotifications`.
|
|
186
|
+
* The APNs device token arrives asynchronously via the `pushTokenReceived`
|
|
187
|
+
* listener AND is auto-registered with Apex via `POST /api/mobile/push-token`
|
|
188
|
+
* so the dashboard sees it immediately.
|
|
189
|
+
*
|
|
190
|
+
* On Android (FCM) and on web this is currently a no-op returning
|
|
191
|
+
* `permission: "denied"`. Android FCM ships in a follow-up.
|
|
192
|
+
*/
|
|
193
|
+
registerForPushNotifications(): Promise<PushRegistrationResult>;
|
|
133
194
|
/**
|
|
134
195
|
* Returns the current ATT status without prompting. Android always returns
|
|
135
196
|
* `"authorized"`.
|
|
@@ -184,6 +245,27 @@ export interface ApexCapacitorPlugin {
|
|
|
184
245
|
endSession(): Promise<void>;
|
|
185
246
|
/** Returns info about the current session, or null fields if none. */
|
|
186
247
|
getCurrentSession(): Promise<SessionInfo>;
|
|
248
|
+
/**
|
|
249
|
+
* Fetches this visitor's assignment for the given mobile experiment.
|
|
250
|
+
*
|
|
251
|
+
* Hits the server's unified assign endpoint (`GET /api/experiments/:id/
|
|
252
|
+
* assign?unified=true`) and returns the variant key, surface-appropriate
|
|
253
|
+
* payload, and eligibility flags. Cached per-experiment in memory for the
|
|
254
|
+
* session lifetime unless `forceRefresh` is true.
|
|
255
|
+
*
|
|
256
|
+
* Typical usage:
|
|
257
|
+
*
|
|
258
|
+
* const { variant, payload, eligible } = await Apex.getVariant({
|
|
259
|
+
* experimentId: "exp_123",
|
|
260
|
+
* });
|
|
261
|
+
* if (!eligible) return renderControl();
|
|
262
|
+
* if (variant === "variant_b") return render(payload);
|
|
263
|
+
* return renderControl();
|
|
264
|
+
*/
|
|
265
|
+
getVariant(options: {
|
|
266
|
+
experimentId: string;
|
|
267
|
+
forceRefresh?: boolean;
|
|
268
|
+
}): Promise<VariantAssignmentResult>;
|
|
187
269
|
/**
|
|
188
270
|
* Enqueues an event for delivery. If network is available, events are
|
|
189
271
|
* batched and sent within ~1s; otherwise they persist in the offline queue
|
|
@@ -218,6 +300,24 @@ export interface ApexCapacitorPlugin {
|
|
|
218
300
|
sessionId: string;
|
|
219
301
|
durationSeconds: number;
|
|
220
302
|
}) => void): Promise<PluginListenerHandle>;
|
|
303
|
+
/**
|
|
304
|
+
* Fires when the OS provides a push notification device token after a
|
|
305
|
+
* successful `registerForPushNotifications()` call. The token is
|
|
306
|
+
* already auto-registered with Apex by the time this fires; the event
|
|
307
|
+
* is a hook for app code that wants to associate the token with its
|
|
308
|
+
* own user-id system or surface it in UI for debugging.
|
|
309
|
+
*/
|
|
310
|
+
addListener(eventName: "pushTokenReceived", listenerFunc: (event: {
|
|
311
|
+
token: string;
|
|
312
|
+
platform: "ios" | "android";
|
|
313
|
+
}) => void): Promise<PluginListenerHandle>;
|
|
314
|
+
/**
|
|
315
|
+
* Fires when a push notification arrives while the app is in the
|
|
316
|
+
* foreground. Background push delivery wakes the app via the OS and
|
|
317
|
+
* isn't surfaced here; use deep links or the OS-provided handlers for
|
|
318
|
+
* the cold-start path.
|
|
319
|
+
*/
|
|
320
|
+
addListener(eventName: "pushReceived", listenerFunc: (event: PushReceivedEvent) => void): Promise<PluginListenerHandle>;
|
|
221
321
|
/** Removes all listeners registered by this plugin instance. */
|
|
222
322
|
removeAllListeners(): Promise<void>;
|
|
223
323
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/web.d.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* in separate files so unit tests can cover them without DOM mocking.
|
|
12
12
|
*/
|
|
13
13
|
import { WebPlugin } from "@capacitor/core";
|
|
14
|
-
import type { AdvertisingIdResult, ApexCapacitorPlugin, ApexEvent, AttStatus, DeviceInfo, FlushResult, InitializeOptions, QueueStatus, SessionInfo, SkanCoarseValue } from "./definitions";
|
|
14
|
+
import type { AdvertisingIdResult, ApexCapacitorPlugin, ApexEvent, AttStatus, DeviceInfo, FlushResult, InitializeOptions, PushRegistrationResult, QueueStatus, SessionInfo, SkanCoarseValue, VariantAssignmentResult } from "./definitions";
|
|
15
15
|
export declare class ApexCapacitorWeb extends WebPlugin implements ApexCapacitorPlugin {
|
|
16
16
|
private queue?;
|
|
17
17
|
private session?;
|
|
@@ -27,6 +27,12 @@ export declare class ApexCapacitorWeb extends WebPlugin implements ApexCapacitor
|
|
|
27
27
|
getTrackingStatus(): Promise<{
|
|
28
28
|
status: AttStatus;
|
|
29
29
|
}>;
|
|
30
|
+
/**
|
|
31
|
+
* Web fallback for push registration. Real APNs/FCM tokens require
|
|
32
|
+
* the native runtime; in a browser context we report `denied` and
|
|
33
|
+
* return a null token so calling code can branch cleanly.
|
|
34
|
+
*/
|
|
35
|
+
registerForPushNotifications(): Promise<PushRegistrationResult>;
|
|
30
36
|
getAdvertisingId(): Promise<AdvertisingIdResult>;
|
|
31
37
|
getInstallReferrer(): Promise<{
|
|
32
38
|
referrer: string | null;
|
|
@@ -50,6 +56,15 @@ export declare class ApexCapacitorWeb extends WebPlugin implements ApexCapacitor
|
|
|
50
56
|
}>;
|
|
51
57
|
endSession(): Promise<void>;
|
|
52
58
|
getCurrentSession(): Promise<SessionInfo>;
|
|
59
|
+
/**
|
|
60
|
+
* In-memory assignment cache. Keyed by experimentId; entry contains the
|
|
61
|
+
* result and the fetch timestamp. Never exceeds this set within a session.
|
|
62
|
+
*/
|
|
63
|
+
private assignmentCache;
|
|
64
|
+
getVariant(options: {
|
|
65
|
+
experimentId: string;
|
|
66
|
+
forceRefresh?: boolean;
|
|
67
|
+
}): Promise<VariantAssignmentResult>;
|
|
53
68
|
track(event: ApexEvent): Promise<void>;
|
|
54
69
|
getQueueSize(): Promise<QueueStatus>;
|
|
55
70
|
flushQueue(): Promise<FlushResult>;
|
package/dist/esm/web.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,SAAS,EACT,SAAS,EACT,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,eAAe,
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,SAAS,EACT,SAAS,EACT,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,eAAe,EACf,uBAAuB,EACxB,MAAM,eAAe,CAAC;AAQvB,qBAAa,gBAAiB,SAAQ,SAAU,YAAW,mBAAmB;IAC5E,OAAO,CAAC,KAAK,CAAC,CAAe;IAC7B,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAS;IAEtB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCrD,4BAA4B,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,SAAS,CAAA;KAAE,CAAC;IAI9D,iBAAiB,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,SAAS,CAAA;KAAE,CAAC;IAIzD;;;;OAIG;IACG,4BAA4B,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAI/D,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIhD,kBAAkB,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAI1D,YAAY,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAO9C,YAAY,CAAC,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,qBAAqB,CAAC,QAAQ,EAAE;QACpC,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,eAAe,CAAC;KAC/B,GAAG,OAAO,CAAC,IAAI,CAAC;IAIX,kBAAkB,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAOrD,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC;IAiBpC,YAAY,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAM9C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC;IAQ/C;;;OAGG;IACH,OAAO,CAAC,eAAe,CAA2E;IAE5F,UAAU,CAAC,OAAO,EAAE;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAqD9B,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BtC,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;IASpC,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAMlC,WAAW,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzC,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,iBAAiB;CAK1B"}
|
package/dist/esm/web.js
CHANGED
|
@@ -22,6 +22,11 @@ export class ApexCapacitorWeb extends WebPlugin {
|
|
|
22
22
|
this.testMode = false;
|
|
23
23
|
this.debug = false;
|
|
24
24
|
this.initialized = false;
|
|
25
|
+
/**
|
|
26
|
+
* In-memory assignment cache. Keyed by experimentId; entry contains the
|
|
27
|
+
* result and the fetch timestamp. Never exceeds this set within a session.
|
|
28
|
+
*/
|
|
29
|
+
this.assignmentCache = new Map();
|
|
25
30
|
}
|
|
26
31
|
async initialize(options) {
|
|
27
32
|
if (this.initialized)
|
|
@@ -57,6 +62,14 @@ export class ApexCapacitorWeb extends WebPlugin {
|
|
|
57
62
|
async getTrackingStatus() {
|
|
58
63
|
return { status: "authorized" };
|
|
59
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Web fallback for push registration. Real APNs/FCM tokens require
|
|
67
|
+
* the native runtime; in a browser context we report `denied` and
|
|
68
|
+
* return a null token so calling code can branch cleanly.
|
|
69
|
+
*/
|
|
70
|
+
async registerForPushNotifications() {
|
|
71
|
+
return { permission: "denied", token: null };
|
|
72
|
+
}
|
|
60
73
|
async getAdvertisingId() {
|
|
61
74
|
return { id: null, fallback: null };
|
|
62
75
|
}
|
|
@@ -114,6 +127,54 @@ export class ApexCapacitorWeb extends WebPlugin {
|
|
|
114
127
|
startedAt: current?.startedAt ?? null,
|
|
115
128
|
};
|
|
116
129
|
}
|
|
130
|
+
async getVariant(options) {
|
|
131
|
+
this.ensureInitialized();
|
|
132
|
+
const { experimentId, forceRefresh } = options;
|
|
133
|
+
if (!forceRefresh) {
|
|
134
|
+
const cached = this.assignmentCache.get(experimentId);
|
|
135
|
+
if (cached)
|
|
136
|
+
return cached.result;
|
|
137
|
+
}
|
|
138
|
+
// The SDK calls the unified assign endpoint so it receives the rich
|
|
139
|
+
// mobile-surface payload alongside the variant key.
|
|
140
|
+
const apiUrl = this.sender?.getApiUrl() ?? "https://api.apex.inc";
|
|
141
|
+
const url = `${apiUrl.replace(/\/$/, "")}/api/experiments/${encodeURIComponent(experimentId)}/assign?unified=true&source=sdk`;
|
|
142
|
+
try {
|
|
143
|
+
const res = await fetch(url, {
|
|
144
|
+
method: "GET",
|
|
145
|
+
headers: { "x-apex-source": "sdk" },
|
|
146
|
+
});
|
|
147
|
+
const json = (await res.json());
|
|
148
|
+
const result = {
|
|
149
|
+
experimentId,
|
|
150
|
+
variant: json.variant ?? "control",
|
|
151
|
+
payload: json.payload ?? {},
|
|
152
|
+
eligible: json.eligible ?? false,
|
|
153
|
+
reason: json.reason,
|
|
154
|
+
};
|
|
155
|
+
const previous = this.assignmentCache.get(experimentId);
|
|
156
|
+
this.assignmentCache.set(experimentId, { result, at: Date.now() });
|
|
157
|
+
if (previous && previous.result.variant !== result.variant) {
|
|
158
|
+
// Emit assignmentChanged when a refresh flips the variant key.
|
|
159
|
+
this.notifyListeners("assignmentChanged", {
|
|
160
|
+
experimentId,
|
|
161
|
+
assignment: result,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
if (this.debug)
|
|
168
|
+
console.warn("[apex-capacitor] getVariant failed", err);
|
|
169
|
+
return {
|
|
170
|
+
experimentId,
|
|
171
|
+
variant: "control",
|
|
172
|
+
payload: {},
|
|
173
|
+
eligible: false,
|
|
174
|
+
reason: "not_found",
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
117
178
|
async track(event) {
|
|
118
179
|
this.ensureInitialized();
|
|
119
180
|
const sessionSnapshot = this.session.recordActivity();
|
package/dist/esm/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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"}
|
package/dist/web.d.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* in separate files so unit tests can cover them without DOM mocking.
|
|
12
12
|
*/
|
|
13
13
|
import { WebPlugin } from "@capacitor/core";
|
|
14
|
-
import type { AdvertisingIdResult, ApexCapacitorPlugin, ApexEvent, AttStatus, DeviceInfo, FlushResult, InitializeOptions, QueueStatus, SessionInfo, SkanCoarseValue } from "./definitions";
|
|
14
|
+
import type { AdvertisingIdResult, ApexCapacitorPlugin, ApexEvent, AttStatus, DeviceInfo, FlushResult, InitializeOptions, PushRegistrationResult, QueueStatus, SessionInfo, SkanCoarseValue, VariantAssignmentResult } from "./definitions";
|
|
15
15
|
export declare class ApexCapacitorWeb extends WebPlugin implements ApexCapacitorPlugin {
|
|
16
16
|
private queue?;
|
|
17
17
|
private session?;
|
|
@@ -27,6 +27,12 @@ export declare class ApexCapacitorWeb extends WebPlugin implements ApexCapacitor
|
|
|
27
27
|
getTrackingStatus(): Promise<{
|
|
28
28
|
status: AttStatus;
|
|
29
29
|
}>;
|
|
30
|
+
/**
|
|
31
|
+
* Web fallback for push registration. Real APNs/FCM tokens require
|
|
32
|
+
* the native runtime; in a browser context we report `denied` and
|
|
33
|
+
* return a null token so calling code can branch cleanly.
|
|
34
|
+
*/
|
|
35
|
+
registerForPushNotifications(): Promise<PushRegistrationResult>;
|
|
30
36
|
getAdvertisingId(): Promise<AdvertisingIdResult>;
|
|
31
37
|
getInstallReferrer(): Promise<{
|
|
32
38
|
referrer: string | null;
|
|
@@ -50,6 +56,15 @@ export declare class ApexCapacitorWeb extends WebPlugin implements ApexCapacitor
|
|
|
50
56
|
}>;
|
|
51
57
|
endSession(): Promise<void>;
|
|
52
58
|
getCurrentSession(): Promise<SessionInfo>;
|
|
59
|
+
/**
|
|
60
|
+
* In-memory assignment cache. Keyed by experimentId; entry contains the
|
|
61
|
+
* result and the fetch timestamp. Never exceeds this set within a session.
|
|
62
|
+
*/
|
|
63
|
+
private assignmentCache;
|
|
64
|
+
getVariant(options: {
|
|
65
|
+
experimentId: string;
|
|
66
|
+
forceRefresh?: boolean;
|
|
67
|
+
}): Promise<VariantAssignmentResult>;
|
|
53
68
|
track(event: ApexEvent): Promise<void>;
|
|
54
69
|
getQueueSize(): Promise<QueueStatus>;
|
|
55
70
|
flushQueue(): Promise<FlushResult>;
|
package/dist/web.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,SAAS,EACT,SAAS,EACT,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,eAAe,
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,SAAS,EACT,SAAS,EACT,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,eAAe,EACf,uBAAuB,EACxB,MAAM,eAAe,CAAC;AAQvB,qBAAa,gBAAiB,SAAQ,SAAU,YAAW,mBAAmB;IAC5E,OAAO,CAAC,KAAK,CAAC,CAAe;IAC7B,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAS;IAEtB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCrD,4BAA4B,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,SAAS,CAAA;KAAE,CAAC;IAI9D,iBAAiB,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,SAAS,CAAA;KAAE,CAAC;IAIzD;;;;OAIG;IACG,4BAA4B,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAI/D,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIhD,kBAAkB,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAI1D,YAAY,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAO9C,YAAY,CAAC,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,qBAAqB,CAAC,QAAQ,EAAE;QACpC,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,eAAe,CAAC;KAC/B,GAAG,OAAO,CAAC,IAAI,CAAC;IAIX,kBAAkB,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAOrD,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC;IAiBpC,YAAY,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAM9C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC;IAQ/C;;;OAGG;IACH,OAAO,CAAC,eAAe,CAA2E;IAE5F,UAAU,CAAC,OAAO,EAAE;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAqD9B,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BtC,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;IASpC,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAMlC,WAAW,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzC,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,iBAAiB;CAK1B"}
|
package/dist/web.js
CHANGED
|
@@ -25,6 +25,11 @@ class ApexCapacitorWeb extends core_1.WebPlugin {
|
|
|
25
25
|
this.testMode = false;
|
|
26
26
|
this.debug = false;
|
|
27
27
|
this.initialized = false;
|
|
28
|
+
/**
|
|
29
|
+
* In-memory assignment cache. Keyed by experimentId; entry contains the
|
|
30
|
+
* result and the fetch timestamp. Never exceeds this set within a session.
|
|
31
|
+
*/
|
|
32
|
+
this.assignmentCache = new Map();
|
|
28
33
|
}
|
|
29
34
|
async initialize(options) {
|
|
30
35
|
if (this.initialized)
|
|
@@ -60,6 +65,14 @@ class ApexCapacitorWeb extends core_1.WebPlugin {
|
|
|
60
65
|
async getTrackingStatus() {
|
|
61
66
|
return { status: "authorized" };
|
|
62
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Web fallback for push registration. Real APNs/FCM tokens require
|
|
70
|
+
* the native runtime; in a browser context we report `denied` and
|
|
71
|
+
* return a null token so calling code can branch cleanly.
|
|
72
|
+
*/
|
|
73
|
+
async registerForPushNotifications() {
|
|
74
|
+
return { permission: "denied", token: null };
|
|
75
|
+
}
|
|
63
76
|
async getAdvertisingId() {
|
|
64
77
|
return { id: null, fallback: null };
|
|
65
78
|
}
|
|
@@ -117,6 +130,54 @@ class ApexCapacitorWeb extends core_1.WebPlugin {
|
|
|
117
130
|
startedAt: current?.startedAt ?? null,
|
|
118
131
|
};
|
|
119
132
|
}
|
|
133
|
+
async getVariant(options) {
|
|
134
|
+
this.ensureInitialized();
|
|
135
|
+
const { experimentId, forceRefresh } = options;
|
|
136
|
+
if (!forceRefresh) {
|
|
137
|
+
const cached = this.assignmentCache.get(experimentId);
|
|
138
|
+
if (cached)
|
|
139
|
+
return cached.result;
|
|
140
|
+
}
|
|
141
|
+
// The SDK calls the unified assign endpoint so it receives the rich
|
|
142
|
+
// mobile-surface payload alongside the variant key.
|
|
143
|
+
const apiUrl = this.sender?.getApiUrl() ?? "https://api.apex.inc";
|
|
144
|
+
const url = `${apiUrl.replace(/\/$/, "")}/api/experiments/${encodeURIComponent(experimentId)}/assign?unified=true&source=sdk`;
|
|
145
|
+
try {
|
|
146
|
+
const res = await fetch(url, {
|
|
147
|
+
method: "GET",
|
|
148
|
+
headers: { "x-apex-source": "sdk" },
|
|
149
|
+
});
|
|
150
|
+
const json = (await res.json());
|
|
151
|
+
const result = {
|
|
152
|
+
experimentId,
|
|
153
|
+
variant: json.variant ?? "control",
|
|
154
|
+
payload: json.payload ?? {},
|
|
155
|
+
eligible: json.eligible ?? false,
|
|
156
|
+
reason: json.reason,
|
|
157
|
+
};
|
|
158
|
+
const previous = this.assignmentCache.get(experimentId);
|
|
159
|
+
this.assignmentCache.set(experimentId, { result, at: Date.now() });
|
|
160
|
+
if (previous && previous.result.variant !== result.variant) {
|
|
161
|
+
// Emit assignmentChanged when a refresh flips the variant key.
|
|
162
|
+
this.notifyListeners("assignmentChanged", {
|
|
163
|
+
experimentId,
|
|
164
|
+
assignment: result,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
if (this.debug)
|
|
171
|
+
console.warn("[apex-capacitor] getVariant failed", err);
|
|
172
|
+
return {
|
|
173
|
+
experimentId,
|
|
174
|
+
variant: "control",
|
|
175
|
+
payload: {},
|
|
176
|
+
eligible: false,
|
|
177
|
+
reason: "not_found",
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
120
181
|
async track(event) {
|
|
121
182
|
this.ensureInitialized();
|
|
122
183
|
const sessionSnapshot = this.session.recordActivity();
|
package/dist/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAEH,0CAA4C;
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
//
|
|
2
|
+
// PushNotificationManager.swift
|
|
3
|
+
// Apex Capacitor Plugin (MMP-177)
|
|
4
|
+
//
|
|
5
|
+
// Wraps UNUserNotificationCenter authorization + UIApplication
|
|
6
|
+
// remote-notification registration. The plugin layer drives this; the
|
|
7
|
+
// device token arrives via NotificationCenter observers tied to the
|
|
8
|
+
// app's AppDelegate (the README documents the 3-line bridge snippet
|
|
9
|
+
// customers add). We considered method-swizzling for zero-config, but
|
|
10
|
+
// it's fragile around other push plugins, so the explicit bridge wins
|
|
11
|
+
// for now.
|
|
12
|
+
//
|
|
13
|
+
|
|
14
|
+
import Foundation
|
|
15
|
+
import UIKit
|
|
16
|
+
import UserNotifications
|
|
17
|
+
|
|
18
|
+
/// Notification names the plugin posts/observes for push lifecycle.
|
|
19
|
+
public enum ApexPushNotifications {
|
|
20
|
+
/// AppDelegate posts this with `userInfo: ["deviceToken": Data]` from
|
|
21
|
+
/// `application(_:didRegisterForRemoteNotificationsWithDeviceToken:)`.
|
|
22
|
+
public static let didRegister = Notification.Name("ApexCapacitor.didRegisterForRemoteNotifications")
|
|
23
|
+
/// AppDelegate posts this with `userInfo: ["error": Error]` from
|
|
24
|
+
/// `application(_:didFailToRegisterForRemoteNotificationsWithError:)`.
|
|
25
|
+
public static let didFail = Notification.Name("ApexCapacitor.didFailToRegisterForRemoteNotifications")
|
|
26
|
+
/// AppDelegate posts this with `userInfo: <push payload>` from
|
|
27
|
+
/// `application(_:didReceiveRemoteNotification:fetchCompletionHandler:)`
|
|
28
|
+
/// while the app is in the foreground.
|
|
29
|
+
public static let didReceive = Notification.Name("ApexCapacitor.didReceiveRemoteNotification")
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/// Map a raw APNs deviceToken `Data` to a 64-char lowercase hex string.
|
|
33
|
+
/// Pure function — extracted so unit tests don't need a real registration.
|
|
34
|
+
@objc public class PushTokenHexFormatter: NSObject {
|
|
35
|
+
@objc public static func format(_ data: Data) -> String {
|
|
36
|
+
return data.map { String(format: "%02x", $0) }.joined()
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/// Result returned to the plugin layer once registration completes.
|
|
41
|
+
public struct PushRegistrationOutcome {
|
|
42
|
+
public enum Permission: String {
|
|
43
|
+
case granted
|
|
44
|
+
case denied
|
|
45
|
+
case `default`
|
|
46
|
+
}
|
|
47
|
+
public let permission: Permission
|
|
48
|
+
public let token: String?
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/// Drives notification authorization + remote-notification registration,
|
|
52
|
+
/// then reports back via the completion handler when the device token
|
|
53
|
+
/// arrives (or registration is denied/fails).
|
|
54
|
+
public final class PushNotificationManager: NSObject {
|
|
55
|
+
|
|
56
|
+
public typealias Completion = (PushRegistrationOutcome) -> Void
|
|
57
|
+
|
|
58
|
+
private let center: UNUserNotificationCenter
|
|
59
|
+
private let application: UIApplication
|
|
60
|
+
private let notificationCenter: NotificationCenter
|
|
61
|
+
private var pendingCompletion: Completion?
|
|
62
|
+
|
|
63
|
+
public init(
|
|
64
|
+
center: UNUserNotificationCenter = .current(),
|
|
65
|
+
application: UIApplication = .shared,
|
|
66
|
+
notificationCenter: NotificationCenter = .default
|
|
67
|
+
) {
|
|
68
|
+
self.center = center
|
|
69
|
+
self.application = application
|
|
70
|
+
self.notificationCenter = notificationCenter
|
|
71
|
+
super.init()
|
|
72
|
+
observeAppDelegateBridge()
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
deinit {
|
|
76
|
+
notificationCenter.removeObserver(self)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// MARK: - Public API
|
|
80
|
+
|
|
81
|
+
public func requestAuthorizationAndRegister(completion: @escaping Completion) {
|
|
82
|
+
pendingCompletion = completion
|
|
83
|
+
center.requestAuthorization(options: [.alert, .badge, .sound]) { [weak self] granted, _ in
|
|
84
|
+
DispatchQueue.main.async {
|
|
85
|
+
guard let self = self else { return }
|
|
86
|
+
if granted {
|
|
87
|
+
self.application.registerForRemoteNotifications()
|
|
88
|
+
// Token will arrive via the AppDelegate bridge; pendingCompletion
|
|
89
|
+
// resolves there. If registration never completes we leave the
|
|
90
|
+
// Promise hanging — the wizard's UI handles the retry path.
|
|
91
|
+
} else {
|
|
92
|
+
self.resolvePending(.init(permission: .denied, token: nil))
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/// Synchronously read current authorization status without prompting.
|
|
99
|
+
public func currentStatus(completion: @escaping (PushRegistrationOutcome.Permission) -> Void) {
|
|
100
|
+
center.getNotificationSettings { settings in
|
|
101
|
+
DispatchQueue.main.async {
|
|
102
|
+
switch settings.authorizationStatus {
|
|
103
|
+
case .authorized, .provisional, .ephemeral:
|
|
104
|
+
completion(.granted)
|
|
105
|
+
case .denied:
|
|
106
|
+
completion(.denied)
|
|
107
|
+
case .notDetermined:
|
|
108
|
+
completion(.default)
|
|
109
|
+
@unknown default:
|
|
110
|
+
completion(.default)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// MARK: - AppDelegate bridge
|
|
117
|
+
|
|
118
|
+
private func observeAppDelegateBridge() {
|
|
119
|
+
notificationCenter.addObserver(
|
|
120
|
+
self,
|
|
121
|
+
selector: #selector(handleDidRegister(_:)),
|
|
122
|
+
name: ApexPushNotifications.didRegister,
|
|
123
|
+
object: nil
|
|
124
|
+
)
|
|
125
|
+
notificationCenter.addObserver(
|
|
126
|
+
self,
|
|
127
|
+
selector: #selector(handleDidFail(_:)),
|
|
128
|
+
name: ApexPushNotifications.didFail,
|
|
129
|
+
object: nil
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@objc private func handleDidRegister(_ note: Notification) {
|
|
134
|
+
guard let data = note.userInfo?["deviceToken"] as? Data else {
|
|
135
|
+
resolvePending(.init(permission: .granted, token: nil))
|
|
136
|
+
return
|
|
137
|
+
}
|
|
138
|
+
let hex = PushTokenHexFormatter.format(data)
|
|
139
|
+
resolvePending(.init(permission: .granted, token: hex))
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
@objc private func handleDidFail(_: Notification) {
|
|
143
|
+
resolvePending(.init(permission: .granted, token: nil))
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private func resolvePending(_ outcome: PushRegistrationOutcome) {
|
|
147
|
+
let completion = pendingCompletion
|
|
148
|
+
pendingCompletion = nil
|
|
149
|
+
completion?(outcome)
|
|
150
|
+
}
|
|
151
|
+
}
|
|
@@ -23,6 +23,7 @@ public class ApexCapacitorPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
|
23
23
|
CAPPluginMethod(name: "initialize", returnType: CAPPluginReturnPromise),
|
|
24
24
|
CAPPluginMethod(name: "requestTrackingAuthorization", returnType: CAPPluginReturnPromise),
|
|
25
25
|
CAPPluginMethod(name: "getTrackingStatus", returnType: CAPPluginReturnPromise),
|
|
26
|
+
CAPPluginMethod(name: "registerForPushNotifications", returnType: CAPPluginReturnPromise),
|
|
26
27
|
CAPPluginMethod(name: "getAdvertisingId", returnType: CAPPluginReturnPromise),
|
|
27
28
|
CAPPluginMethod(name: "getInstallReferrer", returnType: CAPPluginReturnPromise),
|
|
28
29
|
CAPPluginMethod(name: "getVisitorId", returnType: CAPPluginReturnPromise),
|
|
@@ -46,6 +47,7 @@ public class ApexCapacitorPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
|
46
47
|
private var deviceInfo = DeviceInfo()
|
|
47
48
|
private var deepLinks = DeepLinkManager()
|
|
48
49
|
private var adIds = AdvertisingIdProvider()
|
|
50
|
+
private lazy var pushManager = PushNotificationManager()
|
|
49
51
|
private lazy var sessionManager: NativeSessionManager = {
|
|
50
52
|
return NativeSessionManager(
|
|
51
53
|
onStart: { [weak self] snapshot in
|
|
@@ -64,6 +66,8 @@ public class ApexCapacitorPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
|
64
66
|
private var visitorId: String = ""
|
|
65
67
|
private var testMode = false
|
|
66
68
|
private var debug = false
|
|
69
|
+
private var apiBaseUrl: String = ""
|
|
70
|
+
private var projectKey: String = ""
|
|
67
71
|
|
|
68
72
|
public override func load() {
|
|
69
73
|
let defaults = UserDefaults.standard
|
|
@@ -73,16 +77,42 @@ public class ApexCapacitorPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
|
73
77
|
deepLinks.setWarmLinkHandler { [weak self] url in
|
|
74
78
|
self?.notifyListeners("deepLink", data: ["url": url.absoluteString])
|
|
75
79
|
}
|
|
80
|
+
|
|
81
|
+
// MMP-177 — observe foreground pushes posted by the app's
|
|
82
|
+
// AppDelegate via the bridge notification.
|
|
83
|
+
NotificationCenter.default.addObserver(
|
|
84
|
+
self,
|
|
85
|
+
selector: #selector(handlePushReceivedNotification(_:)),
|
|
86
|
+
name: ApexPushNotifications.didReceive,
|
|
87
|
+
object: nil
|
|
88
|
+
)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@objc private func handlePushReceivedNotification(_ note: Notification) {
|
|
92
|
+
guard let userInfo = note.userInfo else { return }
|
|
93
|
+
let aps = userInfo["aps"] as? [String: Any]
|
|
94
|
+
let alert = aps?["alert"] as? [String: Any]
|
|
95
|
+
var payload: [String: Any] = ["raw": userInfo]
|
|
96
|
+
if let title = alert?["title"] as? String { payload["title"] = title }
|
|
97
|
+
if let body = alert?["body"] as? String { payload["body"] = body }
|
|
98
|
+
var data: [String: Any] = [:]
|
|
99
|
+
for (k, v) in userInfo where k as? String != "aps" {
|
|
100
|
+
if let key = k as? String { data[key] = v }
|
|
101
|
+
}
|
|
102
|
+
if !data.isEmpty { payload["data"] = data }
|
|
103
|
+
notifyListeners("pushReceived", data: payload)
|
|
76
104
|
}
|
|
77
105
|
|
|
78
106
|
// MARK: - Lifecycle
|
|
79
107
|
|
|
80
108
|
@objc public func initialize(_ call: CAPPluginCall) {
|
|
81
|
-
let
|
|
82
|
-
if
|
|
109
|
+
let pk = call.getString("projectKey") ?? ""
|
|
110
|
+
if pk.isEmpty {
|
|
83
111
|
call.reject("projectKey is required")
|
|
84
112
|
return
|
|
85
113
|
}
|
|
114
|
+
projectKey = pk
|
|
115
|
+
apiBaseUrl = call.getString("apiUrl") ?? "https://api.apex.inc"
|
|
86
116
|
testMode = call.getBool("testMode") ?? false
|
|
87
117
|
debug = call.getBool("debug") ?? false
|
|
88
118
|
let queueDir = FileManager.default
|
|
@@ -109,6 +139,68 @@ public class ApexCapacitorPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
|
109
139
|
call.resolve(["status": attManager.currentStatus().rawValue])
|
|
110
140
|
}
|
|
111
141
|
|
|
142
|
+
// MARK: - Push Notifications (MMP-177)
|
|
143
|
+
|
|
144
|
+
@objc public func registerForPushNotifications(_ call: CAPPluginCall) {
|
|
145
|
+
pushManager.requestAuthorizationAndRegister { [weak self] outcome in
|
|
146
|
+
guard let self = self else {
|
|
147
|
+
call.resolve(["permission": outcome.permission.rawValue, "token": outcome.token as Any])
|
|
148
|
+
return
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Surface the token to JS subscribers.
|
|
152
|
+
if let token = outcome.token {
|
|
153
|
+
self.notifyListeners("pushTokenReceived", data: [
|
|
154
|
+
"token": token,
|
|
155
|
+
"platform": "ios"
|
|
156
|
+
])
|
|
157
|
+
// Auto-register with the Apex backend so the dashboard
|
|
158
|
+
// sees this device immediately. The wizard relies on
|
|
159
|
+
// this so the test-push step finds a registered token
|
|
160
|
+
// without the customer wiring anything explicitly.
|
|
161
|
+
self.registerTokenWithApex(token: token)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
call.resolve([
|
|
165
|
+
"permission": outcome.permission.rawValue,
|
|
166
|
+
"token": outcome.token as Any
|
|
167
|
+
])
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private func registerTokenWithApex(token: String) {
|
|
172
|
+
guard !apiBaseUrl.isEmpty, !projectKey.isEmpty else {
|
|
173
|
+
if debug { print("[apex-capacitor] skipping push-token registration: plugin not initialized") }
|
|
174
|
+
return
|
|
175
|
+
}
|
|
176
|
+
guard let url = URL(string: "\(apiBaseUrl)/api/mobile/push-token") else { return }
|
|
177
|
+
let bundleId = Bundle.main.bundleIdentifier ?? ""
|
|
178
|
+
let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "0.0.0"
|
|
179
|
+
let body: [String: Any] = [
|
|
180
|
+
"projectKey": projectKey,
|
|
181
|
+
"visitorId": visitorId,
|
|
182
|
+
"platform": "ios",
|
|
183
|
+
"token": token,
|
|
184
|
+
"bundleId": bundleId,
|
|
185
|
+
"sdkVersion": "0.3.0",
|
|
186
|
+
"appVersion": appVersion
|
|
187
|
+
]
|
|
188
|
+
guard let data = try? JSONSerialization.data(withJSONObject: body) else { return }
|
|
189
|
+
var request = URLRequest(url: url)
|
|
190
|
+
request.httpMethod = "POST"
|
|
191
|
+
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
|
192
|
+
request.httpBody = data
|
|
193
|
+
URLSession.shared.dataTask(with: request) { [weak self] _, response, error in
|
|
194
|
+
if let error = error {
|
|
195
|
+
if self?.debug == true { print("[apex-capacitor] push-token registration error: \(error)") }
|
|
196
|
+
return
|
|
197
|
+
}
|
|
198
|
+
if let http = response as? HTTPURLResponse, http.statusCode != 200 {
|
|
199
|
+
if self?.debug == true { print("[apex-capacitor] push-token registration HTTP \(http.statusCode)") }
|
|
200
|
+
}
|
|
201
|
+
}.resume()
|
|
202
|
+
}
|
|
203
|
+
|
|
112
204
|
// MARK: - Identifiers
|
|
113
205
|
|
|
114
206
|
@objc public func getAdvertisingId(_ call: CAPPluginCall) {
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
//
|
|
2
|
+
// PushNotificationManagerTests.swift
|
|
3
|
+
// Apex Capacitor Plugin (MMP-177)
|
|
4
|
+
//
|
|
5
|
+
// Tests the pure helper (`PushTokenHexFormatter`) and the
|
|
6
|
+
// AppDelegate-bridge → completion flow without spinning up a real
|
|
7
|
+
// notification center. Manager-level tests cover the only branching
|
|
8
|
+
// logic we actually own (denied path, registration success/fail).
|
|
9
|
+
//
|
|
10
|
+
|
|
11
|
+
import XCTest
|
|
12
|
+
@testable import ApexCapacitorPlugin
|
|
13
|
+
|
|
14
|
+
final class PushNotificationManagerTests: XCTestCase {
|
|
15
|
+
|
|
16
|
+
// MARK: - Token hex formatting
|
|
17
|
+
|
|
18
|
+
func testFormatProducesLowercaseHex() {
|
|
19
|
+
let bytes: [UInt8] = [0xDE, 0xAD, 0xBE, 0xEF]
|
|
20
|
+
let data = Data(bytes)
|
|
21
|
+
let hex = PushTokenHexFormatter.format(data)
|
|
22
|
+
XCTAssertEqual(hex, "deadbeef")
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
func testFormatPadsSingleDigitBytes() {
|
|
26
|
+
let bytes: [UInt8] = [0x01, 0x02, 0x0A, 0x0F]
|
|
27
|
+
let data = Data(bytes)
|
|
28
|
+
let hex = PushTokenHexFormatter.format(data)
|
|
29
|
+
XCTAssertEqual(hex, "01020a0f")
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
func testFormatHandlesEmptyData() {
|
|
33
|
+
XCTAssertEqual(PushTokenHexFormatter.format(Data()), "")
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
func testFormatProducesExpected64CharLengthFor32ByteToken() {
|
|
37
|
+
let data = Data(repeating: 0xAB, count: 32)
|
|
38
|
+
let hex = PushTokenHexFormatter.format(data)
|
|
39
|
+
XCTAssertEqual(hex.count, 64)
|
|
40
|
+
XCTAssertTrue(hex.allSatisfy { "0123456789abcdef".contains($0) })
|
|
41
|
+
}
|
|
42
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apex-inc/capacitor-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Apex Capacitor plugin — iOS/Android attribution, events, deep linking, SKAN, and offline-tolerant tracking for Capacitor apps.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|