diff --git a/ffi/android/build.gradle.kts b/ffi/android/build.gradle.kts
index ea0cd3a3..892b3954 100644
--- a/ffi/android/build.gradle.kts
+++ b/ffi/android/build.gradle.kts
@@ -75,7 +75,9 @@ dependencies {
// The `:android-aarch64` etc. variants aren't needed because we ship
// the JNI libs directly via `jniLibs.srcDirs` above; consumers only
// need the JVM-side JNA jar.
- api("net.java.dev.jna:jna:5.14.0@aar")
+ // >= 5.15 required: 5.14's x86_64 libjnidispatch.so is 4KB-aligned and
+ // crashes on 16KB-page devices/emulators (Play compliance).
+ api("net.java.dev.jna:jna:5.17.0@aar")
// Required for the `suspend fn` wrappers uniffi generates for async Rust.
api("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")
}
diff --git a/ffi/kotlin/AntFfi/build.gradle.kts b/ffi/kotlin/AntFfi/build.gradle.kts
index 8cd58ecb..90dcd325 100644
--- a/ffi/kotlin/AntFfi/build.gradle.kts
+++ b/ffi/kotlin/AntFfi/build.gradle.kts
@@ -10,8 +10,8 @@ repositories {
}
dependencies {
- // JNA for UniFFI native bindings
- implementation("net.java.dev.jna:jna:5.14.0")
+ // JNA for UniFFI native bindings (kept in lockstep with ffi/android)
+ implementation("net.java.dev.jna:jna:5.17.0")
// Kotlin coroutines (for async UniFFI bindings)
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")
diff --git a/ffi/scripts/PrivacyInfo.xcprivacy b/ffi/scripts/PrivacyInfo.xcprivacy
new file mode 100644
index 00000000..1c73449b
--- /dev/null
+++ b/ffi/scripts/PrivacyInfo.xcprivacy
@@ -0,0 +1,45 @@
+
+
+
+
+
+ NSPrivacyTracking
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyAccessedAPITypes
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryFileTimestamp
+ NSPrivacyAccessedAPITypeReasons
+
+ C617.1
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryDiskSpace
+ NSPrivacyAccessedAPITypeReasons
+
+ 85F4.1
+
+
+
+
+
diff --git a/ffi/scripts/build-swift.sh b/ffi/scripts/build-swift.sh
index ef6f2976..6a4dd78a 100755
--- a/ffi/scripts/build-swift.sh
+++ b/ffi/scripts/build-swift.sh
@@ -27,6 +27,11 @@ RUST_DIR="$FFI_DIR/rust"
BUILD_DIR="$FFI_DIR/build"
XCF_DIR="$BUILD_DIR/AntFfi.xcframework"
+# Framework version string comes from the crate version (which tracks the
+# released SDK version) instead of a hardcoded value drifting out of date.
+ANT_FFI_VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' "$RUST_DIR/ant-ffi/Cargo.toml" | head -1)"
+[ -n "$ANT_FFI_VERSION" ] || { echo "failed to read version from ant-ffi/Cargo.toml" >&2; exit 1; }
+
# Deployment targets — must match Package.swift's .iOS(.v16) / .macOS(.v13)
# declarations in ant-swift. Setting these silences "built for newer X version"
# warnings at consumer link time. iOS<13 also fails to link due to missing
@@ -108,7 +113,7 @@ write_plist() {
CFBundleInfoDictionaryVersion6.0
CFBundleName$FW_NAME
CFBundlePackageTypeFMWK
- CFBundleShortVersionString0.2.0
+ CFBundleShortVersionString$ANT_FFI_VERSION
CFBundleVersion1
$minkey$minver
@@ -129,6 +134,9 @@ prepare_framework() {
cp "$GEN_DIR/$FW_NAME.h" "$V/Headers/"
write_modulemap "$V/Modules/module.modulemap"
write_plist "$V/Resources/Info.plist" "$platform"
+ # Required-reason-API privacy manifest (ITMS-91053); macOS bundles
+ # keep resources under Versions/A/Resources.
+ cp "$SCRIPT_DIR/PrivacyInfo.xcprivacy" "$V/Resources/PrivacyInfo.xcprivacy"
ln -s "A" "$fw/Versions/Current"
ln -s "Versions/Current/$FW_NAME" "$fw/$FW_NAME"
ln -s "Versions/Current/Headers" "$fw/Headers"
@@ -142,6 +150,9 @@ prepare_framework() {
cp "$GEN_DIR/$FW_NAME.h" "$fw/Headers/"
write_modulemap "$fw/Modules/module.modulemap"
write_plist "$fw/Info.plist" "$platform"
+ # Required-reason-API privacy manifest (ITMS-91053); flat frameworks
+ # carry it at the bundle root.
+ cp "$SCRIPT_DIR/PrivacyInfo.xcprivacy" "$fw/PrivacyInfo.xcprivacy"
fi
}