Skip to content

Commit 8fd55f0

Browse files
committed
Expose richer attribution device signals
1 parent d81084f commit 8fd55f0

30 files changed

Lines changed: 6826 additions & 500 deletions

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## 1.1.0 - 2026-05-17
9+
10+
### Added
11+
- Updated vendored native SDKs to iOS v1.1.0 and Android v1.1.0.
12+
- Exposed enriched `getDeviceInfo()` fields including native screen size, screen scale, CPU count, memory bucket, preferred languages, timezone offset, battery/network/carrier metadata, GPU renderer, and SDK version where platform-available.
13+
814
## 1.0.4 - 2026-05-12
915

1016
### Fixed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ The native pod is vendored inside the package, so no extra repository setup is n
3131

3232
### Android
3333

34-
Auto-linking handles the Android side. The package's manifest declares `INTERNET` and `com.google.android.gms.permission.AD_ID`, which merge into your app at build time.
34+
Auto-linking handles the Android side. The package's manifest declares `INTERNET`, `ACCESS_NETWORK_STATE`, and `com.google.android.gms.permission.AD_ID`, which merge into your app at build time.
3535

3636
### Expo
3737

@@ -218,7 +218,7 @@ The native Android SDK reads GAID during install registration, off the main thre
218218

219219
The vendored iOS framework ships a `PrivacyInfo.xcprivacy` manifest declaring `UserDefaults` access plus `DeviceID`, `ProductInteraction`, `UserID`, `CoarseLocation`, and `OtherDataTypes` collection, all marked `Tracking: true`, with `api.appsprint.app` listed as a tracking domain.
220220

221-
For Android, include advertising ID collection, device IDs, app activity, and (if you set `customerUserId`) user ID in your Play Console Data safety answers.
221+
For Android, include advertising ID collection, device IDs, approximate location/network-derived country, device or other identifiers, app activity, and (if you set `customerUserId`) user ID in your Play Console Data safety answers.
222222

223223
Don't pass raw PII through `params` or `customerUserId`. Both persist to native storage for retry durability. Use hashed or opaque identifiers instead (SHA-256 of an email, RevenueCat or Superwall `app_user_id`, your internal user UUID).
224224

@@ -265,7 +265,7 @@ import { AppSprint } from "appsprint-react-native";
265265
import { NativeAppSprint } from "appsprint-react-native";
266266
```
267267

268-
- `getDeviceInfo()` returns the device fingerprint payload.
268+
- `getDeviceInfo()` returns the attribution device signal payload.
269269
- `getAdServicesToken()` returns Apple's AdServices token on iOS; `null` on Android.
270270
- `requestTrackingAuthorization()` shows the ATT prompt on iOS; resolves `true` on Android.
271271

VENDORED_FROM.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
"ios": "1.0.1",
3-
"android": "1.0.2"
2+
"ios": "1.1.0",
3+
"android": "1.1.0"
44
}

android/libs/appsprint-sdk.aar

11.6 KB
Binary file not shown.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
22
package="com.appsprint">
33
<uses-permission android:name="android.permission.INTERNET" />
4+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
45
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
56
</manifest>

android/src/main/kotlin/com/appsprint/AppSprintBridgeModule.kt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,36 @@ class AppSprintBridgeModule(reactContext: ReactApplicationContext) : ReactContex
252252
deviceInfo.deviceModel?.let { info.putString("deviceModel", it) }
253253
deviceInfo.screenWidth?.let { info.putInt("screenWidth", it) }
254254
deviceInfo.screenHeight?.let { info.putInt("screenHeight", it) }
255+
deviceInfo.nativeScreenWidth?.let { info.putInt("nativeScreenWidth", it) }
256+
deviceInfo.nativeScreenHeight?.let { info.putInt("nativeScreenHeight", it) }
257+
deviceInfo.screenScale?.let { info.putDouble("screenScale", it) }
258+
deviceInfo.hardwareConcurrency?.let { info.putInt("hardwareConcurrency", it) }
259+
deviceInfo.processorCount?.let { info.putInt("processorCount", it) }
260+
deviceInfo.maxTouchPoints?.let { info.putInt("maxTouchPoints", it) }
261+
deviceInfo.memoryGb?.let { info.putInt("memoryGb", it) }
262+
deviceInfo.lowPowerMode?.let { info.putBoolean("lowPowerMode", it) }
263+
deviceInfo.batteryState?.let { info.putString("batteryState", it) }
264+
deviceInfo.batteryLevelBucket?.let { info.putString("batteryLevelBucket", it) }
265+
deviceInfo.preferredLanguages?.let { languages ->
266+
val array = Arguments.createArray()
267+
languages.forEach { array.pushString(it) }
268+
info.putArray("preferredLanguages", array)
269+
}
270+
deviceInfo.timezoneOffsetMinutes?.let { info.putInt("timezoneOffsetMinutes", it) }
271+
deviceInfo.deviceManufacturer?.let { info.putString("deviceManufacturer", it) }
272+
deviceInfo.deviceBrand?.let { info.putString("deviceBrand", it) }
273+
deviceInfo.deviceProduct?.let { info.putString("deviceProduct", it) }
274+
deviceInfo.deviceHardware?.let { info.putString("deviceHardware", it) }
275+
deviceInfo.gpuVendor?.let { info.putString("gpuVendor", it) }
276+
deviceInfo.gpuRenderer?.let { info.putString("gpuRenderer", it) }
277+
deviceInfo.connectionType?.let { info.putString("connectionType", it) }
278+
deviceInfo.networkType?.let { info.putString("networkType", it) }
279+
deviceInfo.carrierName?.let { info.putString("carrierName", it) }
280+
deviceInfo.carrierCountryCode?.let { info.putString("carrierCountryCode", it) }
281+
deviceInfo.mobileCountryCode?.let { info.putString("mobileCountryCode", it) }
282+
deviceInfo.mobileNetworkCode?.let { info.putString("mobileNetworkCode", it) }
283+
deviceInfo.sdkPlatform?.let { info.putString("sdkPlatform", it) }
284+
deviceInfo.sdkVersion?.let { info.putString("sdkVersion", it) }
255285
deviceInfo.locale?.let { info.putString("locale", it) }
256286
deviceInfo.timezone?.let { info.putString("timezone", it) }
257287
deviceInfo.osVersion?.let { info.putString("osVersion", it) }

ios/AppSprintBridge.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,32 @@ class AppSprintBridge: NSObject {
202202
if let m = info.deviceModel { dict["deviceModel"] = m }
203203
if let w = info.screenWidth { dict["screenWidth"] = w }
204204
if let h = info.screenHeight { dict["screenHeight"] = h }
205+
if let w = info.nativeScreenWidth { dict["nativeScreenWidth"] = w }
206+
if let h = info.nativeScreenHeight { dict["nativeScreenHeight"] = h }
207+
if let scale = info.screenScale { dict["screenScale"] = scale }
208+
if let concurrency = info.hardwareConcurrency { dict["hardwareConcurrency"] = concurrency }
209+
if let count = info.processorCount { dict["processorCount"] = count }
210+
if let touch = info.maxTouchPoints { dict["maxTouchPoints"] = touch }
211+
if let memory = info.memoryGb { dict["memoryGb"] = memory }
212+
if let lowPower = info.lowPowerMode { dict["lowPowerMode"] = lowPower }
213+
if let state = info.batteryState { dict["batteryState"] = state }
214+
if let bucket = info.batteryLevelBucket { dict["batteryLevelBucket"] = bucket }
215+
if let languages = info.preferredLanguages { dict["preferredLanguages"] = languages }
216+
if let offset = info.timezoneOffsetMinutes { dict["timezoneOffsetMinutes"] = offset }
217+
if let value = info.deviceManufacturer { dict["deviceManufacturer"] = value }
218+
if let value = info.deviceBrand { dict["deviceBrand"] = value }
219+
if let value = info.deviceProduct { dict["deviceProduct"] = value }
220+
if let value = info.deviceHardware { dict["deviceHardware"] = value }
221+
if let value = info.gpuVendor { dict["gpuVendor"] = value }
222+
if let value = info.gpuRenderer { dict["gpuRenderer"] = value }
223+
if let value = info.connectionType { dict["connectionType"] = value }
224+
if let value = info.networkType { dict["networkType"] = value }
225+
if let value = info.carrierName { dict["carrierName"] = value }
226+
if let value = info.carrierCountryCode { dict["carrierCountryCode"] = value }
227+
if let value = info.mobileCountryCode { dict["mobileCountryCode"] = value }
228+
if let value = info.mobileNetworkCode { dict["mobileNetworkCode"] = value }
229+
if let value = info.sdkPlatform { dict["sdkPlatform"] = value }
230+
if let value = info.sdkVersion { dict["sdkVersion"] = value }
205231
if let l = info.locale { dict["locale"] = l }
206232
if let t = info.timezone { dict["timezone"] = t }
207233
if let o = info.osVersion { dict["osVersion"] = o }

ios/AppSprintSDK.xcframework/Info.plist

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,32 @@
88
<key>BinaryPath</key>
99
<string>AppSprintSDK.framework/AppSprintSDK</string>
1010
<key>LibraryIdentifier</key>
11-
<string>ios-arm64</string>
11+
<string>ios-arm64_x86_64-simulator</string>
1212
<key>LibraryPath</key>
1313
<string>AppSprintSDK.framework</string>
1414
<key>SupportedArchitectures</key>
1515
<array>
1616
<string>arm64</string>
17+
<string>x86_64</string>
1718
</array>
1819
<key>SupportedPlatform</key>
1920
<string>ios</string>
21+
<key>SupportedPlatformVariant</key>
22+
<string>simulator</string>
2023
</dict>
2124
<dict>
2225
<key>BinaryPath</key>
2326
<string>AppSprintSDK.framework/AppSprintSDK</string>
2427
<key>LibraryIdentifier</key>
25-
<string>ios-arm64_x86_64-simulator</string>
28+
<string>ios-arm64</string>
2629
<key>LibraryPath</key>
2730
<string>AppSprintSDK.framework</string>
2831
<key>SupportedArchitectures</key>
2932
<array>
3033
<string>arm64</string>
31-
<string>x86_64</string>
3234
</array>
3335
<key>SupportedPlatform</key>
3436
<string>ios</string>
35-
<key>SupportedPlatformVariant</key>
36-
<string>simulator</string>
3737
</dict>
3838
</array>
3939
<key>CFBundlePackageType</key>
Binary file not shown.

0 commit comments

Comments
 (0)