Skip to content

Commit

Permalink
feat(ABTesting): ANLSPI-23827 new device (#340)
Browse files Browse the repository at this point in the history
* fix(autotrack): growingNodeChilds of collectionView not contain header as expected

* fix: add double-checked lock to deviceId getter

* feat: new device tag

* feat: first session tag

* feat(ABTesting): add newDevice to request parameters

* style: code format

* ci: update ci

* ci: update ci

* ci: update ci

---------

Co-authored-by: GIOSDK <[email protected]>
  • Loading branch information
YoloMao and GIOSDK authored Feb 13, 2025
1 parent e70a30a commit 2518804
Show file tree
Hide file tree
Showing 8 changed files with 102 additions and 88 deletions.
27 changes: 9 additions & 18 deletions .github/workflows/spm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,24 +19,24 @@ jobs:
macOS,
macCatalyst,
tvOS,
watchOS
watchOS,
]
os: [macos-13, macos-14]
os: [macos-14, macos-15]
include:
- os: macos-13
xcode: Xcode_15.2
- os: macos-14
xcode: Xcode_15.4
xcode: Xcode_16.0
- os: macos-15
xcode: Xcode_16.2
- target: iOS
platform: iOS Simulator,name=iPhone 14 Pro Max
platform: iOS Simulator,name=iPhone 16 Pro Max
- target: macOS
platform: macOS
- target: macCatalyst
platform: macOS,variant=Mac Catalyst
- target: tvOS
platform: tvOS Simulator,name=Apple TV
- target: watchOS
platform: watchOS Simulator,name=Apple Watch Ultra (49mm)
platform: watchOS Simulator,name=Apple Watch Ultra 2 (49mm)
- scheme: GrowingAnalytics-Package
target: iOS
- scheme: GrowingAutotracker
Expand All @@ -48,21 +48,12 @@ jobs:
- scheme: GrowingTracker
target: watchOS
- target: visionOS
os: macos-14
xcode: Xcode_15.4
os: macos-15
xcode: Xcode_16.2
platform: visionOS Simulator,name=Apple Vision Pro
scheme: GrowingTracker
runs-on: ${{ matrix.os }}
steps:
# https://github.com/actions/runner-images/issues/10559
- name: Download visionOS SDK
if: ${{ matrix.target == 'visionOS' }}
run: |
sudo xcodebuild -runFirstLaunch
sudo xcrun simctl list
sudo xcodebuild -downloadPlatform visionOS
sudo xcodebuild -runFirstLaunch
- name: Checkout Repo
uses: actions/checkout@v4
- name: Xcode
Expand Down
120 changes: 60 additions & 60 deletions Example/Podfile.lock
Original file line number Diff line number Diff line change
@@ -1,66 +1,66 @@
PODS:
- GrowingAnalytics/ABTesting (4.4.0):
- GrowingAnalytics/TrackerCore (= 4.4.0)
- GrowingAnalytics/Ads (4.4.0):
- GrowingAnalytics/TrackerCore (= 4.4.0)
- GrowingAnalytics/APM (4.4.0):
- GrowingAnalytics/TrackerCore (= 4.4.0)
- GrowingAnalytics/ABTesting (4.5.0):
- GrowingAnalytics/TrackerCore (= 4.5.0)
- GrowingAnalytics/Ads (4.5.0):
- GrowingAnalytics/TrackerCore (= 4.5.0)
- GrowingAnalytics/APM (4.5.0):
- GrowingAnalytics/TrackerCore (= 4.5.0)
- GrowingAPM/Core (~> 1.0.1)
- GrowingAnalytics/Autotracker (4.4.0):
- GrowingAnalytics/AutotrackerCore (= 4.4.0)
- GrowingAnalytics/DefaultServices (= 4.4.0)
- GrowingAnalytics/Hybrid (= 4.4.0)
- GrowingAnalytics/MobileDebugger (= 4.4.0)
- GrowingAnalytics/WebCircle (= 4.4.0)
- GrowingAnalytics/AutotrackerCore (4.4.0):
- GrowingAnalytics/TrackerCore (= 4.4.0)
- GrowingAnalytics/Autotracker (4.5.0):
- GrowingAnalytics/AutotrackerCore (= 4.5.0)
- GrowingAnalytics/DefaultServices (= 4.5.0)
- GrowingAnalytics/Hybrid (= 4.5.0)
- GrowingAnalytics/MobileDebugger (= 4.5.0)
- GrowingAnalytics/WebCircle (= 4.5.0)
- GrowingAnalytics/AutotrackerCore (4.5.0):
- GrowingAnalytics/TrackerCore (= 4.5.0)
- GrowingUtils/AutotrackerCore (~> 1.2.3)
- GrowingAnalytics/Compression (4.4.0):
- GrowingAnalytics/TrackerCore (= 4.4.0)
- GrowingAnalytics/Database (4.4.0):
- GrowingAnalytics/TrackerCore (= 4.4.0)
- GrowingAnalytics/DefaultServices (4.4.0):
- GrowingAnalytics/Compression (= 4.4.0)
- GrowingAnalytics/Encryption (= 4.4.0)
- GrowingAnalytics/JSON (= 4.4.0)
- GrowingAnalytics/Network (= 4.4.0)
- GrowingAnalytics/Protobuf (= 4.4.0)
- GrowingAnalytics/TrackerCore (= 4.4.0)
- GrowingAnalytics/Encryption (4.4.0):
- GrowingAnalytics/TrackerCore (= 4.4.0)
- GrowingAnalytics/Hybrid (4.4.0):
- GrowingAnalytics/TrackerCore (= 4.4.0)
- GrowingAnalytics/ImpressionTrack (4.4.0):
- GrowingAnalytics/AutotrackerCore (= 4.4.0)
- GrowingAnalytics/JSON (4.4.0):
- GrowingAnalytics/Database (= 4.4.0)
- GrowingAnalytics/MobileDebugger (4.4.0):
- GrowingAnalytics/Screenshot (= 4.4.0)
- GrowingAnalytics/TrackerCore (= 4.4.0)
- GrowingAnalytics/WebSocket (= 4.4.0)
- GrowingAnalytics/Network (4.4.0):
- GrowingAnalytics/TrackerCore (= 4.4.0)
- GrowingAnalytics/Protobuf (4.4.0):
- GrowingAnalytics/Database (= 4.4.0)
- GrowingAnalytics/Protobuf/Proto (= 4.4.0)
- GrowingAnalytics/Protobuf/Proto (4.4.0):
- GrowingAnalytics/Database (= 4.4.0)
- GrowingAnalytics/Compression (4.5.0):
- GrowingAnalytics/TrackerCore (= 4.5.0)
- GrowingAnalytics/Database (4.5.0):
- GrowingAnalytics/TrackerCore (= 4.5.0)
- GrowingAnalytics/DefaultServices (4.5.0):
- GrowingAnalytics/Compression (= 4.5.0)
- GrowingAnalytics/Encryption (= 4.5.0)
- GrowingAnalytics/JSON (= 4.5.0)
- GrowingAnalytics/Network (= 4.5.0)
- GrowingAnalytics/Protobuf (= 4.5.0)
- GrowingAnalytics/TrackerCore (= 4.5.0)
- GrowingAnalytics/Encryption (4.5.0):
- GrowingAnalytics/TrackerCore (= 4.5.0)
- GrowingAnalytics/Hybrid (4.5.0):
- GrowingAnalytics/TrackerCore (= 4.5.0)
- GrowingAnalytics/ImpressionTrack (4.5.0):
- GrowingAnalytics/AutotrackerCore (= 4.5.0)
- GrowingAnalytics/JSON (4.5.0):
- GrowingAnalytics/Database (= 4.5.0)
- GrowingAnalytics/MobileDebugger (4.5.0):
- GrowingAnalytics/Screenshot (= 4.5.0)
- GrowingAnalytics/TrackerCore (= 4.5.0)
- GrowingAnalytics/WebSocket (= 4.5.0)
- GrowingAnalytics/Network (4.5.0):
- GrowingAnalytics/TrackerCore (= 4.5.0)
- GrowingAnalytics/Protobuf (4.5.0):
- GrowingAnalytics/Database (= 4.5.0)
- GrowingAnalytics/Protobuf/Proto (= 4.5.0)
- GrowingAnalytics/Protobuf/Proto (4.5.0):
- GrowingAnalytics/Database (= 4.5.0)
- Protobuf (~> 3.27)
- GrowingAnalytics/Screenshot (4.4.0):
- GrowingAnalytics/TrackerCore (= 4.4.0)
- GrowingAnalytics/Tracker (4.4.0):
- GrowingAnalytics/DefaultServices (= 4.4.0)
- GrowingAnalytics/MobileDebugger (= 4.4.0)
- GrowingAnalytics/TrackerCore (= 4.4.0)
- GrowingAnalytics/TrackerCore (4.4.0):
- GrowingAnalytics/Screenshot (4.5.0):
- GrowingAnalytics/TrackerCore (= 4.5.0)
- GrowingAnalytics/Tracker (4.5.0):
- GrowingAnalytics/DefaultServices (= 4.5.0)
- GrowingAnalytics/MobileDebugger (= 4.5.0)
- GrowingAnalytics/TrackerCore (= 4.5.0)
- GrowingAnalytics/TrackerCore (4.5.0):
- GrowingUtils/TrackerCore (~> 1.2.3)
- GrowingAnalytics/WebCircle (4.4.0):
- GrowingAnalytics/AutotrackerCore (= 4.4.0)
- GrowingAnalytics/Hybrid (= 4.4.0)
- GrowingAnalytics/Screenshot (= 4.4.0)
- GrowingAnalytics/WebSocket (= 4.4.0)
- GrowingAnalytics/WebSocket (4.4.0):
- GrowingAnalytics/TrackerCore (= 4.4.0)
- GrowingAnalytics/WebCircle (4.5.0):
- GrowingAnalytics/AutotrackerCore (= 4.5.0)
- GrowingAnalytics/Hybrid (= 4.5.0)
- GrowingAnalytics/Screenshot (= 4.5.0)
- GrowingAnalytics/WebSocket (= 4.5.0)
- GrowingAnalytics/WebSocket (4.5.0):
- GrowingAnalytics/TrackerCore (= 4.5.0)
- GrowingAPM (1.0.1):
- GrowingAPM/Core (= 1.0.1)
- GrowingAPM/CrashMonitor (= 1.0.1)
Expand Down Expand Up @@ -160,7 +160,7 @@ EXTERNAL SOURCES:
:path: "../"

SPEC CHECKSUMS:
GrowingAnalytics: d50200337f7dbad6d087705119c6f0605cdc91a2
GrowingAnalytics: dd1b26e83f30a322f5c5c2dd7a4b8da65c0c0b3e
GrowingAPM: 3c4de0384935b654e6798b95606f47883a99418b
GrowingToolsKit: 53160d19690da0b78e04a9242abde7af86442922
GrowingUtils: 68aee2c96849bf9b674740503da30c2da468e79d
Expand All @@ -172,4 +172,4 @@ SPEC CHECKSUMS:

PODFILE CHECKSUM: 8ef4d85701caba0f5df403432dc182d34412ab4a

COCOAPODS: 1.15.2
COCOAPODS: 1.16.1
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,18 @@
@implementation UICollectionView (GrowingNode)

- (NSArray<id<GrowingNode>> *)growingNodeChilds {
// 对于collectionView我们仅需要返回可见cell
// 对于CollectionViewCell仅需要返回可见的cell
NSMutableArray *children = [NSMutableArray array];
if (@available(iOS 9.0, *)) {
NSArray *headers = [self visibleSupplementaryViewsOfKind:UICollectionElementKindSectionHeader];
NSArray *footers = [self visibleSupplementaryViewsOfKind:UICollectionElementKindSectionFooter];
[children addObjectsFromArray:headers];
[children addObjectsFromArray:footers];
}
[children addObjectsFromArray:self.visibleCells];

// header/footer使用subviews获取
NSArray *subviews = self.subviews;
for (UIView *view in subviews) {
if (![view isKindOfClass:UICollectionViewCell.class]) {
[children addObject:view];
}
}

return children;
}

Expand Down
1 change: 1 addition & 0 deletions GrowingTrackerCore/Manager/GrowingSession.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ typedef NS_ENUM(NSInteger, GrowingSessionState) {
@property (nonatomic, assign, readonly) double latitude;
@property (nonatomic, assign, readonly) double longitude;
@property (nonatomic, assign, readonly) GrowingSessionState state;
@property (nonatomic, assign, readonly) BOOL firstSession;

+ (void)startSession;

Expand Down
2 changes: 2 additions & 0 deletions GrowingTrackerCore/Manager/GrowingSession.m
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ @interface GrowingSession () <GrowingULAppLifecycleDelegate>
@property (nonatomic, assign) long long latestDidEnterBackgroundTime;
@property (nonatomic, strong, readonly) NSHashTable *userIdChangedDelegates;
@property (nonatomic, assign, readwrite) GrowingSessionState state;
@property (nonatomic, assign, readwrite) BOOL firstSession;

@end

Expand Down Expand Up @@ -93,6 +94,7 @@ - (void)generateVisit {
}

- (void)refreshSessionId {
_firstSession = !(_sessionId && _sessionId.length > 0);
_sessionId = NSUUID.UUID.UUIDString;
_sentVisitAfterRefreshSessionId = NO;
}
Expand Down
1 change: 1 addition & 0 deletions GrowingTrackerCore/Utils/GrowingDeviceInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
@property (nonatomic, readonly, assign) CGFloat screenWidth;
@property (nonatomic, readonly, assign) CGFloat screenHeight;
@property (nonatomic, readonly, assign) NSInteger timezoneOffset;
@property (nonatomic, readonly, assign) BOOL isNewDevice;

+ (instancetype)currentDeviceInfo;
+ (void)setup;
Expand Down
8 changes: 7 additions & 1 deletion GrowingTrackerCore/Utils/GrowingDeviceInfo.m
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ @interface GrowingDeviceInfo () <GrowingULAppLifecycleDelegate>
@property (nonatomic, readwrite, assign) CGFloat screenWidth;
@property (nonatomic, readwrite, assign) CGFloat screenHeight;
@property (nonatomic, readwrite, assign) NSInteger timezoneOffset;
@property (nonatomic, readwrite, assign) BOOL isNewDevice;

@end

Expand All @@ -74,6 +75,7 @@ - (instancetype)init {
_deviceBrand = @"Apple";
_appState = 0;
_timezoneOffset = -([[NSTimeZone defaultTimeZone] secondsFromGMT] / 60);
_isNewDevice = NO;

#if Growing_USE_APPKIT
_screenWidth = NSScreen.mainScreen.frame.size.width;
Expand Down Expand Up @@ -155,6 +157,7 @@ - (NSString *)getDeviceIdString {
#if Growing_OS_PURE_IOS || Growing_OS_WATCH || Growing_OS_VISION || Growing_OS_TV
[GrowingKeyChainWrapper setKeychainObject:uuid forKey:kGrowingKeychainUserIdKey];
#endif
_isNewDevice = YES;
return uuid;
}

Expand Down Expand Up @@ -229,7 +232,10 @@ - (void)applicationWillResignActive {
- (NSString *)deviceIDString {
if (!_deviceIDString) {
GROWING_LOCK(lock);
_deviceIDString = [self getDeviceIdString];
// double checked locking
if (!_deviceIDString) {
_deviceIDString = [self getDeviceIdString];
}
GROWING_UNLOCK(lock);
}
return _deviceIDString;
Expand Down
14 changes: 12 additions & 2 deletions Modules/ABTesting/Request/GrowingABTRequest.m
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#import "Modules/ABTesting/Request/GrowingABTRequestAdapter.h"

#import "GrowingTrackerCore/Manager/GrowingConfigurationManager.h"
#import "GrowingTrackerCore/Manager/GrowingSession.h"
#import "GrowingTrackerCore/Network/Request/Adapter/GrowingRequestAdapter.h"
#import "GrowingTrackerCore/Utils/GrowingDeviceInfo.h"

Expand All @@ -47,13 +48,22 @@ - (NSString *)path {
NSString *accountId = config.accountId;
NSString *datasourceId = config.dataSourceId;
NSString *distinctId = [GrowingDeviceInfo currentDeviceInfo].deviceIDString;
bodyAdapter.parameters = @{

NSMutableDictionary *parameters = @{
@"accountId": accountId,
@"datasourceId": datasourceId,
@"distinctId": distinctId,
@"layerId": self.layerId.copy
};
}
.mutableCopy;

BOOL newDevice =
[GrowingDeviceInfo currentDeviceInfo].isNewDevice && [[GrowingSession currentSession] firstSession];
if (newDevice) {
parameters[@"newDevice"] = @(newDevice);
}

bodyAdapter.parameters = parameters.copy;
GrowingRequestMethodAdapter *methodAdapter = [GrowingRequestMethodAdapter adapterWithRequest:self];
NSMutableArray *adapters = [NSMutableArray arrayWithObjects:bodyAdapter, methodAdapter, nil];
return adapters;
Expand Down

0 comments on commit 2518804

Please sign in to comment.