SDK_UnityMoney/Assets/Adjust/Native/iOS/AdjustUnity.mm

930 lines
38 KiB
Plaintext

//
// AdjustUnity.mm
// Adjust SDK
//
// Created by Pedro Silva (@nonelse) on 27th March 2014.
// Copyright © 2012-2018 Adjust GmbH. All rights reserved.
//
#import <AdjustSdk/AdjustSdk.h>
#import "AdjustUnity.h"
#import "AdjustUnityDelegate.h"
#import "AdjustUnityAppDelegate.h"
@implementation AdjustUnity
#pragma mark - Object lifecycle methods
+ (void)load {
// swizzle AppDelegate on the load
// it should be done as early as possible
[AdjustUnityAppDelegate swizzleAppDelegateCallbacks];
}
@end
#pragma mark - Helper C methods
// method for converting JSON stirng parameters into NSArray object
NSArray* convertArrayParameters(const char* cStringJsonArrayParameters) {
if (cStringJsonArrayParameters == NULL) {
return nil;
}
NSError *error = nil;
NSArray *arrayParameters = nil;
NSString *stringJsonArrayParameters = [NSString stringWithUTF8String:cStringJsonArrayParameters];
if (stringJsonArrayParameters != nil) {
NSData *dataJson = [stringJsonArrayParameters dataUsingEncoding:NSUTF8StringEncoding];
arrayParameters = [NSJSONSerialization JSONObjectWithData:dataJson options:0 error:&error];
}
if (error != nil) {
NSString *errorMessage = @"Failed to parse json parameters!";
NSLog(@"%@", errorMessage);
}
return arrayParameters;
}
BOOL isStringValid(const char* cString) {
if (cString == NULL) {
return false;
}
NSString *objcString = [NSString stringWithUTF8String:cString];
if (objcString == nil) {
return false;
}
if ([objcString isEqualToString:@"ADJ_INVALID"]) {
return false;
}
return true;
}
void addValueOrEmpty(NSMutableDictionary *dictionary, NSString *key, NSObject *value) {
if (nil != value) {
if ([value isKindOfClass:[NSString class]]) {
[dictionary setObject:[NSString stringWithFormat:@"%@", value] forKey:key];
} else if ([value isKindOfClass:[NSNumber class]]) {
[dictionary setObject:[NSString stringWithFormat:@"%@", [((NSNumber *)value) stringValue]] forKey:key];
} else {
[dictionary setObject:@"" forKey:key];
}
} else {
[dictionary setObject:@"" forKey:key];
}
}
#pragma mark - Publicly available C methods
extern "C"
{
void _AdjustInitSdk(
const char* appToken,
const char* environment,
const char* sdkPrefix,
const char* defaultTracker,
const char* externalDeviceId,
const char* jsonUrlStrategyDomains,
const char* storeName,
const char* storeAppId,
int allowSuppressLogLevel,
int logLevel,
int attConsentWaitingInterval,
int eventDeduplicationIdsMaxSize,
int shouldUseSubdomains,
int isCoppaComplianceEnabled,
int isDataResidency,
int isSendingInBackgroundEnabled,
int isAdServicesEnabled,
int isIdfaReadingEnabled,
int isIdfvReadingEnabled,
int isSkanAttributionEnabled,
int isLinkMeEnabled,
int isCostDataInAttributionEnabled,
int isDeviceIdsReadingOnceEnabled,
int isAppTrackingTransparencyUsageEnabled,
int isFirstSessionDelayEnabled,
int isDeferredDeeplinkOpeningEnabled,
AdjustDelegateAttributionCallback attributionCallback,
AdjustDelegateEventSuccessCallback eventSuccessCallback,
AdjustDelegateEventFailureCallback eventFailureCallback,
AdjustDelegateSessionSuccessCallback sessionSuccessCallback,
AdjustDelegateSessionFailureCallback sessionFailureCallback,
AdjustDelegateDeferredDeeplinkCallback deferredDeeplinkCallback,
AdjustDelegateSkanUpdatedCallback skanUpdatedCallback) {
NSString *strAppToken = isStringValid(appToken) == true ? [NSString stringWithUTF8String:appToken] : nil;
NSString *strEnvironment = isStringValid(environment) == true ? [NSString stringWithUTF8String:environment] : nil;
NSString *strSdkPrefix = isStringValid(sdkPrefix) == true ? [NSString stringWithUTF8String:sdkPrefix] : nil;
NSString *strDefaultTracker = isStringValid(defaultTracker) == true ? [NSString stringWithUTF8String:defaultTracker] : nil;
NSString *strExternalDeviceId = isStringValid(externalDeviceId) == true ? [NSString stringWithUTF8String:externalDeviceId] : nil;
NSString *strStoreName = isStringValid(storeName) == true ? [NSString stringWithUTF8String:storeName] : nil;
NSString *strStoreAppId = isStringValid(storeAppId) == true ? [NSString stringWithUTF8String:storeAppId] : nil;
ADJConfig *adjustConfig;
if (allowSuppressLogLevel != -1) {
adjustConfig = [[ADJConfig alloc] initWithAppToken:strAppToken
environment:strEnvironment
suppressLogLevel:(BOOL)allowSuppressLogLevel];
} else {
adjustConfig = [[ADJConfig alloc] initWithAppToken:strAppToken
environment:strEnvironment];
}
// set SDK prefix
[adjustConfig setSdkPrefix:strSdkPrefix];
// check if user has selected to implement any of the callbacks
if (attributionCallback != nil ||
sessionSuccessCallback != nil ||
sessionFailureCallback != nil ||
eventSuccessCallback != nil ||
eventFailureCallback != nil ||
deferredDeeplinkCallback != nil ||
skanUpdatedCallback != nil) {
[adjustConfig setDelegate:
[AdjustUnityDelegate getInstanceWithAttributionCallback:attributionCallback
eventSuccessCallback:eventSuccessCallback
eventFailureCallback:eventFailureCallback
sessionSuccessCallback:sessionSuccessCallback
sessionFailureCallback:sessionFailureCallback
deferredDeeplinkCallback:deferredDeeplinkCallback
skanUpdatedCallback:skanUpdatedCallback
shouldLaunchDeferredDeeplink:isDeferredDeeplinkOpeningEnabled]];
}
// log level
if (logLevel != -1) {
[adjustConfig setLogLevel:(ADJLogLevel)logLevel];
}
// COPPA compliance.
if (isCoppaComplianceEnabled != -1) {
if ((BOOL)isCoppaComplianceEnabled == YES) {
[adjustConfig enableCoppaCompliance];
}
}
// Send in background.
if (isSendingInBackgroundEnabled != -1) {
if ((BOOL)isSendingInBackgroundEnabled == YES) {
[adjustConfig enableSendingInBackground];
}
}
// AdServices.framework handling
if (isAdServicesEnabled != -1) {
if ((BOOL)isAdServicesEnabled == NO) {
[adjustConfig disableAdServices];
}
}
// SKAN attribution
if (isSkanAttributionEnabled != -1) {
if ((BOOL)isSkanAttributionEnabled == NO) {
[adjustConfig disableSkanAttribution];
}
}
// IDFA reading
if (isIdfaReadingEnabled != -1) {
if ((BOOL)isIdfaReadingEnabled == NO) {
[adjustConfig disableIdfaReading];
}
}
// IDFV reading
if (isIdfvReadingEnabled != -1) {
if ((BOOL)isIdfvReadingEnabled == NO) {
[adjustConfig disableIdfvReading];
}
}
// LinkMe
if (isLinkMeEnabled != -1) {
if ((BOOL)isLinkMeEnabled == YES) {
[adjustConfig enableLinkMe];
}
}
// ATT dialog delay
if (attConsentWaitingInterval != -1) {
[adjustConfig setAttConsentWaitingInterval:attConsentWaitingInterval];
}
// disable AppTrackingTransparency.framework interaction
if (isAppTrackingTransparencyUsageEnabled != -1) {
if ((BOOL)isAppTrackingTransparencyUsageEnabled == NO) {
[adjustConfig disableAppTrackingTransparencyUsage];
}
}
// first session delay
if (isFirstSessionDelayEnabled != -1) {
if ((BOOL)isFirstSessionDelayEnabled == YES) {
[adjustConfig enableFirstSessionDelay];
}
}
// deduplication IDs max number
if (eventDeduplicationIdsMaxSize != -1) {
[adjustConfig setEventDeduplicationIdsMaxSize:eventDeduplicationIdsMaxSize];
}
// cost data in attribution callback
if (isCostDataInAttributionEnabled != -1) {
if ((BOOL)isCostDataInAttributionEnabled == YES) {
[adjustConfig enableCostDataInAttribution];
}
}
// read device info only once
if (isDeviceIdsReadingOnceEnabled != -1) {
if ((BOOL)isDeviceIdsReadingOnceEnabled == YES) {
[adjustConfig enableDeviceIdsReadingOnce];
}
}
// default tracker
if (strDefaultTracker != nil) {
[adjustConfig setDefaultTracker:strDefaultTracker];
}
// external device identifier
if (strExternalDeviceId != nil) {
[adjustConfig setExternalDeviceId:strExternalDeviceId];
}
// URL strategy
if (shouldUseSubdomains != -1 && isDataResidency != -1) {
NSArray *urlStrategyDomains = convertArrayParameters(jsonUrlStrategyDomains);
if (urlStrategyDomains != nil) {
[adjustConfig setUrlStrategy:urlStrategyDomains
useSubdomains:(BOOL)shouldUseSubdomains
isDataResidency:(BOOL)isDataResidency];
}
}
// custom store
if (strStoreName != nil) {
ADJStoreInfo *storeInfo = [[ADJStoreInfo alloc] initWithStoreName:strStoreName];
if (strStoreAppId != nil) {
[storeInfo setStoreAppId:strStoreAppId];
}
[adjustConfig setStoreInfo:storeInfo];
}
// initialize the SDK
[Adjust initSdk:adjustConfig];
}
void _AdjustTrackEvent(const char* eventToken,
double revenue,
const char* currency,
const char* productId,
const char* transactionId,
const char* callbackId,
const char* deduplicationId,
const char* jsonCallbackParameters,
const char* jsonPartnerParameters) {
NSString *strEventToken = isStringValid(eventToken) == true ? [NSString stringWithUTF8String:eventToken] : nil;
ADJEvent *event = [[ADJEvent alloc] initWithEventToken:strEventToken];
// revenue and currency
if (revenue != -1 && currency != NULL) {
NSString *stringCurrency = [NSString stringWithUTF8String:currency];
[event setRevenue:revenue currency:stringCurrency];
}
// callback parameters
NSArray *arrayCallbackParameters = convertArrayParameters(jsonCallbackParameters);
if (arrayCallbackParameters != nil) {
NSUInteger count = [arrayCallbackParameters count];
for (int i = 0; i < count;) {
NSString *key = arrayCallbackParameters[i++];
NSString *value = arrayCallbackParameters[i++];
[event addCallbackParameter:key value:value];
}
}
// partner parameters
NSArray *arrayPartnerParameters = convertArrayParameters(jsonPartnerParameters);
if (arrayPartnerParameters != nil) {
NSUInteger count = [arrayPartnerParameters count];
for (int i = 0; i < count;) {
NSString *key = arrayPartnerParameters[i++];
NSString *value = arrayPartnerParameters[i++];
[event addPartnerParameter:key value:value];
}
}
// transaction ID
if (transactionId != NULL) {
NSString *strTransactionId = [NSString stringWithUTF8String:transactionId];
[event setTransactionId:strTransactionId];
}
// product ID
if (productId != NULL) {
NSString *strProductId = [NSString stringWithUTF8String:productId];
[event setProductId:strProductId];
}
// callback ID
if (callbackId != NULL) {
NSString *strCallbackId = [NSString stringWithUTF8String:callbackId];
[event setCallbackId:strCallbackId];
}
// deduplication ID
if (deduplicationId != NULL) {
NSString *strDeduplicationId = [NSString stringWithUTF8String:deduplicationId];
[event setDeduplicationId:strDeduplicationId];
}
// track event
[Adjust trackEvent:event];
}
void _AdjustTrackSubsessionStart() {
[Adjust trackSubsessionStart];
}
void _AdjustTrackSubsessionEnd() {
[Adjust trackSubsessionEnd];
}
void _AdjustEnable() {
[Adjust enable];
}
void _AdjustDisable() {
[Adjust disable];
}
void _AdjustSwitchToOfflineMode() {
[Adjust switchToOfflineMode];
}
void _AdjustSwitchBackToOnlineMode() {
[Adjust switchBackToOnlineMode];
}
void _AdjustSetPushToken(const char* pushToken) {
if (pushToken != NULL) {
NSString *strPushToken = [NSString stringWithUTF8String:pushToken];
[Adjust setPushTokenAsString:strPushToken];
}
}
void _AdjustProcessDeeplink(const char* deeplink, const char* referrer) {
if (deeplink != NULL) {
NSString *strDeeplink = [NSString stringWithUTF8String:deeplink];
NSURL *urlDeeplink = [NSURL URLWithString:strDeeplink];
ADJDeeplink *adjustDeeplink = [[ADJDeeplink alloc] initWithDeeplink:urlDeeplink];
if (referrer != NULL) {
NSString *strReferrer = [NSString stringWithUTF8String:referrer];
NSURL *urlReferrer = [NSURL URLWithString:strReferrer];
[adjustDeeplink setReferrer:urlReferrer];
}
[Adjust processDeeplink:adjustDeeplink];
}
}
void _AdjustIsEnabled(AdjustDelegateIsEnabledGetter callback) {
[Adjust isEnabledWithCompletionHandler:^(BOOL isEnabled) {
callback(isEnabled);
}];
}
void _AdjustGetAttribution(AdjustDelegateAttributionGetter callback) {
[Adjust attributionWithCompletionHandler:^(ADJAttribution * _Nullable attribution) {
// TODO: nil checks
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
addValueOrEmpty(dictionary, @"trackerToken", attribution.trackerToken);
addValueOrEmpty(dictionary, @"trackerName", attribution.trackerName);
addValueOrEmpty(dictionary, @"network", attribution.network);
addValueOrEmpty(dictionary, @"campaign", attribution.campaign);
addValueOrEmpty(dictionary, @"creative", attribution.creative);
addValueOrEmpty(dictionary, @"adgroup", attribution.adgroup);
addValueOrEmpty(dictionary, @"clickLabel", attribution.clickLabel);
addValueOrEmpty(dictionary, @"costType", attribution.costType);
addValueOrEmpty(dictionary, @"costAmount", attribution.costAmount);
addValueOrEmpty(dictionary, @"costCurrency", attribution.costCurrency);
if (attribution.jsonResponse != nil) {
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:attribution.jsonResponse
options:0
error:nil];
NSString *strJsonResponse = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
addValueOrEmpty(dictionary, @"jsonResponse", strJsonResponse);
}
NSData *dataAttribution = [NSJSONSerialization dataWithJSONObject:dictionary
options:0
error:nil];
NSString *stringAttribution = [[NSString alloc] initWithBytes:[dataAttribution bytes]
length:[dataAttribution length]
encoding:NSUTF8StringEncoding];
const char* attributionCString = [stringAttribution UTF8String];
callback(attributionCString);
}];
}
void _AdjustGetAdid(AdjustDelegateAdidGetter callback) {
[Adjust adidWithCompletionHandler:^(NSString * _Nullable adid) {
// TODO: nil checks
callback([adid UTF8String]);
}];
}
void _AdjustGetIdfa(AdjustDelegateIdfaGetter callback) {
[Adjust idfaWithCompletionHandler:^(NSString * _Nullable idfa) {
// TODO: nil checks
callback([idfa UTF8String]);
}];
}
void _AdjustGetIdfv(AdjustDelegateIdfvGetter callback) {
[Adjust idfvWithCompletionHandler:^(NSString * _Nullable idfv) {
// TODO: nil checks
callback([idfv UTF8String]);
}];
}
void _AdjustGetLastDeeplink(AdjustDelegateLastDeeplinkGetter callback) {
[Adjust lastDeeplinkWithCompletionHandler:^(NSURL * _Nullable lastDeeplink) {
// TODO: nil checks
NSString *strLastDeeplink = [lastDeeplink absoluteString];
callback([strLastDeeplink UTF8String]);
}];
}
void _AdjustGetSdkVersion(AdjustDelegateSdkVersionGetter callback) {
[Adjust sdkVersionWithCompletionHandler:^(NSString * _Nullable sdkVersion) {
// TODO: nil checks
callback([sdkVersion UTF8String]);
}];
}
void _AdjustGdprForgetMe() {
[Adjust gdprForgetMe];
}
void _AdjustAddGlobalPartnerParameter(const char* key, const char* value) {
if (key != NULL && value != NULL) {
NSString *strKey = [NSString stringWithUTF8String:key];
NSString *strValue = [NSString stringWithUTF8String:value];
[Adjust addGlobalPartnerParameter:strValue forKey:strKey];
}
}
void _AdjustAddGlobalCallbackParameter(const char* key, const char* value) {
if (key != NULL && value != NULL) {
NSString *strKey = [NSString stringWithUTF8String:key];
NSString *strValue = [NSString stringWithUTF8String:value];
[Adjust addGlobalCallbackParameter:strValue forKey:strKey];
}
}
void _AdjustRemoveGlobalPartnerParameter(const char* key) {
if (key != NULL) {
NSString *strKey = [NSString stringWithUTF8String:key];
[Adjust removeGlobalPartnerParameterForKey:strKey];
}
}
void _AdjustRemoveGlobalCallbackParameter(const char* key) {
if (key != NULL) {
NSString *strKey = [NSString stringWithUTF8String:key];
[Adjust removeGlobalCallbackParameterForKey:strKey];
}
}
void _AdjustRemoveGlobalPartnerParameters() {
[Adjust removeGlobalPartnerParameters];
}
void _AdjustRemoveGlobalCallbackParameters() {
[Adjust removeGlobalCallbackParameters];
}
void _AdjustTrackAdRevenue(const char* source,
double revenue,
const char* currency,
int adImpressionsCount,
const char* adRevenueNetwork,
const char* adRevenueUnit,
const char* adRevenuePlacement,
const char* jsonCallbackParameters,
const char* jsonPartnerParameters) {
NSString *stringSource = isStringValid(source) == true ? [NSString stringWithUTF8String:source] : nil;
ADJAdRevenue *adRevenue = [[ADJAdRevenue alloc] initWithSource:stringSource];
// revenue and currency
if (revenue != -1 && currency != NULL) {
NSString *stringCurrency = [NSString stringWithUTF8String:currency];
[adRevenue setRevenue:revenue currency:stringCurrency];
}
// ad impressions count
if (adImpressionsCount != -1) {
[adRevenue setAdImpressionsCount:adImpressionsCount];
}
// ad revenue network
if (adRevenueNetwork != NULL) {
NSString *stringAdRevenueNetwork = [NSString stringWithUTF8String:adRevenueNetwork];
[adRevenue setAdRevenueNetwork:stringAdRevenueNetwork];
}
// ad revenue unit
if (adRevenueUnit != NULL) {
NSString *stringAdRevenueUnit = [NSString stringWithUTF8String:adRevenueUnit];
[adRevenue setAdRevenueUnit:stringAdRevenueUnit];
}
// ad revenue placement
if (adRevenuePlacement != NULL) {
NSString *stringAdRevenuePlacement = [NSString stringWithUTF8String:adRevenuePlacement];
[adRevenue setAdRevenuePlacement:stringAdRevenuePlacement];
}
// callback parameters
NSArray *arrayCallbackParameters = convertArrayParameters(jsonCallbackParameters);
if (arrayCallbackParameters != nil) {
NSUInteger count = [arrayCallbackParameters count];
for (int i = 0; i < count;) {
NSString *key = arrayCallbackParameters[i++];
NSString *value = arrayCallbackParameters[i++];
[adRevenue addCallbackParameter:key value:value];
}
}
// partner parameters
NSArray *arrayPartnerParameters = convertArrayParameters(jsonPartnerParameters);
if (arrayPartnerParameters != nil) {
NSUInteger count = [arrayPartnerParameters count];
for (int i = 0; i < count;) {
NSString *key = arrayPartnerParameters[i++];
NSString *value = arrayPartnerParameters[i++];
[adRevenue addPartnerParameter:key value:value];
}
}
// track ad revenue
[Adjust trackAdRevenue:adRevenue];
}
// TODO: consider non-string types for some fields?
void _AdjustTrackAppStoreSubscription(const char* price,
const char* currency,
const char* transactionId,
const char* transactionDate,
const char* salesRegion,
const char* jsonCallbackParameters,
const char* jsonPartnerParameters) {
// mandatory fields
NSDecimalNumber *mPrice;
NSString *mCurrency;
NSString *mTransactionId;
// price
if (price != NULL) {
mPrice = [NSDecimalNumber decimalNumberWithString:[NSString stringWithUTF8String:price]];
}
// currency
if (currency != NULL) {
mCurrency = [NSString stringWithUTF8String:currency];
}
// transaction ID
if (transactionId != NULL) {
mTransactionId = [NSString stringWithUTF8String:transactionId];
}
ADJAppStoreSubscription *subscription =
[[ADJAppStoreSubscription alloc] initWithPrice:mPrice
currency:mCurrency
transactionId:mTransactionId];
// optional fields below
// transaction date
if (transactionDate != NULL) {
NSTimeInterval transactionDateInterval = [[NSString stringWithUTF8String:transactionDate] doubleValue] / 1000.0;
NSDate *oTransactionDate = [NSDate dateWithTimeIntervalSince1970:transactionDateInterval];
[subscription setTransactionDate:oTransactionDate];
}
// sales region
if (salesRegion != NULL) {
NSString *oSalesRegion = [NSString stringWithUTF8String:salesRegion];
[subscription setSalesRegion:oSalesRegion];
}
// callback parameters
NSArray *arrayCallbackParameters = convertArrayParameters(jsonCallbackParameters);
if (arrayCallbackParameters != nil) {
NSUInteger count = [arrayCallbackParameters count];
for (int i = 0; i < count;) {
NSString *key = arrayCallbackParameters[i++];
NSString *value = arrayCallbackParameters[i++];
[subscription addCallbackParameter:key value:value];
}
}
// partner parameters
NSArray *arrayPartnerParameters = convertArrayParameters(jsonPartnerParameters);
if (arrayPartnerParameters != nil) {
NSUInteger count = [arrayPartnerParameters count];
for (int i = 0; i < count;) {
NSString *key = arrayPartnerParameters[i++];
NSString *value = arrayPartnerParameters[i++];
[subscription addPartnerParameter:key value:value];
}
}
// track subscription
[Adjust trackAppStoreSubscription:subscription];
}
void _AdjustTrackThirdPartySharing(int enabled, const char* jsonGranularOptions, const char* jsonPartnerSharingSettings) {
NSNumber *nEnabled = enabled >= 0 ? [NSNumber numberWithInt:enabled] : nil;
ADJThirdPartySharing *adjustThirdPartySharing = [[ADJThirdPartySharing alloc] initWithIsEnabled:nEnabled];
NSArray *arrayGranularOptions = convertArrayParameters(jsonGranularOptions);
if (arrayGranularOptions != nil) {
for (int i = 0; i < [arrayGranularOptions count];) {
NSString *partnerName = arrayGranularOptions[i++];
NSString *key = arrayGranularOptions[i++];
NSString *value = arrayGranularOptions[i++];
[adjustThirdPartySharing addGranularOption:partnerName
key:key
value:value];
}
}
NSArray *arrayPartnerSharingSettings = convertArrayParameters(jsonPartnerSharingSettings);
if (arrayPartnerSharingSettings != nil) {
for (int i = 0; i < [arrayPartnerSharingSettings count];) {
NSString *partnerName = arrayPartnerSharingSettings[i++];
NSString *key = arrayPartnerSharingSettings[i++];
NSString *value = arrayPartnerSharingSettings[i++];
[adjustThirdPartySharing addPartnerSharingSetting:partnerName
key:key
value:[value boolValue]];
}
}
[Adjust trackThirdPartySharing:adjustThirdPartySharing];
}
void _AdjustTrackMeasurementConsent(int enabled) {
BOOL bEnabled = (BOOL)enabled;
[Adjust trackMeasurementConsent:bEnabled];
}
void _AdjustRequestAppTrackingAuthorization(AdjustDelegateAttCallback callback) {
[Adjust requestAppTrackingAuthorizationWithCompletionHandler:^(NSUInteger status) {
callback((int)status);
}];
}
void _AdjustUpdateSkanConversionValue(int conversionValue,
const char* coarseValue,
int lockWindow,
AdjustDelegateSkanErrorCallback callback) {
if (coarseValue != NULL) {
NSString *strCoarseValue = [NSString stringWithUTF8String:coarseValue];
BOOL bLockWindow = (BOOL)lockWindow;
[Adjust updateSkanConversionValue:conversionValue
coarseValue:strCoarseValue
lockWindow:[NSNumber numberWithBool:bLockWindow]
withCompletionHandler:^(NSError * _Nullable error) {
// TODO: nil checks
NSString *errorString = [error localizedDescription];
const char* errorChar = [errorString UTF8String];
callback(errorChar);
}];
}
}
int _AdjustGetAppTrackingAuthorizationStatus() {
return [Adjust appTrackingAuthorizationStatus];
}
void _AdjustVerifyAppStorePurchase(const char* transactionId,
const char* productId,
int callbackId,
AdjustDelegatePurchaseVerificationCallback callback) {
NSString *strTransactionId;
NSString *strProductId;
// transaction ID
if (transactionId != NULL) {
strTransactionId = [NSString stringWithUTF8String:transactionId];
}
// product ID
if (productId != NULL) {
strProductId = [NSString stringWithUTF8String:productId];
}
// verify the purchase
ADJAppStorePurchase *purchase =
[[ADJAppStorePurchase alloc] initWithTransactionId:strTransactionId
productId:strProductId];
[Adjust verifyAppStorePurchase:purchase
withCompletionHandler:^(ADJPurchaseVerificationResult * _Nonnull verificationResult) {
// TODO: nil checks
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
addValueOrEmpty(dictionary, @"verificationStatus", verificationResult.verificationStatus);
addValueOrEmpty(dictionary, @"code", [NSString stringWithFormat:@"%d", verificationResult.code]);
addValueOrEmpty(dictionary, @"message", verificationResult.message);
NSData *dataVerificationInfo = [NSJSONSerialization dataWithJSONObject:dictionary
options:0
error:nil];
NSString *strVerificationInfo = [[NSString alloc] initWithBytes:[dataVerificationInfo bytes]
length:[dataVerificationInfo length]
encoding:NSUTF8StringEncoding];
const char* verificationInfoCString = [strVerificationInfo UTF8String];
callback(verificationInfoCString, callbackId);
}];
}
void _AdjustProcessAndResolveDeeplink(const char* deeplink, AdjustDelegateResolvedDeeplinkCallback callback) {
if (deeplink != NULL) {
NSString *strDeeplink = [NSString stringWithUTF8String:deeplink];
NSURL *urlDeeplink = [NSURL URLWithString:strDeeplink];
ADJDeeplink *deeplink = [[ADJDeeplink alloc] initWithDeeplink:urlDeeplink];
[Adjust processAndResolveDeeplink:deeplink withCompletionHandler:^(NSString * _Nullable resolvedLink) {
// TODO: nil checks
const char* resolvedLinkCString = [resolvedLink UTF8String];
callback(resolvedLinkCString);
}];
}
}
void _AdjustVerifyAndTrackAppStorePurchase(
const char* eventToken,
double revenue,
const char* currency,
const char* productId,
const char* transactionId,
const char* callbackId,
const char* deduplicationId,
const char* jsonCallbackParameters,
const char* jsonPartnerParameters,
int verificationCallbackId,
AdjustDelegateVerifyAndTrackCallback callback) {
NSString *strEventToken = isStringValid(eventToken) == true ? [NSString stringWithUTF8String:eventToken] : nil;
ADJEvent *event = [[ADJEvent alloc] initWithEventToken:strEventToken];
// revenue and currency
if (revenue != -1 && currency != NULL) {
NSString *stringCurrency = [NSString stringWithUTF8String:currency];
[event setRevenue:revenue currency:stringCurrency];
}
// callback parameters
NSArray *arrayCallbackParameters = convertArrayParameters(jsonCallbackParameters);
if (arrayCallbackParameters != nil) {
NSUInteger count = [arrayCallbackParameters count];
for (int i = 0; i < count;) {
NSString *key = arrayCallbackParameters[i++];
NSString *value = arrayCallbackParameters[i++];
[event addCallbackParameter:key value:value];
}
}
// partner parameters
NSArray *arrayPartnerParameters = convertArrayParameters(jsonPartnerParameters);
if (arrayPartnerParameters != nil) {
NSUInteger count = [arrayPartnerParameters count];
for (int i = 0; i < count;) {
NSString *key = arrayPartnerParameters[i++];
NSString *value = arrayPartnerParameters[i++];
[event addPartnerParameter:key value:value];
}
}
// transaction ID
if (transactionId != NULL) {
NSString *strTransactionId = [NSString stringWithUTF8String:transactionId];
[event setTransactionId:strTransactionId];
}
// product ID
if (productId != NULL) {
NSString *strProductId = [NSString stringWithUTF8String:productId];
[event setProductId:strProductId];
}
// callback ID
if (callbackId != NULL) {
NSString *strCallbackId = [NSString stringWithUTF8String:callbackId];
[event setCallbackId:strCallbackId];
}
// deduplication ID
if (deduplicationId != NULL) {
NSString *strDeduplicationId = [NSString stringWithUTF8String:deduplicationId];
[event setDeduplicationId:strDeduplicationId];
}
[Adjust verifyAndTrackAppStorePurchase:event
withCompletionHandler:^(ADJPurchaseVerificationResult * _Nonnull verificationResult) {
// TODO: nil checks
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
addValueOrEmpty(dictionary, @"verificationStatus", verificationResult.verificationStatus);
addValueOrEmpty(dictionary, @"code", [NSString stringWithFormat:@"%d", verificationResult.code]);
addValueOrEmpty(dictionary, @"message", verificationResult.message);
NSData *dataVerificationInfo = [NSJSONSerialization dataWithJSONObject:dictionary
options:0
error:nil];
NSString *strVerificationInfo = [[NSString alloc] initWithBytes:[dataVerificationInfo bytes]
length:[dataVerificationInfo length]
encoding:NSUTF8StringEncoding];
const char* verificationInfoCString = [strVerificationInfo UTF8String];
callback(verificationInfoCString, verificationCallbackId);
}];
}
void _AdjustEndFirstSessionDelay() {
[Adjust endFirstSessionDelay];
}
void _AdjustEnableCoppaComplianceInDelay() {
[Adjust enableCoppaComplianceInDelay];
}
void _AdjustDisableCoppaComplianceInDelay() {
[Adjust disableCoppaComplianceInDelay];
}
void _AdjustSetExternalDeviceIdInDelay(const char* externalDeviceId) {
if (externalDeviceId != NULL) {
NSString *strExternalDeviceId = [NSString stringWithUTF8String:externalDeviceId];
[Adjust setExternalDeviceIdInDelay:strExternalDeviceId];
}
}
void _AdjustSetTestOptions(const char* overwriteUrl,
const char* extraPath,
long timerIntervalInMilliseconds,
long timerStartInMilliseconds,
long sessionIntervalInMilliseconds,
long subsessionIntervalInMilliseconds,
int teardown,
int deleteState,
int noBackoffWait,
int adServicesFrameworkEnabled,
int attStatus,
const char *idfa) {
NSMutableDictionary *testOptions = [NSMutableDictionary dictionary];
NSString *strOverwriteUrl = isStringValid(overwriteUrl) == true ? [NSString stringWithUTF8String:overwriteUrl] : nil;
if (strOverwriteUrl != nil) {
testOptions[@"testUrlOverwrite"] = strOverwriteUrl;
}
NSString *strExtraPath = isStringValid(extraPath) == true ? [NSString stringWithUTF8String:extraPath] : nil;
if (strExtraPath != nil && [strExtraPath length] > 0) {
testOptions[@"extraPath"] = strExtraPath;
}
NSString *strIdfa = isStringValid(idfa) == true ? [NSString stringWithUTF8String:idfa] : nil;
if (strIdfa != nil && [strIdfa length] > 0) {
testOptions[@"idfa"] = strIdfa;
}
testOptions[@"timerIntervalInMilliseconds"] = [NSNumber numberWithLong:timerIntervalInMilliseconds];
testOptions[@"timerStartInMilliseconds"] = [NSNumber numberWithLong:timerStartInMilliseconds];
testOptions[@"sessionIntervalInMilliseconds"] = [NSNumber numberWithLong:sessionIntervalInMilliseconds];
testOptions[@"subsessionIntervalInMilliseconds"] = [NSNumber numberWithLong:subsessionIntervalInMilliseconds];
testOptions[@"attStatusInt"] = [NSNumber numberWithInt:attStatus];
if (teardown != -1) {
[AdjustUnityDelegate teardown];
testOptions[@"teardown"] = [NSNumber numberWithInt:teardown];
}
if (deleteState != -1) {
testOptions[@"deleteState"] = [NSNumber numberWithInt:deleteState];
}
if (noBackoffWait != -1) {
testOptions[@"noBackoffWait"] = [NSNumber numberWithInt:noBackoffWait];
}
if (adServicesFrameworkEnabled != -1) {
testOptions[@"adServicesFrameworkEnabled"] = [NSNumber numberWithInt:adServicesFrameworkEnabled];
}
[Adjust setTestOptions:testOptions];
}
}