Skip to content

Commit 89d293e

Browse files
authored
feat: Remove BrazeKitCompat, migrate to pure BrazeKit (#111)
1 parent 8b6c61e commit 89d293e

6 files changed

Lines changed: 94 additions & 67 deletions

File tree

CHANGELOG.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,60 @@
1+
# [8.15.0](https://github.com/mparticle-integrations/mparticle-apple-integration-appboy/releases/tag/v8.15.0)
2+
3+
4+
### Features
5+
6+
* Remove BrazeKitCompat dependency — complete migration to pure BrazeKit/BrazeUI (Braze Swift SDK 14.0+)
7+
* Add subscription group mapping support
8+
* Add email/push subscription state handling via user attributes
9+
10+
### Bug Fixes
11+
12+
* Remove legacy `ABK*` constants in favor of Braze Swift SDK equivalents
13+
* Restore `sdkFlavor` reporting to Braze via `BRZSDKFlavorMparticle`
14+
15+
# [8.14.0](https://github.com/mparticle-integrations/mparticle-apple-integration-appboy/compare/v8.13.2...v8.14.0) (2025-05-27)
16+
17+
18+
### Features
19+
20+
* Update Braze to v14.0.0
21+
22+
# [8.13.2](https://github.com/mparticle-integrations/mparticle-apple-integration-appboy/compare/v8.13.1...v8.13.2) (2025-06-12)
23+
24+
25+
### Bug Fixes
26+
27+
* Forward commerce event custom attributes for purchase ([#107](https://github.com/mparticle-integrations/mparticle-apple-integration-appboy/issues/107))
28+
29+
# [8.13.1](https://github.com/mparticle-integrations/mparticle-apple-integration-appboy/compare/v8.13.0...v8.13.1) (2025-05-27)
30+
31+
32+
### Features
33+
34+
* Update Braze to v12.0.0 ([#106](https://github.com/mparticle-integrations/mparticle-apple-integration-appboy/issues/106))
35+
36+
# [8.13.0](https://github.com/mparticle-integrations/mparticle-apple-integration-appboy/compare/v8.12.1...v8.13.0) (2025-04-22)
37+
38+
39+
### Features
40+
41+
* Add support to forward SubscriptionGroupIds ([#105](https://github.com/mparticle-integrations/mparticle-apple-integration-appboy/issues/105))
42+
43+
# [8.12.1](https://github.com/mparticle-integrations/mparticle-apple-integration-appboy/compare/v8.12.0...v8.12.1) (2025-04-03)
44+
45+
46+
### Bug Fixes
47+
48+
* Update Braze to 11.9 to include iCloud restore fix ([#104](https://github.com/mparticle-integrations/mparticle-apple-integration-appboy/issues/104))
49+
* Users attributes email and push subscribe mapping ([#103](https://github.com/mparticle-integrations/mparticle-apple-integration-appboy/issues/103))
50+
51+
# [8.12.0](https://github.com/mparticle-integrations/mparticle-apple-integration-appboy/compare/v8.11.0...v8.12.0) (2024-12-11)
52+
53+
54+
### Features
55+
56+
* Use replaceSkuWithProductName option ([#101](https://github.com/mparticle-integrations/mparticle-apple-integration-appboy/issues/101))
57+
158
# [8.11.0](https://github.com/mparticle-integrations/mparticle-apple-integration-appboy/compare/v8.10.2...v8.11.0) (2024-11-19)
259

360

Package.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ let package = Package(
3030
.product(name: "mParticle-Apple-SDK", package: "mParticle-Apple-SDK"),
3131
.product(name: "BrazeUI", package: "braze-swift-sdk", condition: .when(platforms: [.iOS])),
3232
.product(name: "BrazeKit", package: "braze-swift-sdk"),
33-
.product(name: "BrazeKitCompat", package: "braze-swift-sdk"),
3433
],
3534
resources: [.process("PrivacyInfo.xcprivacy")]
3635
),
@@ -40,7 +39,6 @@ let package = Package(
4039
.product(name: "mParticle-Apple-SDK-NoLocation", package: "mParticle-Apple-SDK"),
4140
.product(name: "BrazeUI", package: "braze-swift-sdk", condition: .when(platforms: [.iOS])),
4241
.product(name: "BrazeKit", package: "braze-swift-sdk"),
43-
.product(name: "BrazeKitCompat", package: "braze-swift-sdk"),
4442
],
4543
path: "SPM/mParticle-Appboy-NoLocation",
4644
resources: [.process("PrivacyInfo.xcprivacy")]

Sources/mParticle-Appboy/MPKitAppboy.m

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22

33
#if TARGET_OS_IOS
44
@import BrazeKit;
5-
@import BrazeKitCompat;
65
@import BrazeUI;
76
#else
87
@import BrazeKit;
9-
@import BrazeKitCompat;
108
#endif
119

1210
static NSString *const eabAPIKey = @"apiKey";
@@ -60,6 +58,14 @@
6058
static NSString *const BGoogleAdUserDataKey = @"$google_ad_user_data";
6159
static NSString *const BGoogleAdPersonalizationKey = @"$google_ad_personalization";
6260

61+
// Braze configuration option keys used internally by the options dictionary
62+
static NSString *const kMPBrazeConfigEndpoint = @"endpoint";
63+
static NSString *const kMPBrazeConfigRequestPolicy = @"requestPolicy";
64+
static NSString *const kMPBrazeConfigFlushInterval = @"flushInterval";
65+
static NSString *const kMPBrazeConfigSessionTimeout = @"sessionTimeout";
66+
static NSString *const kMPBrazeConfigTriggerMinimumTimeInterval = @"triggerMinimumTimeInterval";
67+
static NSString *const kMPBrazeConfigAutomaticLocationCollection = @"automaticLocationCollection";
68+
6369
#if TARGET_OS_IOS
6470
static id<BrazeInAppMessageUIDelegate> inAppMessageControllerDelegate = nil;
6571
static BOOL shouldDisableNotificationHandling = NO;
@@ -371,20 +377,20 @@ - (id const)providerKitInstance {
371377
- (void)start {
372378
if (!self->appboyInstance) {
373379
NSDictionary *optionsDict = [self optionsDictionary];
374-
BRZConfiguration *configuration = [[BRZConfiguration alloc] initWithApiKey:self.configuration[eabAPIKey] endpoint:optionsDict[ABKEndpointKey]];
380+
BRZConfiguration *configuration = [[BRZConfiguration alloc] initWithApiKey:self.configuration[eabAPIKey] endpoint:optionsDict[kMPBrazeConfigEndpoint]];
375381

376382
[configuration.api addSDKMetadata:@[BRZSDKMetadata.mparticle]];
377-
configuration.api.sdkFlavor = ((NSNumber *)optionsDict[ABKSDKFlavorKey]).intValue;
378-
configuration.api.requestPolicy = ((NSNumber *)optionsDict[ABKRequestProcessingPolicyOptionKey]).intValue;
379-
NSNumber *flushIntervalOption = (NSNumber *)optionsDict[ABKFlushIntervalOptionKey] ?: @10; // If not set, use the default 10 seconds specified in Braze SDK header
383+
configuration.api.sdkFlavor = BRZSDKFlavorMparticle;
384+
configuration.api.requestPolicy = ((NSNumber *)optionsDict[kMPBrazeConfigRequestPolicy]).intValue;
385+
NSNumber *flushIntervalOption = (NSNumber *)optionsDict[kMPBrazeConfigFlushInterval] ?: @10; // If not set, use the default 10 seconds specified in Braze SDK header
380386
configuration.api.flushInterval = flushIntervalOption.doubleValue < 1.0 ? 1.0 : flushIntervalOption.doubleValue; // Ensure value is above the minimum of 1.0 per run time warning from Braze SDK
381387
configuration.api.trackingPropertyAllowList = brazeTrackingPropertyAllowList;
382388

383-
configuration.sessionTimeout = ((NSNumber *)optionsDict[ABKSessionTimeoutKey]).doubleValue;
389+
configuration.sessionTimeout = ((NSNumber *)optionsDict[kMPBrazeConfigSessionTimeout]).doubleValue;
384390

385-
configuration.triggerMinimumTimeInterval = ((NSNumber *)optionsDict[ABKMinimumTriggerTimeIntervalKey]).doubleValue;
391+
configuration.triggerMinimumTimeInterval = ((NSNumber *)optionsDict[kMPBrazeConfigTriggerMinimumTimeInterval]).doubleValue;
386392

387-
NSNumber *automaticLocationTrackingOption = (NSNumber *)optionsDict[ABKEnableAutomaticLocationCollectionKey];
393+
NSNumber *automaticLocationTrackingOption = (NSNumber *)optionsDict[kMPBrazeConfigAutomaticLocationCollection];
388394
if (automaticLocationTrackingOption != nil && automaticLocationTrackingOption.boolValue && brazeLocationProvider) {
389395
configuration.location.automaticLocationCollection = YES;
390396
configuration.location.brazeLocationProvider = brazeLocationProvider;
@@ -444,8 +450,9 @@ - (void)stop {
444450
}
445451

446452
- (NSMutableDictionary<NSString *, NSObject *> *)optionsDictionary {
453+
// This maps the mParticle keys (prefixed with ABK) to the Braze Swift SDK configuration keys (prefixed with kMPBrazeConfig)
447454
NSArray <NSString *> *serverKeys = @[@"ABKRequestProcessingPolicyOptionKey", @"ABKFlushIntervalOptionKey", @"ABKSessionTimeoutKey", @"ABKMinimumTriggerTimeIntervalKey"];
448-
NSArray <NSString *> *appboyKeys = @[ABKRequestProcessingPolicyOptionKey, ABKFlushIntervalOptionKey, ABKSessionTimeoutKey, ABKMinimumTriggerTimeIntervalKey];
455+
NSArray <NSString *> *configKeys = @[kMPBrazeConfigRequestPolicy, kMPBrazeConfigFlushInterval, kMPBrazeConfigSessionTimeout, kMPBrazeConfigTriggerMinimumTimeInterval];
449456
NSMutableDictionary<NSString *, NSObject *> *optionsDictionary = [[NSMutableDictionary alloc] initWithCapacity:serverKeys.count];
450457
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
451458
numberFormatter.numberStyle = NSNumberFormatterNoStyle;
@@ -454,42 +461,31 @@ - (void)stop {
454461
NSString *optionValue = self.configuration[serverKey];
455462

456463
if (optionValue != nil && (NSNull *)optionValue != [NSNull null]) {
457-
NSString *appboyKey = appboyKeys[idx];
458464
NSNumber *numberValue = nil;
459465
@try {
460466
numberValue = [numberFormatter numberFromString:optionValue];
461467
} @catch (NSException *exception) {
462468
numberValue = nil;
463469
}
464470
if (numberValue != nil) {
465-
optionsDictionary[appboyKey] = numberValue;
471+
optionsDictionary[configKeys[idx]] = numberValue;
466472
}
467473
}
468474
}];
469475

470476
if (self.host.length) {
471-
#pragma clang diagnostic push
472-
#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
473-
optionsDictionary[ABKEndpointKey] = self.host;
474-
#pragma clang diagnostic pop
477+
optionsDictionary[kMPBrazeConfigEndpoint] = self.host;
475478
}
476479

477480
if (optionsDictionary.count == 0) {
478-
#pragma clang diagnostic push
479-
#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
480481
optionsDictionary = [[NSMutableDictionary alloc] initWithCapacity:serverKeys.count];
481482
}
482-
optionsDictionary[ABKSDKFlavorKey] = @(MPARTICLE);
483-
#pragma clang diagnostic pop
484-
483+
485484
#if TARGET_OS_IOS
486-
optionsDictionary[ABKEnableAutomaticLocationCollectionKey] = @(YES);
485+
optionsDictionary[kMPBrazeConfigAutomaticLocationCollection] = @(YES);
487486
if (self.configuration[@"ABKDisableAutomaticLocationCollectionKey"]) {
488487
if ([self.configuration[@"ABKDisableAutomaticLocationCollectionKey"] caseInsensitiveCompare:@"true"] == NSOrderedSame) {
489-
#pragma clang diagnostic push
490-
#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
491-
optionsDictionary[ABKEnableAutomaticLocationCollectionKey] = @(NO);
492-
#pragma clang diagnostic pop
488+
optionsDictionary[kMPBrazeConfigAutomaticLocationCollection] = @(NO);
493489
}
494490
}
495491
#endif

mParticle-Appboy.podspec

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,13 @@ Pod::Spec.new do |s|
2020
s.ios.resource_bundles = { 'mParticle-Appboy-Privacy' => ['Sources/mParticle-Appboy/PrivacyInfo.xcprivacy'] }
2121
s.ios.dependency 'mParticle-Apple-SDK', '~> 8.19'
2222
s.ios.dependency 'BrazeKit', '~> 14.0'
23-
s.ios.dependency 'BrazeKitCompat', '~> 14.0'
2423
s.ios.dependency 'BrazeUI', '~> 14.0'
2524

2625
s.tvos.deployment_target = "12.0"
2726
s.tvos.source_files = 'Sources/**/*.{h,m,mm}'
2827
s.tvos.resource_bundles = { 'mParticle-Appboy-Privacy' => ['Sources/mParticle-Appboy/PrivacyInfo.xcprivacy'] }
2928
s.tvos.dependency 'mParticle-Apple-SDK', '~> 8.19'
3029
s.tvos.dependency 'BrazeKit', '~> 14.0'
31-
s.tvos.dependency 'BrazeKitCompat', '~> 14.0'
3230

3331

3432
end

mParticle-Appboy.xcodeproj/project.pbxproj

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@
1717
539B2E952A13D62200C8339D /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = 539B2E942A13D62200C8339D /* OCMock */; };
1818
539B2E982A13D66300C8339D /* mParticle-Apple-SDK in Frameworks */ = {isa = PBXBuildFile; productRef = 539B2E972A13D66300C8339D /* mParticle-Apple-SDK */; };
1919
539B2E9A2A13D66A00C8339D /* mParticle-Apple-SDK in Frameworks */ = {isa = PBXBuildFile; productRef = 539B2E992A13D66A00C8339D /* mParticle-Apple-SDK */; };
20-
539B2E9D2A13D69F00C8339D /* BrazeKitCompat in Frameworks */ = {isa = PBXBuildFile; productRef = 539B2E9C2A13D69F00C8339D /* BrazeKitCompat */; };
2120
539B2E9F2A13D69F00C8339D /* BrazeUI in Frameworks */ = {isa = PBXBuildFile; productRef = 539B2E9E2A13D69F00C8339D /* BrazeUI */; };
22-
539B2EA12A13D6AB00C8339D /* BrazeKitCompat in Frameworks */ = {isa = PBXBuildFile; productRef = 539B2EA02A13D6AB00C8339D /* BrazeKitCompat */; };
2321
D31A98A92153F73400358293 /* mParticle_AppboyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D31A98A82153F73400358293 /* mParticle_AppboyTests.m */; };
2422
D31A98AB2153F73400358293 /* mParticle_Appboy.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB94016C1CB703F2007ABB18 /* mParticle_Appboy.framework */; };
2523
D34423302B960F44006CD046 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D344232F2B960F44006CD046 /* PrivacyInfo.xcprivacy */; };
@@ -96,7 +94,6 @@
9694
files = (
9795
5387EC022A18051200219E89 /* BrazeKit in Frameworks */,
9896
539B2E9F2A13D69F00C8339D /* BrazeUI in Frameworks */,
99-
539B2E9D2A13D69F00C8339D /* BrazeKitCompat in Frameworks */,
10097
539B2E982A13D66300C8339D /* mParticle-Apple-SDK in Frameworks */,
10198
);
10299
runOnlyForDeploymentPostprocessing = 0;
@@ -105,7 +102,6 @@
105102
isa = PBXFrameworksBuildPhase;
106103
buildActionMask = 2147483647;
107104
files = (
108-
539B2EA12A13D6AB00C8339D /* BrazeKitCompat in Frameworks */,
109105
539B2E9A2A13D66A00C8339D /* mParticle-Apple-SDK in Frameworks */,
110106
5387EC002A18050500219E89 /* BrazeKit in Frameworks */,
111107
);
@@ -285,7 +281,6 @@
285281
name = "mParticle-Appboy";
286282
packageProductDependencies = (
287283
539B2E972A13D66300C8339D /* mParticle-Apple-SDK */,
288-
539B2E9C2A13D69F00C8339D /* BrazeKitCompat */,
289284
539B2E9E2A13D69F00C8339D /* BrazeUI */,
290285
5387EC012A18051200219E89 /* BrazeKit */,
291286
);
@@ -309,7 +304,6 @@
309304
name = "mParticle-Appboy-tvOS";
310305
packageProductDependencies = (
311306
539B2E992A13D66A00C8339D /* mParticle-Apple-SDK */,
312-
539B2EA02A13D6AB00C8339D /* BrazeKitCompat */,
313307
5387EBFF2A18050500219E89 /* BrazeKit */,
314308
);
315309
productName = "mParticle-Appboy-tvOS";
@@ -450,10 +444,6 @@
450444
target = 531861FB2A13E147006FFE90 /* AppboyTestHost */;
451445
targetProxy = 531862102A13E17D006FFE90 /* PBXContainerItemProxy */;
452446
};
453-
539B2EA32A13D94E00C8339D /* PBXTargetDependency */ = {
454-
isa = PBXTargetDependency;
455-
productRef = 539B2EA22A13D94E00C8339D /* BrazeKitCompat */;
456-
};
457447
539B2EA52A13D95200C8339D /* PBXTargetDependency */ = {
458448
isa = PBXTargetDependency;
459449
productRef = 539B2EA42A13D95200C8339D /* BrazeUI */;
@@ -921,7 +911,7 @@
921911
repositoryURL = "https://github.com/braze-inc/braze-swift-sdk";
922912
requirement = {
923913
kind = upToNextMajorVersion;
924-
minimumVersion = 9.0.0;
914+
minimumVersion = 14.0.0;
925915
};
926916
};
927917
/* End XCRemoteSwiftPackageReference section */
@@ -952,26 +942,11 @@
952942
package = 539B2E962A13D66300C8339D /* XCRemoteSwiftPackageReference "mparticle-apple-sdk" */;
953943
productName = "mParticle-Apple-SDK";
954944
};
955-
539B2E9C2A13D69F00C8339D /* BrazeKitCompat */ = {
956-
isa = XCSwiftPackageProductDependency;
957-
package = 539B2E9B2A13D69F00C8339D /* XCRemoteSwiftPackageReference "braze-swift-sdk" */;
958-
productName = BrazeKitCompat;
959-
};
960945
539B2E9E2A13D69F00C8339D /* BrazeUI */ = {
961946
isa = XCSwiftPackageProductDependency;
962947
package = 539B2E9B2A13D69F00C8339D /* XCRemoteSwiftPackageReference "braze-swift-sdk" */;
963948
productName = BrazeUI;
964949
};
965-
539B2EA02A13D6AB00C8339D /* BrazeKitCompat */ = {
966-
isa = XCSwiftPackageProductDependency;
967-
package = 539B2E9B2A13D69F00C8339D /* XCRemoteSwiftPackageReference "braze-swift-sdk" */;
968-
productName = BrazeKitCompat;
969-
};
970-
539B2EA22A13D94E00C8339D /* BrazeKitCompat */ = {
971-
isa = XCSwiftPackageProductDependency;
972-
package = 539B2E9B2A13D69F00C8339D /* XCRemoteSwiftPackageReference "braze-swift-sdk" */;
973-
productName = BrazeKitCompat;
974-
};
975950
539B2EA42A13D95200C8339D /* BrazeUI */ = {
976951
isa = XCSwiftPackageProductDependency;
977952
package = 539B2E9B2A13D69F00C8339D /* XCRemoteSwiftPackageReference "braze-swift-sdk" */;

mParticle_AppboyTests/mParticle_AppboyTests.m

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@
33
@import XCTest;
44
@import OCMock;
55
#if TARGET_OS_IOS
6-
@import BrazeKitCompat;
76
@import BrazeUI;
8-
#else
9-
@import BrazeKitCompat;
107
#endif
118

9+
// Keys matching MPKitAppboy optionsDictionary
10+
static NSString *const kMPBrazeConfigEndpoint = @"endpoint";
11+
static NSString *const kMPBrazeConfigRequestPolicy = @"requestPolicy";
12+
static NSString *const kMPBrazeConfigFlushInterval = @"flushInterval";
13+
static NSString *const kMPBrazeConfigSessionTimeout = @"sessionTimeout";
14+
static NSString *const kMPBrazeConfigTriggerMinimumTimeInterval = @"triggerMinimumTimeInterval";
15+
static NSString *const kMPBrazeConfigAutomaticLocationCollection = @"automaticLocationCollection";
16+
1217
@interface MPKitAppboy ()
1318

1419
- (Braze *)appboyInstance;
@@ -50,8 +55,7 @@ - (void)testStartwithSimpleConfig {
5055

5156
[appBoy didFinishLaunchingWithConfiguration:kitConfiguration];
5257

53-
NSDictionary *testOptionsDictionary = @{ABKEnableAutomaticLocationCollectionKey:@(YES),
54-
ABKSDKFlavorKey:@7
58+
NSDictionary *testOptionsDictionary = @{kMPBrazeConfigAutomaticLocationCollection: @(YES)
5559
};
5660

5761
NSDictionary *optionsDictionary = [appBoy optionsDictionary];
@@ -73,12 +77,11 @@ - (void)testStartwithAdvancedConfig {
7377

7478
[appBoy didFinishLaunchingWithConfiguration:kitConfiguration];
7579

76-
NSDictionary *testOptionsDictionary = @{ABKEnableAutomaticLocationCollectionKey:@(YES),
77-
ABKSDKFlavorKey:@7,
78-
@"ABKRquestProcessingPolicy": @(1),
79-
@"ABKFlushInterval":@(2),
80-
@"ABKSessionTimeout":@(3),
81-
@"ABKMinimumTriggerTimeInterval":@(4)
80+
NSDictionary *testOptionsDictionary = @{kMPBrazeConfigAutomaticLocationCollection: @(YES),
81+
kMPBrazeConfigRequestPolicy: @(1),
82+
kMPBrazeConfigFlushInterval: @(2),
83+
kMPBrazeConfigSessionTimeout: @(3),
84+
kMPBrazeConfigTriggerMinimumTimeInterval: @(4)
8285
};
8386

8487
NSDictionary *optionsDictionary = [appBoy optionsDictionary];

0 commit comments

Comments
 (0)