Skip to content

Commit

Permalink
Merge pull request #13 from adjust/v4113
Browse files Browse the repository at this point in the history
v4.11.3
  • Loading branch information
uerceg authored May 15, 2017
2 parents d0577a5 + 5778b33 commit 08a9198
Show file tree
Hide file tree
Showing 24 changed files with 219 additions and 80 deletions.
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
### Version 4.11.3 (15th May 2017)
#### Added
- **[iOS][AND]** Added check if `sdk_click` package response contains attribution information.
- **[iOS][AND]** Added sending of attributable parameters with every `sdk_click` package.

#### Changed
- **[iOS][AND]** Replaced `assert` level logs with `warn` level.

#### Native SDKs
- **[iOS]** [[email protected]][ios_sdk_v4.11.4]
- **[AND]** [[email protected]][android_sdk_v4.11.4]

---

### Version 4.11.2 (24th April 2017)
#### Added
- **[iOS]** Added nullability annotations to public headers for Swift 3.0 compatibility.
Expand Down Expand Up @@ -80,8 +94,10 @@
[ios_sdk_v4.10.3]: https://github.com/adjust/ios_sdk/tree/v4.10.3
[ios_sdk_v4.11.0]: https://github.com/adjust/ios_sdk/tree/v4.11.0
[ios_sdk_v4.11.3]: https://github.com/adjust/ios_sdk/tree/v4.11.3
[ios_sdk_v4.11.4]: https://github.com/adjust/ios_sdk/tree/v4.11.4

[android_sdk_v4.10.4]: https://github.com/adjust/android_sdk/tree/v4.10.4
[android_sdk_v4.11.0]: https://github.com/adjust/android_sdk/tree/v4.11.0
[android_sdk_v4.11.1]: https://github.com/adjust/android_sdk/tree/v4.11.1
[android_sdk_v4.11.3]: https://github.com/adjust/android_sdk/tree/v4.11.3
[android_sdk_v4.11.4]: https://github.com/adjust/android_sdk/tree/v4.11.4
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
4.11.2
4.11.3
Binary file modified android/libs/adjust-android.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion ext/Android/sdk
Submodule sdk updated 39 files
+2 −2 Adjust/adjust/build.gradle
+49 −6 Adjust/adjust/src/main/java/com/adjust/sdk/ActivityHandler.java
+8 −24 Adjust/adjust/src/main/java/com/adjust/sdk/AdjustConfig.java
+3 −3 Adjust/adjust/src/main/java/com/adjust/sdk/AdjustFactory.java
+21 −0 Adjust/adjust/src/main/java/com/adjust/sdk/AttributionHandler.java
+1 −1 Adjust/adjust/src/main/java/com/adjust/sdk/Constants.java
+2 −0 Adjust/adjust/src/main/java/com/adjust/sdk/IActivityHandler.java
+3 −1 Adjust/adjust/src/main/java/com/adjust/sdk/IAttributionHandler.java
+3 −2 Adjust/adjust/src/main/java/com/adjust/sdk/ILogger.java
+1 −1 Adjust/adjust/src/main/java/com/adjust/sdk/ISdkClickHandler.java
+37 −4 Adjust/adjust/src/main/java/com/adjust/sdk/Logger.java
+21 −9 Adjust/adjust/src/main/java/com/adjust/sdk/PackageBuilder.java
+3 −0 Adjust/adjust/src/main/java/com/adjust/sdk/ResponseData.java
+18 −4 Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickHandler.java
+8 −0 Adjust/adjust/src/main/java/com/adjust/sdk/SdkClickResponseData.java
+1 −1 Adjust/build.gradle
+2 −2 Adjust/example/build.gradle
+1 −1 Adjust/pom.xml
+1 −1 Adjust/pom_criteo.xml
+1 −1 Adjust/pom_sociomantic.xml
+1 −1 Adjust/pom_trademob.xml
+6 −0 Adjust/test/src/androidTest/java/com/adjust/sdk/MockActivityHandler.java
+10 −2 Adjust/test/src/androidTest/java/com/adjust/sdk/MockAttributionHandler.java
+12 −3 Adjust/test/src/androidTest/java/com/adjust/sdk/MockLogger.java
+3 −1 Adjust/test/src/androidTest/java/com/adjust/sdk/MockSdkClickHandler.java
+256 −134 Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityHandler.java
+28 −3 Adjust/test/src/androidTest/java/com/adjust/sdk/TestActivityPackage.java
+58 −1 Adjust/test/src/androidTest/java/com/adjust/sdk/TestAttributionHandler.java
+12 −7 Adjust/test/src/androidTest/java/com/adjust/sdk/TestSdkClickHandler.java
+10 −0 CHANGELOG.md
+6 −2 README.md
+1 −1 VERSION
+1 −1 doc/english/criteo_plugin.md
+1 −1 doc/english/migrate.md
+1 −1 doc/english/sociomantic_plugin.md
+1 −1 doc/english/trademob_plugin.md
+41 −0 doc/japanese/referrer_ja.md
+463 −0 doc/japanese/sociomantic_plugin_ja.md
+96 −0 doc/japanese/trademob_plugin_ja.md
2 changes: 1 addition & 1 deletion ext/iOS/sdk
Submodule sdk updated 44 files
+2 −2 Adjust.podspec
+179 −0 Adjust.xcodeproj/project.pbxproj
+1 −0 Adjust/ADJActivityHandler.h
+79 −24 Adjust/ADJActivityHandler.m
+2 −1 Adjust/ADJAdjustFactory.h
+4 −3 Adjust/ADJAdjustFactory.m
+2 −0 Adjust/ADJAttributionHandler.h
+16 −0 Adjust/ADJAttributionHandler.m
+11 −22 Adjust/ADJConfig.m
+2 −1 Adjust/ADJLogger.h
+18 −2 Adjust/ADJLogger.m
+2 −1 Adjust/ADJPackageBuilder.h
+25 −12 Adjust/ADJPackageBuilder.m
+3 −0 Adjust/ADJResponseData.h
+8 −0 Adjust/ADJResponseData.m
+5 −2 Adjust/ADJSdkClickHandler.h
+18 −5 Adjust/ADJSdkClickHandler.m
+1 −1 Adjust/ADJUtil.m
+1 −1 Adjust/Adjust.h
+17 −0 AdjustExampleTests/AppDelegate.h
+51 −0 AdjustExampleTests/AppDelegate.m
+48 −0 AdjustExampleTests/Assets.xcassets/AppIcon.appiconset/Contents.json
+27 −0 AdjustExampleTests/Base.lproj/LaunchScreen.storyboard
+26 −0 AdjustExampleTests/Base.lproj/Main.storyboard
+38 −0 AdjustExampleTests/Info.plist
+15 −0 AdjustExampleTests/ViewController.h
+29 −0 AdjustExampleTests/ViewController.m
+16 −0 AdjustExampleTests/main.m
+20 −16 AdjustTests/ADJActivityHandlerTests.m
+4 −3 AdjustTests/ADJAttributionHandlerMock.m
+14 −8 AdjustTests/ADJAttributionHandlerTests.m
+8 −2 AdjustTests/ADJLoggerMock.m
+0 −1 AdjustTests/ADJPackageFields.h
+1 −1 AdjustTests/ADJPackageFields.m
+6 −2 AdjustTests/ADJPackageHandlerTests.m
+4 −2 AdjustTests/ADJSdkClickHandlerMock.m
+20 −10 AdjustTests/ADJSdkClickHandlerTests.m
+10 −0 CHANGELOG.md
+3 −3 README.md
+1 −1 VERSION
+1 −1 doc/english/migrate.md
+1 −1 doc/japanese/migrate_ja.md
+1 −1 doc/migrate.md
+3 −19 plugin/Sociomantic/ADJSociomantic.h
2 changes: 1 addition & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ var AdjustConfig = function(appToken, environment) {
this.appToken = appToken;
this.environment = environment;

this.sdkPrefix = "react_native4.11.2";
this.sdkPrefix = "react_native4.11.3";
this.logLevel = null;

this.eventBufferingEnabled = null;
Expand Down
1 change: 1 addition & 0 deletions ios/Adjust/ADJActivityHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ sessionParametersActionsArray:(NSArray*)sessionParametersActionsArray
- (void)finishedTracking:(ADJResponseData *)responseData;
- (void)launchEventResponseTasks:(ADJEventResponseData *)eventResponseData;
- (void)launchSessionResponseTasks:(ADJSessionResponseData *)sessionResponseData;
- (void)launchSdkClickResponseTasks:(ADJSdkClickResponseData *)sdkClickResponseData;
- (void)launchAttributionResponseTasks:(ADJAttributionResponseData *)attributionResponseData;
- (void)setEnabled:(BOOL)enabled;
- (BOOL)isEnabled;
Expand Down
103 changes: 79 additions & 24 deletions ios/Adjust/ADJActivityHandler.m
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,12 @@ - (void)finishedTracking:(ADJResponseData *)responseData {
return;
}

// redirect sdk_click responses to attribution handler to check for attribution information
if ([responseData isKindOfClass:[ADJSdkClickResponseData class]]) {
[self.attributionHandler checkSdkClickResponse:(ADJSdkClickResponseData*)responseData];
return;
}

// check if it's an event response
if ([responseData isKindOfClass:[ADJEventResponseData class]]) {
[self launchEventResponseTasks:(ADJEventResponseData*)responseData];
Expand All @@ -261,6 +267,14 @@ - (void)launchSessionResponseTasks:(ADJSessionResponseData *)sessionResponseData
}];
}

- (void)launchSdkClickResponseTasks:(ADJSdkClickResponseData *)sdkClickResponseData {
[ADJUtil launchInQueue:self.internalQueue
selfInject:self
block:^(ADJActivityHandler * selfI) {
[selfI launchSdkClickResponseTasksI:selfI sdkClickResponseData:sdkClickResponseData];
}];
}

- (void)launchAttributionResponseTasks:(ADJAttributionResponseData *)attributionResponseData {
[ADJUtil launchInQueue:self.internalQueue
selfInject:self
Expand Down Expand Up @@ -399,27 +413,14 @@ - (void)setDeviceToken:(NSData *)deviceToken {
}];
}

- (void)setIadDate:(NSDate *)iAdImpressionDate withPurchaseDate:(NSDate *)appPurchaseDate {
if (iAdImpressionDate == nil) {
[self.logger debug:@"iAdImpressionDate not received"];
return;
}

[self.logger debug:@"iAdImpressionDate received: %@", iAdImpressionDate];


double now = [NSDate.date timeIntervalSince1970];
ADJPackageBuilder *clickBuilder = [[ADJPackageBuilder alloc]
initWithDeviceInfo:self.deviceInfo
activityState:self.activityState
config:self.adjustConfig
createdAt:now];

clickBuilder.purchaseTime = appPurchaseDate;
clickBuilder.clickTime = iAdImpressionDate;

ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage:@"iad"];
[self.sdkClickHandler sendSdkClick:clickPackage];
- (void)setIadDate:(NSDate *)iAdImpressionDate
withPurchaseDate:(NSDate *)appPurchaseDate
{
[ADJUtil launchInQueue:self.internalQueue
selfInject:self
block:^(ADJActivityHandler * selfI) {
[selfI setIadDateI:selfI iAdImpressionDate:iAdImpressionDate withPurchaseDate:appPurchaseDate];
}];
}

- (void)setAttributionDetails:(NSDictionary *)attributionDetails
Expand Down Expand Up @@ -485,6 +486,10 @@ - (void)sendIad3ClickPackage:(ADJActivityHandler *)selfI
attributionDetails:(NSDictionary *)attributionDetails
{
double now = [NSDate.date timeIntervalSince1970];
if (selfI.activityState != nil) {
double lastInterval = now - selfI.activityState.lastActivity;
selfI.activityState.lastInterval = lastInterval;
}
ADJPackageBuilder *clickBuilder = [[ADJPackageBuilder alloc]
initWithDeviceInfo:selfI.deviceInfo
activityState:selfI.activityState
Expand All @@ -493,7 +498,7 @@ - (void)sendIad3ClickPackage:(ADJActivityHandler *)selfI

clickBuilder.attributionDetails = attributionDetails;

ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage:@"iad3"];
ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage:@"iad3" sessionParameters:selfI.sessionParameters];
[selfI.sdkClickHandler sendSdkClick:clickPackage];
}

Expand Down Expand Up @@ -716,7 +721,8 @@ - (void)initI:(ADJActivityHandler *)selfI
startsSending:[selfI toSendI:selfI
sdkClickHandlerOnly:NO]];

selfI.sdkClickHandler = [ADJAdjustFactory sdkClickHandlerWithStartsPaused:[selfI toSendI:selfI
selfI.sdkClickHandler = [ADJAdjustFactory sdkClickHandlerWithStartsPaused:selfI
startsSending:[selfI toSendI:selfI
sdkClickHandlerOnly:YES]];

[[UIDevice currentDevice] adjSetIad:selfI triesV3Left:kTryIadV3];
Expand Down Expand Up @@ -930,6 +936,21 @@ - (void)launchSessionResponseTasksI:(ADJActivityHandler *)selfI
self.internalState.sessionResponseProcessed = YES;
}

- (void)launchSdkClickResponseTasksI:(ADJActivityHandler *)selfI
sdkClickResponseData:(ADJSdkClickResponseData *)sdkClickResponseData {
[selfI updateAdidI:selfI adid:sdkClickResponseData.adid];

BOOL toLaunchAttributionDelegate = [selfI updateAttributionI:selfI attribution:sdkClickResponseData.attribution];

// try to update and launch the attribution changed delegate
if (toLaunchAttributionDelegate) {
[selfI.logger debug:@"Launching attribution changed delegate"];
[ADJUtil launchInMainThread:selfI.adjustDelegate
selector:@selector(adjustAttributionChanged:)
withObject:sdkClickResponseData.attribution];
}
}

- (void)launchAttributionResponseTasksI:(ADJActivityHandler *)selfI
attributionResponseData:(ADJAttributionResponseData *)attributionResponseData {
[selfI updateAdidI:selfI adid:attributionResponseData.adid];
Expand Down Expand Up @@ -1034,6 +1055,9 @@ - (void)appWillOpenUrlI:(ADJActivityHandler *)selfI
}

double now = [NSDate.date timeIntervalSince1970];
double lastInterval = now - selfI.activityState.lastActivity;
selfI.activityState.lastInterval = lastInterval;

ADJPackageBuilder *clickBuilder = [[ADJPackageBuilder alloc]
initWithDeviceInfo:selfI.deviceInfo
activityState:selfI.activityState
Expand All @@ -1044,7 +1068,7 @@ - (void)appWillOpenUrlI:(ADJActivityHandler *)selfI
clickBuilder.clickTime = [NSDate date];
clickBuilder.deeplink = [url absoluteString];

ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage:@"deeplink"];
ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage:@"deeplink" sessionParameters:selfI.sessionParameters];
[selfI.sdkClickHandler sendSdkClick:clickPackage];
}

Expand Down Expand Up @@ -1133,6 +1157,37 @@ - (void)setDeviceTokenI:(ADJActivityHandler *)selfI
[selfI.packageHandler sendFirstPackage];
}

- (void)setIadDateI:(ADJActivityHandler *)selfI
iAdImpressionDate:(NSDate *)iAdImpressionDate
withPurchaseDate:(NSDate *)appPurchaseDate
{
if (iAdImpressionDate == nil) {
[self.logger debug:@"iAdImpressionDate not received"];
return;
}

[self.logger debug:@"iAdImpressionDate received: %@", iAdImpressionDate];

double now = [NSDate.date timeIntervalSince1970];
if (selfI.activityState != nil) {
double lastInterval = now - selfI.activityState.lastActivity;
selfI.activityState.lastInterval = lastInterval;
}

ADJPackageBuilder *clickBuilder = [[ADJPackageBuilder alloc]
initWithDeviceInfo:self.deviceInfo
activityState:self.activityState
config:self.adjustConfig
createdAt:now];

clickBuilder.purchaseTime = appPurchaseDate;
clickBuilder.clickTime = iAdImpressionDate;

ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage:@"iad" sessionParameters:selfI.sessionParameters];
[self.sdkClickHandler sendSdkClick:clickPackage];
}


#pragma mark - private

- (BOOL)isEnabledI:(ADJActivityHandler *)selfI {
Expand Down
3 changes: 2 additions & 1 deletion ios/Adjust/ADJAdjustFactory.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
+ (id<ADJActivityHandler>)activityHandlerWithConfig:(ADJConfig *)adjustConfig
sessionParametersActionsArray:(NSArray*)sessionParametersActionsArray
deviceToken:(NSData*)deviceToken;
+ (id<ADJSdkClickHandler>)sdkClickHandlerWithStartsPaused:(BOOL)startsSending;
+ (id<ADJSdkClickHandler>)sdkClickHandlerWithStartsPaused:(id<ADJActivityHandler>)activityHandler
startsSending:(BOOL)startsSending;

+ (id<ADJLogger>)logger;
+ (double)sessionInterval;
Expand Down
7 changes: 4 additions & 3 deletions ios/Adjust/ADJAdjustFactory.m
Original file line number Diff line number Diff line change
Expand Up @@ -122,13 +122,14 @@ + (ADJBackoffStrategy *)sdkClickHandlerBackoffStrategy {
startsSending:startsSending];
}

+ (id<ADJSdkClickHandler>)sdkClickHandlerWithStartsPaused:(BOOL)startsSending
+ (id<ADJSdkClickHandler>)sdkClickHandlerWithStartsPaused:(id<ADJActivityHandler>)activityHandler
startsSending:(BOOL)startsSending
{
if (internalSdkClickHandler == nil) {
return [ADJSdkClickHandler handlerWithStartsSending:startsSending];
return [ADJSdkClickHandler handlerWithActivityHandler:activityHandler startsSending:startsSending];
}

return [internalSdkClickHandler initWithStartsSending:startsSending];
return [internalSdkClickHandler initWithActivityHandler:activityHandler startsSending:startsSending];
}

+ (BOOL)testing {
Expand Down
2 changes: 2 additions & 0 deletions ios/Adjust/ADJAttributionHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

- (void)checkSessionResponse:(ADJSessionResponseData *)sessionResponseData;

- (void)checkSdkClickResponse:(ADJSdkClickResponseData *)sdkClickResponseData;

- (void)checkAttributionResponse:(ADJAttributionResponseData *)attributionResponseData;

- (void)getAttribution;
Expand Down
16 changes: 16 additions & 0 deletions ios/Adjust/ADJAttributionHandler.m
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,15 @@ - (void)checkSessionResponse:(ADJSessionResponseData *)sessionResponseData {
}];
}

- (void)checkSdkClickResponse:(ADJSdkClickResponseData *)sdkClickResponseData {
[ADJUtil launchInQueue:self.internalQueue
selfInject:self
block:^(ADJAttributionHandler* selfI) {
[selfI checkSdkClickResponseI:selfI
sdkClickResponseData:sdkClickResponseData];
}];
}

- (void)checkAttributionResponse:(ADJAttributionResponseData *)attributionResponseData {
[ADJUtil launchInQueue:self.internalQueue
selfInject:self
Expand Down Expand Up @@ -110,6 +119,13 @@ - (void)checkSessionResponseI:(ADJAttributionHandler*)selfI
[selfI.activityHandler launchSessionResponseTasks:sessionResponseData];
}

- (void)checkSdkClickResponseI:(ADJAttributionHandler*)selfI
sdkClickResponseData:(ADJSdkClickResponseData *)sdkClickResponseData {
[selfI checkAttributionI:selfI responseData:sdkClickResponseData];

[selfI.activityHandler launchSdkClickResponseTasks:sdkClickResponseData];
}

- (void)checkAttributionResponseI:(ADJAttributionHandler*)selfI
attributionResponseData:(ADJAttributionResponseData *)attributionResponseData {
[selfI checkAttributionI:selfI responseData:attributionResponseData];
Expand Down
33 changes: 11 additions & 22 deletions ios/Adjust/ADJConfig.m
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
@interface ADJConfig()

@property (nonatomic, weak) id<ADJLogger> logger;
@property (nonatomic, assign) BOOL allowSuppressLogLevel;

@end

Expand Down Expand Up @@ -48,10 +47,13 @@ - (id)initWithAppToken:(NSString *)appToken
self = [super init];
if (self == nil) return nil;

self.allowSuppressLogLevel = allowSuppressLogLevel;
self.logger = ADJAdjustFactory.logger;
// default values
[self setLogLevel:ADJLogLevelInfo environment:environment];
if (allowSuppressLogLevel && [ADJEnvironmentProduction isEqualToString:environment]) {
[self setLogLevel:ADJLogLevelSuppress environment:environment];
} else {
[self setLogLevel:ADJLogLevelInfo environment:environment];
}

if (![self checkEnvironment:environment]) return self;
if (![self checkAppToken:appToken]) return self;
Expand All @@ -69,25 +71,12 @@ - (void)setLogLevel:(ADJLogLevel)logLevel {
}

- (void)setLogLevel:(ADJLogLevel)logLevel
environment:(NSString *)environment{
if ([environment isEqualToString:ADJEnvironmentProduction]) {
if (self.allowSuppressLogLevel) {
_logLevel = ADJLogLevelSuppress;
} else {
_logLevel = ADJLogLevelAssert;
}
} else {
if (!self.allowSuppressLogLevel &&
logLevel == ADJLogLevelSuppress) {
_logLevel = ADJLogLevelAssert;
} else {
_logLevel = logLevel;
}
}
[self.logger setLogLevel:self.logLevel];
environment:(NSString *)environment
{
[self.logger setLogLevel:logLevel
isProductionEnvironment:[ADJEnvironmentProduction isEqualToString:environment]];
}


- (void)setDelegate:(NSObject<AdjustDelegate> *)delegate {
BOOL hasResponseDelegate = NO;
BOOL implementsDeeplinkCallback = NO;
Expand Down Expand Up @@ -151,10 +140,10 @@ - (BOOL)checkEnvironment:(NSString *)environment
return NO;
}
if ([environment isEqualToString:ADJEnvironmentSandbox]) {
[self.logger assert:@"SANDBOX: Adjust is running in Sandbox mode. Use this setting for testing. Don't forget to set the environment to `production` before publishing"];
[self.logger warnInProduction:@"SANDBOX: Adjust is running in Sandbox mode. Use this setting for testing. Don't forget to set the environment to `production` before publishing"];
return YES;
} else if ([environment isEqualToString:ADJEnvironmentProduction]) {
[self.logger assert:@"PRODUCTION: Adjust is running in Production mode. Use this setting only for the build that you want to publish. Set the environment to `sandbox` if you want to test your app!"];
[self.logger warnInProduction:@"PRODUCTION: Adjust is running in Production mode. Use this setting only for the build that you want to publish. Set the environment to `sandbox` if you want to test your app!"];
return YES;
}
[self.logger error:@"Unknown environment '%@'", environment];
Expand Down
3 changes: 2 additions & 1 deletion ios/Adjust/ADJLogger.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ typedef enum {
*
* @param logLevel Level of the logs to be displayed.
*/
- (void)setLogLevel:(ADJLogLevel)logLevel;
- (void)setLogLevel:(ADJLogLevel)logLevel isProductionEnvironment:(BOOL)isProductionEnvironment;

/**
* @brief Prevent log level changes.
Expand All @@ -53,6 +53,7 @@ typedef enum {
* @brief Print warn logs.
*/
- (void)warn:(nonnull NSString *)message, ...;
- (void)warnInProduction:(nonnull NSString *)message, ...;

/**
* @brief Print error logs.
Expand Down
Loading

0 comments on commit 08a9198

Please sign in to comment.