From 3913dd1cfd0fbfa8e63cc73ed81207861d7435db Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Wed, 22 Oct 2025 11:58:34 +0000 Subject: [PATCH 1/2] fix(analytics, iOS): Update hashedPhoneNumber handling to use hex string conversion and add Data extension for hex string initialization --- .../FirebaseAnalyticsPlugin.swift | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift b/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift index fcd6bda21819..7dfd09bc2d3f 100644 --- a/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift +++ b/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift @@ -136,7 +136,7 @@ public class FirebaseAnalyticsPlugin: NSObject, FLTFirebasePluginProtocol, Flutt Analytics.initiateOnDeviceConversionMeasurement(hashedEmailAddress: data) } if let hashedPhoneNumber = arguments["hashedPhoneNumber"] as? String, - let data = hashedPhoneNumber.data(using: .utf8) { + let data = Data(hexString: hashedPhoneNumber) { Analytics.initiateOnDeviceConversionMeasurement(hashedPhoneNumber: data) } completion(.success(())) @@ -162,3 +162,22 @@ public class FirebaseAnalyticsPlugin: NSObject, FLTFirebasePluginProtocol, Flutt FLTFirebaseAnalyticsChannelName } } + +extension Data { + init?(hexString: String) { + let len = hexString.count / 2 + var data = Data(capacity: len) + var i = hexString.startIndex + for _ in 0 ..< len { + let j = hexString.index(i, offsetBy: 2) + let bytes = hexString[i ..< j] + if var num = UInt8(bytes, radix: 16) { + data.append(&num, count: 1) + } else { + return nil + } + i = j + } + self = data + } +} From 64614b61a4ec8333a9bed6466e548936bef6ae92 Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Wed, 22 Oct 2025 12:07:45 +0000 Subject: [PATCH 2/2] refactor: Replace Data extension with a dedicated hex string conversion function for hashedPhoneNumber handling --- .../FirebaseAnalyticsPlugin.swift | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift b/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift index 7dfd09bc2d3f..80c7b5c43668 100644 --- a/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift +++ b/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift @@ -136,12 +136,31 @@ public class FirebaseAnalyticsPlugin: NSObject, FLTFirebasePluginProtocol, Flutt Analytics.initiateOnDeviceConversionMeasurement(hashedEmailAddress: data) } if let hashedPhoneNumber = arguments["hashedPhoneNumber"] as? String, - let data = Data(hexString: hashedPhoneNumber) { + let data = hexStringToData(hashedPhoneNumber) { Analytics.initiateOnDeviceConversionMeasurement(hashedPhoneNumber: data) } completion(.success(())) } + private func hexStringToData(_ hexString: String) -> Data? { + let length = hexString.count + guard length % 2 == 0 else { return nil } + + var data = Data(capacity: length / 2) + var index = hexString.startIndex + + for _ in 0 ..< (length / 2) { + let nextIndex = hexString.index(index, offsetBy: 2) + guard let byte = UInt8(hexString[index ..< nextIndex], radix: 16) else { + return nil + } + data.append(byte) + index = nextIndex + } + + return data + } + public func didReinitializeFirebaseCore(_ completion: @escaping () -> Void) { completion() } @@ -162,22 +181,3 @@ public class FirebaseAnalyticsPlugin: NSObject, FLTFirebasePluginProtocol, Flutt FLTFirebaseAnalyticsChannelName } } - -extension Data { - init?(hexString: String) { - let len = hexString.count / 2 - var data = Data(capacity: len) - var i = hexString.startIndex - for _ in 0 ..< len { - let j = hexString.index(i, offsetBy: 2) - let bytes = hexString[i ..< j] - if var num = UInt8(bytes, radix: 16) { - data.append(&num, count: 1) - } else { - return nil - } - i = j - } - self = data - } -}