react-native-radar 4.32.0 → 4.34.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.
Files changed (43) hide show
  1. package/android/src/newarch/java/com/radar/RadarModule.kt +33 -2
  2. package/android/src/oldarch/java/com/radar/RadarModule.java +10 -2
  3. package/dist/@types/RadarNativeInterface.d.ts +1 -0
  4. package/dist/NativeRadar.d.ts +1 -0
  5. package/dist/helpers.d.ts +1 -0
  6. package/dist/helpers.js +3 -1
  7. package/dist/index.native.js +3 -0
  8. package/dist/ui/map.jsx +32 -4
  9. package/dist/version.d.ts +1 -1
  10. package/dist/version.js +1 -1
  11. package/ios/RNRadar.h +3 -2
  12. package/ios/RNRadar.mm +22 -2
  13. package/ios/RadarSDK.xcframework/Info.plist +5 -5
  14. package/ios/RadarSDK.xcframework/ios-arm64/RadarSDK.framework/Headers/Radar.h +34 -1
  15. package/ios/RadarSDK.xcframework/ios-arm64/RadarSDK.framework/Headers/RadarInitializeOptions.h +5 -0
  16. package/ios/RadarSDK.xcframework/ios-arm64/RadarSDK.framework/Headers/RadarSDKFraudProtocol.h +2 -0
  17. package/ios/RadarSDK.xcframework/ios-arm64/RadarSDK.framework/Headers/RadarSdkConfiguration.h +2 -0
  18. package/ios/RadarSDK.xcframework/ios-arm64/RadarSDK.framework/Headers/RadarVerifiedDelegate.h +16 -0
  19. package/ios/RadarSDK.xcframework/ios-arm64/RadarSDK.framework/Info.plist +0 -0
  20. package/ios/RadarSDK.xcframework/ios-arm64/RadarSDK.framework/Modules/RadarSDK.swiftmodule/arm64-apple-ios.abi.json +121 -76
  21. package/ios/RadarSDK.xcframework/ios-arm64/RadarSDK.framework/RadarSDK +0 -0
  22. package/ios/RadarSDK.xcframework/ios-arm64_x86_64-simulator/RadarSDK.framework/Headers/Radar.h +34 -1
  23. package/ios/RadarSDK.xcframework/ios-arm64_x86_64-simulator/RadarSDK.framework/Headers/RadarInitializeOptions.h +5 -0
  24. package/ios/RadarSDK.xcframework/ios-arm64_x86_64-simulator/RadarSDK.framework/Headers/RadarSDKFraudProtocol.h +2 -0
  25. package/ios/RadarSDK.xcframework/ios-arm64_x86_64-simulator/RadarSDK.framework/Headers/RadarSdkConfiguration.h +2 -0
  26. package/ios/RadarSDK.xcframework/ios-arm64_x86_64-simulator/RadarSDK.framework/Headers/RadarVerifiedDelegate.h +16 -0
  27. package/ios/RadarSDK.xcframework/ios-arm64_x86_64-simulator/RadarSDK.framework/Info.plist +0 -0
  28. package/ios/RadarSDK.xcframework/ios-arm64_x86_64-simulator/RadarSDK.framework/Modules/RadarSDK.swiftmodule/arm64-apple-ios-simulator.abi.json +121 -76
  29. package/ios/RadarSDK.xcframework/ios-arm64_x86_64-simulator/RadarSDK.framework/Modules/RadarSDK.swiftmodule/x86_64-apple-ios-simulator.abi.json +121 -76
  30. package/ios/RadarSDK.xcframework/ios-arm64_x86_64-simulator/RadarSDK.framework/RadarSDK +0 -0
  31. package/ios/RadarSDK.xcframework/ios-arm64_x86_64-simulator/RadarSDK.framework/_CodeSignature/CodeDirectory +0 -0
  32. package/ios/RadarSDK.xcframework/ios-arm64_x86_64-simulator/RadarSDK.framework/_CodeSignature/CodeResources +19 -19
  33. package/ios/RadarSDKMotion.xcframework/ios-arm64/RadarSDKMotion.framework/Info.plist +0 -0
  34. package/ios/RadarSDKMotion.xcframework/ios-arm64_x86_64-simulator/RadarSDKMotion.framework/Info.plist +0 -0
  35. package/ios/RadarSDKMotion.xcframework/ios-arm64_x86_64-simulator/RadarSDKMotion.framework/_CodeSignature/CodeDirectory +0 -0
  36. package/ios/RadarSDKMotion.xcframework/ios-arm64_x86_64-simulator/RadarSDKMotion.framework/_CodeSignature/CodeResources +1 -1
  37. package/package.json +1 -1
  38. package/src/@types/RadarNativeInterface.ts +1 -0
  39. package/src/NativeRadar.ts +1 -0
  40. package/src/helpers.js +5 -1
  41. package/src/index.native.ts +3 -0
  42. package/src/ui/map.jsx +32 -4
  43. package/src/version.ts +1 -1
@@ -40,9 +40,12 @@ import org.json.JSONObject
40
40
  @ReactModule(name = RadarModule.NAME)
41
41
  class RadarModule(reactContext: ReactApplicationContext) :
42
42
  NativeRadarSpec(reactContext), PermissionListener {
43
+ @Volatile
44
+ private var isInvalidated = false
43
45
 
44
46
  private val radarReceiver = object : RadarReceiver() {
45
47
  override fun onEventsReceived(context: Context, events: Array<RadarEvent>, user: RadarUser?) {
48
+ if (isInvalidated) return
46
49
  val eventBlob = Arguments.createMap().apply {
47
50
  var eventsArray = Arguments.createArray()
48
51
  for (event in events) {
@@ -57,6 +60,7 @@ class RadarModule(reactContext: ReactApplicationContext) :
57
60
  }
58
61
 
59
62
  override fun onLocationUpdated(context: Context, location: Location, user: RadarUser) {
63
+ if (isInvalidated) return
60
64
  val eventBlob = Arguments.createMap().apply {
61
65
  putString("location", Radar.jsonForLocation(location).toString())
62
66
  putString("user", user.toJson().toString())
@@ -65,6 +69,7 @@ class RadarModule(reactContext: ReactApplicationContext) :
65
69
  }
66
70
 
67
71
  override fun onClientLocationUpdated(context: Context, location: Location, stopped: Boolean, source: Radar.RadarLocationSource) {
72
+ if (isInvalidated) return
68
73
  val eventBlob = Arguments.createMap().apply {
69
74
  putString("location", Radar.jsonForLocation(location).toString())
70
75
  putBoolean("stopped", stopped)
@@ -74,6 +79,7 @@ class RadarModule(reactContext: ReactApplicationContext) :
74
79
  }
75
80
 
76
81
  override fun onError(context: Context, status: Radar.RadarStatus) {
82
+ if (isInvalidated) return
77
83
  val eventBlob = Arguments.createMap().apply {
78
84
  putString("status", status.toString())
79
85
  }
@@ -81,6 +87,7 @@ class RadarModule(reactContext: ReactApplicationContext) :
81
87
  }
82
88
 
83
89
  override fun onLog(context: Context, message: String) {
90
+ if (isInvalidated) return
84
91
  val eventBlob = Arguments.createMap().apply {
85
92
  putString("message", message)
86
93
  }
@@ -90,6 +97,7 @@ class RadarModule(reactContext: ReactApplicationContext) :
90
97
 
91
98
  private val radarInAppMessageReceiver = object : RadarInAppMessageReceiver {
92
99
  override fun onNewInAppMessage(message: RadarInAppMessage) {
100
+ if (isInvalidated) return
93
101
  try {
94
102
  val eventBlob = Arguments.createMap().apply {
95
103
  putMap("inAppMessage", RadarUtils.mapForJson(JSONObject(message.toJson())))
@@ -101,6 +109,7 @@ class RadarModule(reactContext: ReactApplicationContext) :
101
109
  }
102
110
 
103
111
  override fun onInAppMessageDismissed(message: RadarInAppMessage) {
112
+ if (isInvalidated) return
104
113
  try {
105
114
  val eventBlob = Arguments.createMap().apply {
106
115
  putMap("inAppMessage", RadarUtils.mapForJson(JSONObject(message.toJson())))
@@ -112,6 +121,7 @@ class RadarModule(reactContext: ReactApplicationContext) :
112
121
  }
113
122
 
114
123
  override fun onInAppMessageButtonClicked(message: RadarInAppMessage) {
124
+ if (isInvalidated) return
115
125
  try {
116
126
  val eventBlob = Arguments.createMap().apply {
117
127
  putMap("inAppMessage", RadarUtils.mapForJson(JSONObject(message.toJson())))
@@ -125,6 +135,7 @@ class RadarModule(reactContext: ReactApplicationContext) :
125
135
 
126
136
  private val radarVerifiedReceiver = object : RadarVerifiedReceiver() {
127
137
  override fun onTokenUpdated(context: Context, token: RadarVerifiedLocationToken) {
138
+ if (isInvalidated) return
128
139
  val eventBlob = Arguments.createMap().apply {
129
140
  putString("token", token.toJson().toString())
130
141
  }
@@ -140,10 +151,26 @@ class RadarModule(reactContext: ReactApplicationContext) :
140
151
  return NAME
141
152
  }
142
153
 
154
+ override fun invalidate() {
155
+ isInvalidated = true
156
+
157
+ // Detach from the process-level Radar singleton so this stale module
158
+ // instance stops receiving callbacks after its JS runtime is gone.
159
+ Radar.setReceiver(null)
160
+
161
+ try {
162
+ Radar.setVerifiedReceiver(null)
163
+ } catch (e: Exception) {
164
+ Log.e(TAG, "Error detaching verified receiver", e)
165
+ }
166
+
167
+ super.invalidate()
168
+ }
169
+
143
170
  override fun initialize(publishableKey: String, fraud: Boolean, options: ReadableMap?): Unit {
144
171
  val editor = reactApplicationContext.getSharedPreferences("RadarSDK", Context.MODE_PRIVATE).edit()
145
172
  editor.putString("x_platform_sdk_type", "ReactNative")
146
- editor.putString("x_platform_sdk_version", "4.32.0")
173
+ editor.putString("x_platform_sdk_version", "4.34.0")
147
174
  editor.apply()
148
175
 
149
176
  Radar.initialize(reactApplicationContext, publishableKey, radarReceiver, Radar.RadarLocationServicesProvider.GOOGLE, fraud, null, radarInAppMessageReceiver, currentActivity)
@@ -155,7 +182,7 @@ class RadarModule(reactContext: ReactApplicationContext) :
155
182
  override fun initializeWithAuthToken(authToken: String, fraud: Boolean, options: ReadableMap?): Unit {
156
183
  val editor = reactApplicationContext.getSharedPreferences("RadarSDK", Context.MODE_PRIVATE).edit()
157
184
  editor.putString("x_platform_sdk_type", "ReactNative")
158
- editor.putString("x_platform_sdk_version", "4.32.0")
185
+ editor.putString("x_platform_sdk_version", "4.34.0")
159
186
  editor.apply()
160
187
 
161
188
  val initOptions = io.radar.sdk.RadarInitializeOptions.builder()
@@ -456,6 +483,10 @@ class RadarModule(reactContext: ReactApplicationContext) :
456
483
  radarModuleImpl.getPublishableKey(promise)
457
484
  }
458
485
 
486
+ override fun getMobileOrigin(promise: Promise): Unit {
487
+ promise.resolve(reactApplicationContext.packageName)
488
+ }
489
+
459
490
  override fun showInAppMessage(inAppMessage: ReadableMap): Unit {
460
491
  radarModuleImpl.showInAppMessage(inAppMessage)
461
492
  }
@@ -102,7 +102,7 @@ public class RadarModule extends ReactContextBaseJavaModule implements Permissio
102
102
  this.fraud = fraud;
103
103
  SharedPreferences.Editor editor = getReactApplicationContext().getSharedPreferences("RadarSDK", Context.MODE_PRIVATE).edit();
104
104
  editor.putString("x_platform_sdk_type", "ReactNative");
105
- editor.putString("x_platform_sdk_version", "4.32.0");
105
+ editor.putString("x_platform_sdk_version", "4.34.0");
106
106
  editor.apply();
107
107
  Radar.initialize(getReactApplicationContext(), publishableKey, receiver, Radar.RadarLocationServicesProvider.GOOGLE, fraud, null, inAppMessageReceiver, getCurrentActivity());
108
108
  if (fraud) {
@@ -115,7 +115,7 @@ public class RadarModule extends ReactContextBaseJavaModule implements Permissio
115
115
  this.fraud = fraud;
116
116
  SharedPreferences.Editor editor = getReactApplicationContext().getSharedPreferences("RadarSDK", Context.MODE_PRIVATE).edit();
117
117
  editor.putString("x_platform_sdk_type", "ReactNative");
118
- editor.putString("x_platform_sdk_version", "4.32.0");
118
+ editor.putString("x_platform_sdk_version", "4.34.0");
119
119
  editor.apply();
120
120
 
121
121
  io.radar.sdk.RadarInitializeOptions.Builder builder = io.radar.sdk.RadarInitializeOptions.builder()
@@ -474,6 +474,14 @@ public class RadarModule extends ReactContextBaseJavaModule implements Permissio
474
474
  radarModuleImpl.getPublishableKey(promise);
475
475
  }
476
476
 
477
+ @ReactMethod
478
+ public void getMobileOrigin(final Promise promise) {
479
+ if (promise == null) {
480
+ return;
481
+ }
482
+ promise.resolve(getReactApplicationContext().getPackageName());
483
+ }
484
+
477
485
  @ReactMethod
478
486
  public void showInAppMessage(ReadableMap inAppMessageMap) {
479
487
  radarModuleImpl.showInAppMessage(inAppMessageMap);
@@ -75,4 +75,5 @@ export interface RadarNativeInterface {
75
75
  onInAppMessageClicked: (callback: RadarInAppMessageClickedCallback | null) => void;
76
76
  getHost: () => Promise<string>;
77
77
  getPublishableKey: () => Promise<string>;
78
+ getMobileOrigin: () => Promise<string>;
78
79
  }
@@ -92,6 +92,7 @@ export interface Spec extends TurboModule {
92
92
  nativeSdkVersion(): Promise<string>;
93
93
  getHost(): Promise<string>;
94
94
  getPublishableKey(): Promise<string>;
95
+ getMobileOrigin(): Promise<string>;
95
96
  showInAppMessage(inAppMessage: Object): void;
96
97
  setPushNotificationToken(token: string): void;
97
98
  isInitialized(): Promise<boolean>;
package/dist/helpers.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export function getHost(): Promise<string>;
2
2
  export function getPublishableKey(): Promise<string>;
3
+ export function getMobileOrigin(): Promise<string>;
package/dist/helpers.js CHANGED
@@ -3,9 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getPublishableKey = exports.getHost = void 0;
6
+ exports.getMobileOrigin = exports.getPublishableKey = exports.getHost = void 0;
7
7
  const index_native_1 = __importDefault(require("./index.native"));
8
8
  const getHost = () => (index_native_1.default.getHost());
9
9
  exports.getHost = getHost;
10
10
  const getPublishableKey = () => (index_native_1.default.getPublishableKey());
11
11
  exports.getPublishableKey = getPublishableKey;
12
+ const getMobileOrigin = () => (index_native_1.default.getMobileOrigin());
13
+ exports.getMobileOrigin = getMobileOrigin;
@@ -388,6 +388,9 @@ const Radar = {
388
388
  getPublishableKey: function () {
389
389
  return NativeRadar.getPublishableKey();
390
390
  },
391
+ getMobileOrigin: function () {
392
+ return NativeRadar.getMobileOrigin();
393
+ },
391
394
  isInitialized: function () {
392
395
  return NativeRadar.isInitialized();
393
396
  },
package/dist/ui/map.jsx CHANGED
@@ -1,23 +1,26 @@
1
1
  import React, { useState, useEffect } from 'react';
2
2
  import { View, Image } from 'react-native';
3
3
  import Radar from '../index.native';
4
- import { getHost, getPublishableKey } from '../helpers';
4
+ import { getHost, getPublishableKey, getMobileOrigin } from '../helpers';
5
5
  import styles from './styles';
6
6
 
7
7
  let MapLibreGL;
8
8
  let MapLibreMap;
9
9
  let GeoJSONSource;
10
10
  let Layer;
11
+ let TransformRequestManager;
11
12
  try {
12
13
  MapLibreGL = require('@maplibre/maplibre-react-native');
13
14
  MapLibreMap = MapLibreGL.Map;
14
15
  GeoJSONSource = MapLibreGL.GeoJSONSource;
15
16
  Layer = MapLibreGL.Layer;
17
+ TransformRequestManager = MapLibreGL.TransformRequestManager;
16
18
  } catch (e) {
17
19
  MapLibreGL = null;
18
20
  MapLibreMap = null;
19
21
  GeoJSONSource = null;
20
22
  Layer = null;
23
+ TransformRequestManager = null;
21
24
  }
22
25
 
23
26
  const DEFAULT_STYLE = 'radar-default-v1';
@@ -49,10 +52,35 @@ const RadarMap = ({ mapOptions, children }) => {
49
52
  const [userLocation, setUserLocation] = useState(null);
50
53
 
51
54
  useEffect(() => {
52
- createStyleURL(mapOptions?.mapStyle || DEFAULT_STYLE).then((result) => {
55
+ const setup = async () => {
56
+ const host = await getHost();
57
+
58
+ if (TransformRequestManager) {
59
+ try {
60
+ const mobileOrigin = await getMobileOrigin();
61
+ if (mobileOrigin) {
62
+ const mapHostPattern = `${host
63
+ .replace(/^https?:\/\//, '')
64
+ .replace(/\./g, '\\.')}/maps/`;
65
+ TransformRequestManager.addHeader({
66
+ id: 'radar-mobile-origin',
67
+ name: 'X-Radar-Mobile-Origin',
68
+ value: mobileOrigin,
69
+ match: mapHostPattern,
70
+ });
71
+ }
72
+ } catch (err) {
73
+ // eslint-disable-next-line no-console
74
+ console.warn(`Radar SDK: Failed to set mobile origin header: ${err}`);
75
+ }
76
+ }
77
+
78
+ const result = await createStyleURL(mapOptions?.mapStyle || DEFAULT_STYLE);
53
79
  setStyleURL(result);
54
- });
55
- }, [mapOptions]);
80
+ };
81
+
82
+ setup();
83
+ }, [mapOptions?.mapStyle]);
56
84
 
57
85
  useEffect(() => {
58
86
  Radar.getLocation().then((result) => {
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "4.32.0";
1
+ export declare const VERSION = "4.34.0";
package/dist/version.js CHANGED
@@ -3,4 +3,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  // This file contains the version of the react-native-radar package
5
5
  // It should be updated to match the version in package.json
6
- exports.VERSION = '4.32.0';
6
+ exports.VERSION = '4.34.0';
package/ios/RNRadar.h CHANGED
@@ -6,11 +6,12 @@
6
6
 
7
7
  #import <RadarSDK/RadarSDK.h>
8
8
  #import <React/RCTBridgeModule.h>
9
+ #import <React/RCTInvalidating.h>
9
10
 
10
11
  #ifdef RCT_NEW_ARCH_ENABLED
11
- @interface RNRadar : NativeRadarSpecBase <NativeRadarSpec, RadarDelegate, CLLocationManagerDelegate, RadarVerifiedDelegate, RadarInAppMessageProtocol>
12
+ @interface RNRadar : NativeRadarSpecBase <NativeRadarSpec, RadarDelegate, CLLocationManagerDelegate, RadarVerifiedDelegate, RadarInAppMessageProtocol, RCTInvalidating>
12
13
  #else
13
- @interface RNRadar : RCTEventEmitter <RCTBridgeModule, RadarDelegate, CLLocationManagerDelegate, RadarVerifiedDelegate, RadarInAppMessageProtocol>
14
+ @interface RNRadar : RCTEventEmitter <RCTBridgeModule, RadarDelegate, CLLocationManagerDelegate, RadarVerifiedDelegate, RadarInAppMessageProtocol, RCTInvalidating>
14
15
  #endif
15
16
 
16
17
  @end
package/ios/RNRadar.mm CHANGED
@@ -55,6 +55,22 @@ RCT_EXPORT_MODULE()
55
55
  hasListeners = NO;
56
56
  }
57
57
 
58
+ - (void)invalidate {
59
+ #ifdef RCT_NEW_ARCH_ENABLED
60
+ jsEventEmitterReady = NO;
61
+ #endif
62
+ hasListeners = NO;
63
+
64
+ // Detach from the process-level Radar singleton so a stale module
65
+ // instance doesn't continue to receive events.
66
+ [Radar setDelegate:nil];
67
+ [Radar setVerifiedDelegate:nil];
68
+ [Radar setInAppMessageDelegate:nil];
69
+
70
+ locationManager.delegate = nil;
71
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
72
+ }
73
+
58
74
  #ifdef RCT_NEW_ARCH_ENABLED
59
75
  - (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper {
60
76
  [super setEventEmitterCallback:eventEmitterCallbackWrapper];
@@ -217,7 +233,7 @@ RCT_EXPORT_MODULE()
217
233
  RCT_EXPORT_METHOD(initialize:(NSString *)publishableKey fraud:(BOOL)fraud options:(NSDictionary *)options) {
218
234
  _publishableKey = publishableKey;
219
235
  [[NSUserDefaults standardUserDefaults] setObject:@"ReactNative" forKey:@"radar-xPlatformSDKType"];
220
- [[NSUserDefaults standardUserDefaults] setObject:@"4.32.0" forKey:@"radar-xPlatformSDKVersion"];
236
+ [[NSUserDefaults standardUserDefaults] setObject:@"4.34.0" forKey:@"radar-xPlatformSDKVersion"];
221
237
 
222
238
  RadarInitializeOptions *radarOptions = [[RadarInitializeOptions alloc] init];
223
239
  if (options != nil) {
@@ -240,7 +256,7 @@ RCT_EXPORT_METHOD(initialize:(NSString *)publishableKey fraud:(BOOL)fraud option
240
256
  RCT_EXPORT_METHOD(initializeWithAuthToken:(NSString *)authToken fraud:(BOOL)fraud options:(NSDictionary *)options) {
241
257
  _publishableKey = nil;
242
258
  [[NSUserDefaults standardUserDefaults] setObject:@"ReactNative" forKey:@"radar-xPlatformSDKType"];
243
- [[NSUserDefaults standardUserDefaults] setObject:@"4.32.0" forKey:@"radar-xPlatformSDKVersion"];
259
+ [[NSUserDefaults standardUserDefaults] setObject:@"4.34.0" forKey:@"radar-xPlatformSDKVersion"];
244
260
  RadarInitializeOptions *radarOptions = [[RadarInitializeOptions alloc] init];
245
261
  if (options != nil) {
246
262
  id silentPushValue = options[@"silentPush"];
@@ -335,6 +351,10 @@ RCT_EXPORT_METHOD(getPublishableKey:(RCTPromiseResolveBlock)resolve reject:(RCTP
335
351
  resolve(_publishableKey);
336
352
  }
337
353
 
354
+ RCT_EXPORT_METHOD(getMobileOrigin:(RCTPromiseResolveBlock) resolve reject:(RCTPromiseRejectBlock)reject) {
355
+ resolve([[NSBundle mainBundle] bundleIdentifier]);
356
+ }
357
+
338
358
  RCT_EXPORT_METHOD(getPermissionsStatus:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
339
359
  CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
340
360
  NSString *statusStr;
@@ -8,32 +8,32 @@
8
8
  <key>BinaryPath</key>
9
9
  <string>RadarSDK.framework/RadarSDK</string>
10
10
  <key>LibraryIdentifier</key>
11
- <string>ios-arm64</string>
11
+ <string>ios-arm64_x86_64-simulator</string>
12
12
  <key>LibraryPath</key>
13
13
  <string>RadarSDK.framework</string>
14
14
  <key>SupportedArchitectures</key>
15
15
  <array>
16
16
  <string>arm64</string>
17
+ <string>x86_64</string>
17
18
  </array>
18
19
  <key>SupportedPlatform</key>
19
20
  <string>ios</string>
21
+ <key>SupportedPlatformVariant</key>
22
+ <string>simulator</string>
20
23
  </dict>
21
24
  <dict>
22
25
  <key>BinaryPath</key>
23
26
  <string>RadarSDK.framework/RadarSDK</string>
24
27
  <key>LibraryIdentifier</key>
25
- <string>ios-arm64_x86_64-simulator</string>
28
+ <string>ios-arm64</string>
26
29
  <key>LibraryPath</key>
27
30
  <string>RadarSDK.framework</string>
28
31
  <key>SupportedArchitectures</key>
29
32
  <array>
30
33
  <string>arm64</string>
31
- <string>x86_64</string>
32
34
  </array>
33
35
  <key>SupportedPlatform</key>
34
36
  <string>ios</string>
35
- <key>SupportedPlatformVariant</key>
36
- <string>simulator</string>
37
37
  </dict>
38
38
  </array>
39
39
  <key>CFBundlePackageType</key>
@@ -284,6 +284,15 @@ typedef void (^_Nonnull RadarGeocodeCompletionHandler)(RadarStatus status, NSArr
284
284
  */
285
285
  typedef void (^_Nonnull RadarIPGeocodeCompletionHandler)(RadarStatus status, RadarAddress *_Nullable address, BOOL proxy);
286
286
 
287
+ /**
288
+ Called when an IP geocoding request succeeds, fails, or times out.
289
+
290
+ Receives the request status and, if successful, the geocoding result (a partial address) and a boolean indicating whether the IP address is a known proxy. Also receives the underlying NSError when the failure originated from a caught network, parse, or exception error — forward it to an error collector (Sentry, Crashlytics, etc.) to capture diagnostics.
291
+
292
+ @see https://radar.com/documentation/api#ip-geocode
293
+ */
294
+ typedef void (^_Nonnull RadarIPGeocodeWithErrorCompletionHandler)(RadarStatus status, RadarAddress *_Nullable address, BOOL proxy, NSError *_Nullable error);
295
+
287
296
  /**
288
297
  Called when an address validation request succeeds, fails, or times out.
289
298
 
@@ -408,6 +417,20 @@ typedef void (^_Nonnull RadarIndoorsScanCompletionHandler)(NSString *_Nullable r
408
417
  */
409
418
  + (NSString *_Nullable)getUserId;
410
419
 
420
+ /**
421
+ Sets the user's preferred language. Pass a BCP-47 language tag like `"en"` or `"es-PR"`.
422
+
423
+ @param userLanguage The user's preferred language. If `nil`, the previous `userLanguage` will be cleared.
424
+ */
425
+ + (void)setUserLanguage:(NSString *_Nullable)userLanguage;
426
+
427
+ /**
428
+ Returns the current `userLanguage`.
429
+
430
+ @return The current `userLanguage`.
431
+ */
432
+ + (NSString *_Nullable)getUserLanguage;
433
+
411
434
  /**
412
435
  Sets an optional description for the user, displayed in the dashboard.
413
436
 
@@ -1300,7 +1323,17 @@ typedef void (^_Nonnull RadarIndoorsScanCompletionHandler)(NSString *_Nullable r
1300
1323
 
1301
1324
  @see https://radar.com/documentation/api#ip-geocode
1302
1325
  */
1303
- + (void)ipGeocodeWithCompletionHandler:(RadarIPGeocodeCompletionHandler)completionHandler NS_SWIFT_NAME(ipGeocode(completionHandler:));
1326
+ + (void)ipGeocodeWithCompletionHandler:(RadarIPGeocodeCompletionHandler)completionHandler
1327
+ __attribute__((deprecated("Use ipGeocodeWithErrorCompletionHandler: to also receive the underlying NSError on network/parse errors.")));
1328
+
1329
+ /**
1330
+ Geocodes the device's current IP address, converting IP address to partial address. The completion handler also receives the underlying NSError when the failure originated from a caught network, parse, or exception error — forward it to an error collector (Sentry, Crashlytics, etc.) to capture diagnostics.
1331
+
1332
+ @param completionHandler A completion handler.
1333
+
1334
+ @see https://radar.com/documentation/api#ip-geocode
1335
+ */
1336
+ + (void)ipGeocodeWithErrorCompletionHandler:(RadarIPGeocodeWithErrorCompletionHandler)completionHandler NS_SWIFT_NAME(ipGeocode(completionHandler:));
1304
1337
 
1305
1338
 
1306
1339
  /**
@@ -21,6 +21,11 @@
21
21
  /// clamped to the range 1…300.
22
22
  @property (assign, nonatomic) NSTimeInterval networkTimeoutInterval;
23
23
 
24
+ /// Minimum interval in seconds between deliveries of `RadarVerifiedDelegate.didChangeIP()`.
25
+ /// Default 10 seconds. Set to 0 to disable throttling (deliver every detected change).
26
+ /// Negative or non-finite values fall back to the default.
27
+ @property (assign, nonatomic) NSTimeInterval ipChangeDebounceInterval;
28
+
24
29
  - (NSDictionary *_Nonnull)dictionaryValue;
25
30
  - (instancetype _Nonnull)initWithDict:(NSDictionary *_Nullable)dict;
26
31
 
@@ -21,6 +21,8 @@ typedef void (^RadarFraudPayloadCallback)(NSDictionary<NSString *, id> *_Nullabl
21
21
 
22
22
  - (void)getFraudPayloadWithOptions:(NSDictionary<NSString *, id> *)options completionHandler:(RadarFraudPayloadCallback)completionHandler;
23
23
 
24
+ - (void)setSharingDidChangeHandler:(nullable void (^)(BOOL sharing))handler;
25
+
24
26
  @end
25
27
 
26
28
  NS_ASSUME_NONNULL_END
@@ -37,6 +37,8 @@ NS_ASSUME_NONNULL_BEGIN
37
37
  - (BOOL)skipForegroundCheck;
38
38
  - (BOOL)useOfflineRTOUpdates;
39
39
  - (BOOL)offlineEventGenerationEnabled;
40
+ - (BOOL)useSwiftLocationManager;
41
+ - (BOOL)startUpdatesWhileInUse;
40
42
  - (NSArray<RadarRemoteTrackingOptions *> *_Nullable)remoteTrackingOptions;
41
43
  - (instancetype)initWithDict:(NSDictionary *_Nullable)dict;
42
44
  - (NSDictionary *)dictionaryValue;
@@ -26,6 +26,22 @@ NS_ASSUME_NONNULL_BEGIN
26
26
  */
27
27
  - (void)didUpdateToken:(RadarVerifiedLocationToken *_Nonnull)token NS_SWIFT_NAME(didUpdateToken(_:));
28
28
 
29
+ /**
30
+ Tells the delegate that the device's IP address changed while IP change monitoring is active.
31
+
32
+ @see https://radar.com/documentation/fraud
33
+ */
34
+ - (void)didChangeIP NS_SWIFT_NAME(didChangeIP());
35
+
36
+ /**
37
+ Tells the delegate that the device's screen sharing state changed.
38
+
39
+ @param sharing The current screen sharing state.
40
+
41
+ @see https://radar.com/documentation/fraud
42
+ */
43
+ - (void)didChangeSharing:(BOOL)sharing NS_SWIFT_NAME(didChangeSharing(_:));
44
+
29
45
  @end
30
46
 
31
47
  NS_ASSUME_NONNULL_END