Skip to content

Commit c484df4

Browse files
authored
feat: Improve Privacy Manifest support for iOS 17 (#27)
1 parent bad9393 commit c484df4

File tree

5 files changed

+38
-61
lines changed

5 files changed

+38
-61
lines changed

Package.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ let package = Package(
1717
dependencies: [
1818
.package(name: "mParticle-Apple-SDK",
1919
url: "https://github.com/mParticle/mparticle-apple-sdk",
20-
.upToNextMajor(from: "8.0.0")),
20+
.upToNextMajor(from: "8.22.0")),
2121
.package(name: "Firebase",
2222
url: "https://github.com/firebase/firebase-ios-sdk.git",
23-
.upToNextMajor(from: "10.6.0")),
23+
.upToNextMajor(from: "10.23.0")),
2424
],
2525
targets: [
2626
.target(
@@ -31,6 +31,7 @@ let package = Package(
3131
],
3232
path: "mParticle-Google-Analytics-Firebase-GA4",
3333
exclude: ["Info.plist", "dummy.swift"],
34+
resources: [.process("PrivacyInfo.xcprivacy")],
3435
publicHeadersPath: "."),
3536
.target(
3637
name: "mParticle-Google-Analytics-Firebase-GA4-NoLocation",
@@ -40,6 +41,7 @@ let package = Package(
4041
],
4142
path: "SPM/mParticle-Google-Analytics-Firebase-GA4-NoLocation",
4243
exclude: ["Info.plist", "dummy.swift"],
44+
resources: [.process("PrivacyInfo.xcprivacy")],
4345
publicHeadersPath: "."),
4446
]
4547
)

mParticle-Google-Analytics-Firebase-GA4.podspec

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@ Pod::Spec.new do |s|
1616

1717
s.ios.deployment_target = "11.0"
1818
s.ios.source_files = 'mParticle-Google-Analytics-Firebase-GA4/*.{h,m,mm}'
19-
s.ios.dependency 'mParticle-Apple-SDK/mParticle', '~> 8.0'
19+
s.ios.resource_bundles = { 'mParticle-Google-Analytics-Firebase-GA4-Privacy' => ['mParticle-Google-Analytics-Firebase-GA4/PrivacyInfo.xcprivacy'] }
20+
s.ios.dependency 'mParticle-Apple-SDK/mParticle', '~> 8.22'
2021
s.ios.frameworks = 'CoreTelephony', 'SystemConfiguration'
2122
s.libraries = 'z'
2223
s.ios.dependency 'Firebase/Core', '~> 10.23'
2324

2425
s.tvos.deployment_target = "12.0"
2526
s.tvos.source_files = 'mParticle-Google-Analytics-Firebase-GA4/*.{h,m,mm}'
26-
s.tvos.dependency 'mParticle-Apple-SDK/mParticle', '~> 8.0'
27+
s.ios.resource_bundles = { 'mParticle-Google-Analytics-Firebase-GA4-Privacy' => ['mParticle-Google-Analytics-Firebase-GA4/PrivacyInfo.xcprivacy'] }
28+
s.tvos.dependency 'mParticle-Apple-SDK/mParticle', '~> 8.22'
2729
s.tvos.frameworks = 'SystemConfiguration'
2830
s.libraries = 'z'
2931
s.tvos.dependency 'Firebase/Core', '~> 10.23'

mParticle-Google-Analytics-Firebase-GA4.xcodeproj/project.pbxproj

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
archiveVersion = 1;
44
classes = {
55
};
6-
objectVersion = 54;
6+
objectVersion = 60;
77
objects = {
88

99
/* Begin PBXBuildFile section */
@@ -16,8 +16,6 @@
1616
D3C2105829FC1E3600DBB6D8 /* FirebaseAnalytics.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3C2104C29FC1E3400DBB6D8 /* FirebaseAnalytics.xcframework */; };
1717
D3C2105929FC1E3600DBB6D8 /* FirebaseCoreInternal.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3C2104D29FC1E3400DBB6D8 /* FirebaseCoreInternal.xcframework */; };
1818
D3C2105A29FC1E3600DBB6D8 /* FirebaseCoreInternal.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3C2104D29FC1E3400DBB6D8 /* FirebaseCoreInternal.xcframework */; };
19-
D3C2105B29FC1E3600DBB6D8 /* FirebaseAnalyticsSwift.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3C2104E29FC1E3400DBB6D8 /* FirebaseAnalyticsSwift.xcframework */; };
20-
D3C2105C29FC1E3600DBB6D8 /* FirebaseAnalyticsSwift.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3C2104E29FC1E3400DBB6D8 /* FirebaseAnalyticsSwift.xcframework */; };
2119
D3C2105D29FC1E3600DBB6D8 /* FBLPromises.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3C2104F29FC1E3400DBB6D8 /* FBLPromises.xcframework */; };
2220
D3C2105E29FC1E3600DBB6D8 /* FBLPromises.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3C2104F29FC1E3400DBB6D8 /* FBLPromises.xcframework */; };
2321
D3C2105F29FC1E3600DBB6D8 /* FirebaseCore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3C2105029FC1E3500DBB6D8 /* FirebaseCore.xcframework */; };
@@ -69,17 +67,16 @@
6967
D316BD4D217F67BC00688E56 /* MPKitFirebaseGA4Analytics.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPKitFirebaseGA4Analytics.m; sourceTree = "<group>"; };
7068
D32861EC2BA487FD0075AFF0 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
7169
D39C3DE428C78D5B00432A0C /* dummy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dummy.swift; sourceTree = "<group>"; };
72-
D3C2104C29FC1E3400DBB6D8 /* FirebaseAnalytics.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FirebaseAnalytics.xcframework; path = Carthage/Build/FirebaseAnalytics.xcframework; sourceTree = "<group>"; };
73-
D3C2104D29FC1E3400DBB6D8 /* FirebaseCoreInternal.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FirebaseCoreInternal.xcframework; path = Carthage/Build/FirebaseCoreInternal.xcframework; sourceTree = "<group>"; };
74-
D3C2104E29FC1E3400DBB6D8 /* FirebaseAnalyticsSwift.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FirebaseAnalyticsSwift.xcframework; path = Carthage/Build/FirebaseAnalyticsSwift.xcframework; sourceTree = "<group>"; };
75-
D3C2104F29FC1E3400DBB6D8 /* FBLPromises.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBLPromises.xcframework; path = Carthage/Build/FBLPromises.xcframework; sourceTree = "<group>"; };
76-
D3C2105029FC1E3500DBB6D8 /* FirebaseCore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FirebaseCore.xcframework; path = Carthage/Build/FirebaseCore.xcframework; sourceTree = "<group>"; };
77-
D3C2105129FC1E3500DBB6D8 /* mParticle_Apple_SDK.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = mParticle_Apple_SDK.xcframework; path = Carthage/Build/mParticle_Apple_SDK.xcframework; sourceTree = "<group>"; };
78-
D3C2105229FC1E3500DBB6D8 /* FirebaseInstallations.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FirebaseInstallations.xcframework; path = Carthage/Build/FirebaseInstallations.xcframework; sourceTree = "<group>"; };
79-
D3C2105329FC1E3500DBB6D8 /* GoogleAppMeasurement.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = GoogleAppMeasurement.xcframework; path = Carthage/Build/GoogleAppMeasurement.xcframework; sourceTree = "<group>"; };
80-
D3C2105429FC1E3500DBB6D8 /* GoogleUtilities.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = GoogleUtilities.xcframework; path = Carthage/Build/GoogleUtilities.xcframework; sourceTree = "<group>"; };
81-
D3C2105529FC1E3500DBB6D8 /* nanopb.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = nanopb.xcframework; path = Carthage/Build/nanopb.xcframework; sourceTree = "<group>"; };
82-
D3C2105629FC1E3500DBB6D8 /* GoogleAppMeasurementIdentitySupport.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = GoogleAppMeasurementIdentitySupport.xcframework; path = Carthage/Build/GoogleAppMeasurementIdentitySupport.xcframework; sourceTree = "<group>"; };
70+
D3C2104C29FC1E3400DBB6D8 /* FirebaseAnalytics.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:EQHXZ8M8AV:Google LLC"; lastKnownFileType = wrapper.xcframework; name = FirebaseAnalytics.xcframework; path = Carthage/Build/FirebaseAnalytics.xcframework; sourceTree = "<group>"; };
71+
D3C2104D29FC1E3400DBB6D8 /* FirebaseCoreInternal.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:EQHXZ8M8AV:Google LLC"; lastKnownFileType = wrapper.xcframework; name = FirebaseCoreInternal.xcframework; path = Carthage/Build/FirebaseCoreInternal.xcframework; sourceTree = "<group>"; };
72+
D3C2104F29FC1E3400DBB6D8 /* FBLPromises.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:EQHXZ8M8AV:Google LLC"; lastKnownFileType = wrapper.xcframework; name = FBLPromises.xcframework; path = Carthage/Build/FBLPromises.xcframework; sourceTree = "<group>"; };
73+
D3C2105029FC1E3500DBB6D8 /* FirebaseCore.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:EQHXZ8M8AV:Google LLC"; lastKnownFileType = wrapper.xcframework; name = FirebaseCore.xcframework; path = Carthage/Build/FirebaseCore.xcframework; sourceTree = "<group>"; };
74+
D3C2105129FC1E3500DBB6D8 /* mParticle_Apple_SDK.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:DLD43Y3TRP:mParticle, inc"; lastKnownFileType = wrapper.xcframework; name = mParticle_Apple_SDK.xcframework; path = Carthage/Build/mParticle_Apple_SDK.xcframework; sourceTree = "<group>"; };
75+
D3C2105229FC1E3500DBB6D8 /* FirebaseInstallations.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:EQHXZ8M8AV:Google LLC"; lastKnownFileType = wrapper.xcframework; name = FirebaseInstallations.xcframework; path = Carthage/Build/FirebaseInstallations.xcframework; sourceTree = "<group>"; };
76+
D3C2105329FC1E3500DBB6D8 /* GoogleAppMeasurement.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:EQHXZ8M8AV:Google LLC"; lastKnownFileType = wrapper.xcframework; name = GoogleAppMeasurement.xcframework; path = Carthage/Build/GoogleAppMeasurement.xcframework; sourceTree = "<group>"; };
77+
D3C2105429FC1E3500DBB6D8 /* GoogleUtilities.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:EQHXZ8M8AV:Google LLC"; lastKnownFileType = wrapper.xcframework; name = GoogleUtilities.xcframework; path = Carthage/Build/GoogleUtilities.xcframework; sourceTree = "<group>"; };
78+
D3C2105529FC1E3500DBB6D8 /* nanopb.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:EQHXZ8M8AV:Google LLC"; lastKnownFileType = wrapper.xcframework; name = nanopb.xcframework; path = Carthage/Build/nanopb.xcframework; sourceTree = "<group>"; };
79+
D3C2105629FC1E3500DBB6D8 /* GoogleAppMeasurementIdentitySupport.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:EQHXZ8M8AV:Google LLC"; lastKnownFileType = wrapper.xcframework; name = GoogleAppMeasurementIdentitySupport.xcframework; path = Carthage/Build/GoogleAppMeasurementIdentitySupport.xcframework; sourceTree = "<group>"; };
8380
D3C7855221FF6CEB00FE47D2 /* mParticle-Google-Analytics-Firebase-GA4Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "mParticle-Google-Analytics-Firebase-GA4Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
8481
D3C7855421FF6CEC00FE47D2 /* MPKitFirebaseGA4AnalyticsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPKitFirebaseGA4AnalyticsTests.m; sourceTree = "<group>"; };
8582
D3C7855621FF6CEC00FE47D2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -92,7 +89,6 @@
9289
files = (
9390
D3C2105D29FC1E3600DBB6D8 /* FBLPromises.xcframework in Frameworks */,
9491
D3C2106129FC1E3600DBB6D8 /* mParticle_Apple_SDK.xcframework in Frameworks */,
95-
D3C2105B29FC1E3600DBB6D8 /* FirebaseAnalyticsSwift.xcframework in Frameworks */,
9692
D3C2106929FC1E3600DBB6D8 /* nanopb.xcframework in Frameworks */,
9793
D3C2105F29FC1E3600DBB6D8 /* FirebaseCore.xcframework in Frameworks */,
9894
D3C2106329FC1E3600DBB6D8 /* FirebaseInstallations.xcframework in Frameworks */,
@@ -118,7 +114,6 @@
118114
D3C2106829FC1E3600DBB6D8 /* GoogleUtilities.xcframework in Frameworks */,
119115
D3C2105A29FC1E3600DBB6D8 /* FirebaseCoreInternal.xcframework in Frameworks */,
120116
D3C2105E29FC1E3600DBB6D8 /* FBLPromises.xcframework in Frameworks */,
121-
D3C2105C29FC1E3600DBB6D8 /* FirebaseAnalyticsSwift.xcframework in Frameworks */,
122117
D3C2106229FC1E3600DBB6D8 /* mParticle_Apple_SDK.xcframework in Frameworks */,
123118
);
124119
runOnlyForDeploymentPostprocessing = 0;
@@ -162,7 +157,6 @@
162157
children = (
163158
D3C2104F29FC1E3400DBB6D8 /* FBLPromises.xcframework */,
164159
D3C2104C29FC1E3400DBB6D8 /* FirebaseAnalytics.xcframework */,
165-
D3C2104E29FC1E3400DBB6D8 /* FirebaseAnalyticsSwift.xcframework */,
166160
D3C2105029FC1E3500DBB6D8 /* FirebaseCore.xcframework */,
167161
D3C2104D29FC1E3400DBB6D8 /* FirebaseCoreInternal.xcframework */,
168162
D3C2105229FC1E3500DBB6D8 /* FirebaseInstallations.xcframework */,

mParticle-Google-Analytics-Firebase-GA4/PrivacyInfo.xcprivacy

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,8 @@
77
<key>NSPrivacyTrackingDomains</key>
88
<array/>
99
<key>NSPrivacyCollectedDataTypes</key>
10-
<array>
11-
<dict/>
12-
</array>
10+
<array/>
1311
<key>NSPrivacyAccessedAPITypes</key>
14-
<array>
15-
<dict/>
16-
</array>
12+
<array/>
1713
</dict>
1814
</plist>

mParticle-Google-Analytics-Firebase-GA4Tests/MPKitFirebaseGA4AnalyticsTests.m

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,10 @@ - (void)testSanitization {
143143
XCTAssertEqualObjects([exampleKit standardizeNameOrKey:badStart forEvent:YES], @"event_name");
144144
}
145145

146-
NSString *tooLong = @"abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890";
146+
NSString *tooLong = @"abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890";
147147
XCTAssertEqual(40, [exampleKit standardizeNameOrKey:tooLong forEvent:YES].length);
148148
XCTAssertEqual(24, [exampleKit standardizeNameOrKey:tooLong forEvent:NO].length);
149-
XCTAssertEqual(100, [exampleKit standardizeValue:tooLong forEvent:YES].length);
149+
XCTAssertEqual(500, [exampleKit standardizeValue:tooLong forEvent:YES].length);
150150
XCTAssertEqual(36, [exampleKit standardizeValue:tooLong forEvent:NO].length);
151151

152152
NSArray *emptyStrings = @[@"!@#$%^&*()_+=[]{}|'\"?><:;",
@@ -240,41 +240,24 @@ - (void)testSanitizationMax {
240240
XCTAssertEqual([parameters count], 25);
241241
XCTAssertEqualObjects(parameters, testFinalAttributes);
242242

243-
NSDictionary *testExcessiveAttributes = @{ @"test1": @"parameter",
244-
@"test2": @"parameter",
245-
@"test3": @"parameter",
246-
@"test4": @"parameter",
247-
@"test5": @"parameter",
248-
@"test6": @"parameter",
249-
@"test7": @"parameter",
250-
@"test8": @"parameter",
251-
@"test9": @"parameter",
252-
@"test10": @"parameter",
253-
@"test11": @"parameter",
254-
@"test12": @"parameter",
255-
@"test13": @"parameter",
256-
@"test14": @"parameter",
257-
@"test15": @"parameter",
258-
@"test16": @"parameter",
259-
@"test17": @"parameter",
260-
@"test18": @"parameter",
261-
@"test19": @"parameter",
262-
@"test20": @"parameter",
263-
@"test21": @"parameter",
264-
@"test22": @"parameter",
265-
@"test23": @"parameter",
266-
@"test24": @"parameter",
267-
@"z1": @"parameter",
268-
@"z2": @"parameter",
269-
@"z3": @"parameter",
270-
@"z4": @"parameter",
271-
@"z5": @"parameter"
272-
};
243+
NSMutableDictionary *testExcessiveAttributes = [[NSMutableDictionary alloc] initWithCapacity:125];
244+
for (int i = 0; i < 125; i++) {
245+
NSString *key = [NSString stringWithFormat:@"test%03d", i];
246+
testExcessiveAttributes[key] = @"parameter";
247+
}
248+
249+
NSMutableDictionary *testExcessiveFinalAttributes = [[NSMutableDictionary alloc] initWithCapacity:125];
250+
for (int i = 0; i <99 ; i++) {
251+
NSString *key = [NSString stringWithFormat:@"test%03d", i];
252+
testExcessiveFinalAttributes[key] = @"parameter";
253+
}
254+
testExcessiveFinalAttributes[@"currency"] = @"USD";
255+
273256
event.customAttributes = testExcessiveAttributes;
274257

275258
parameters = [exampleKit getParameterForCommerceEvent:event];
276-
XCTAssertEqual([parameters count], 25);
277-
XCTAssertEqualObjects(parameters, testFinalAttributes);
259+
XCTAssertEqual([parameters count], 100);
260+
XCTAssertEqualObjects(parameters, testExcessiveFinalAttributes);
278261

279262

280263
MPKitExecStatus *execStatus = [exampleKit logBaseEvent:event];

0 commit comments

Comments
 (0)