Skip to content

Commit

Permalink
Merge pull request #11 from adjust/v501
Browse files Browse the repository at this point in the history
Version 5.0.1
  • Loading branch information
uerceg authored Feb 17, 2025
2 parents 0bffa43 + b2f32bd commit 214a8e5
Show file tree
Hide file tree
Showing 7 changed files with 155 additions and 70 deletions.
4 changes: 2 additions & 2 deletions Adjust/Adjust.uplugin
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"FileVersion": 3,
"Version": 2,
"VersionName": "5.0.0",
"VersionName": "5.0.1",
"FriendlyName": "Adjust",
"Description": "Adjust SDK plugin for Unreal Engine 5",
"Category": "Mobile Analytics",
Expand All @@ -18,4 +18,4 @@
"LoadingPhase": "Default"
}
]
}
}
2 changes: 1 addition & 1 deletion Adjust/Source/Adjust/Adjust_UPL_Android.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
}
dependencies {
implementation 'com.android.installreferrer:installreferrer:2.2'
implementation 'com.adjust.sdk:adjust-android:5.0.2'
implementation 'com.adjust.sdk:adjust-android:5.1.0'
}
android {
compileOptions {
Expand Down
8 changes: 4 additions & 4 deletions Adjust/Source/Adjust/Private/Adjust.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ void UAdjust::InitSdk(const FAdjustConfig& Config)
suppressLogLevel:allowSuppressLevel];

// SDK prefix
[adjustConfig setSdkPrefix:@"unreal5.0.0"];
[adjustConfig setSdkPrefix:@"unreal5.0.1"];

// log level
[adjustConfig setLogLevel:logLevel];
Expand Down Expand Up @@ -401,7 +401,7 @@ void UAdjust::InitSdk(const FAdjustConfig& Config)
Env->DeleteLocalRef(jEnvironment);

// SDK prefix
const char* cstrSdkPrefix = "unreal5.0.0";
const char* cstrSdkPrefix = "unreal5.0.1";
jstring jSdkPrefix = Env->NewStringUTF(cstrSdkPrefix);
jmethodID jmidAdjustConfigSetSdkPrefix = Env->GetMethodID(jcslAdjustConfig, "setSdkPrefix", "(Ljava/lang/String;)V");
Env->CallVoidMethod(joAdjustConfig, jmidAdjustConfigSetSdkPrefix, jSdkPrefix);
Expand Down Expand Up @@ -902,7 +902,7 @@ void UAdjust::GetSdkVersion()
{
#if PLATFORM_IOS
FString Separator = FString(UTF8_TO_TCHAR("@"));
FString SdkPrefix = FString(UTF8_TO_TCHAR("unreal5.0.0"));
FString SdkPrefix = FString(UTF8_TO_TCHAR("unreal5.0.1"));
[Adjust sdkVersionWithCompletionHandler:^(NSString * _Nullable sdkVersion) {
FString FinalVersion = SdkPrefix + Separator + FString(UTF8_TO_TCHAR([sdkVersion UTF8String]));
adjustSdkVersionGetterCallback(FinalVersion);
Expand All @@ -915,7 +915,7 @@ void UAdjust::GetSdkVersion()
jclass jcslUeSdkVersionGetterCallback = FAndroidApplication::FindJavaClass("com/epicgames/unreal/GameActivity$AdjustUeSdkVersionGetterCallback");
jmethodID jmidUeSdkVersionGetterCallbackInit = Env->GetMethodID(jcslUeSdkVersionGetterCallback, "<init>", "(Lcom/epicgames/unreal/GameActivity;Ljava/lang/String;)V");
// TODO: temp hack, parametrize this
jstring jSdkPrefix = Env->NewStringUTF("unreal5.0.0");
jstring jSdkPrefix = Env->NewStringUTF("unreal5.0.1");
jobject joSdkVersionGetterCallbackProxy = Env->NewObject(jcslUeSdkVersionGetterCallback, jmidUeSdkVersionGetterCallbackInit, FJavaWrapper::GameActivityThis, jSdkPrefix);
Env->CallStaticVoidMethod(jcslAdjust, jmidAdjustGetSdkVersionId, joSdkVersionGetterCallbackProxy);
Env->DeleteLocalRef(joSdkVersionGetterCallbackProxy);
Expand Down
190 changes: 128 additions & 62 deletions Adjust/Source/Adjust/Private/IOS/Delegate/AdjustSdkDelegate.mm
Original file line number Diff line number Diff line change
Expand Up @@ -20,111 +20,177 @@ - (void)adjustAttributionChanged:(ADJAttribution *)attribution {
return;
}

FAdjustAttribution ueAttribution;
ueAttribution.TrackerToken = *FString(attribution.trackerToken);
ueAttribution.TrackerName = *FString(attribution.trackerName);
ueAttribution.Network = *FString(attribution.network);
ueAttribution.Campaign = *FString(attribution.campaign);
ueAttribution.Adgroup = *FString(attribution.adgroup);
ueAttribution.Creative = *FString(attribution.creative);
ueAttribution.ClickLabel = *FString(attribution.clickLabel);
_attributionCallback(ueAttribution);
FString trackerToken = *FString(attribution.trackerToken);
FString trackerName = *FString(attribution.trackerName);
FString network = *FString(attribution.network);
FString campaign = *FString(attribution.campaign);
FString adgroup = *FString(attribution.adgroup);
FString creative = *FString(attribution.creative);
FString clickLabel = *FString(attribution.clickLabel);

auto callback = _attributionCallback;
AsyncTask(ENamedThreads::GameThread, [trackerToken, trackerName, network, campaign, adgroup, creative, clickLabel, callback]() {
FAdjustAttribution ueAttribution;
ueAttribution.TrackerToken = trackerToken;
ueAttribution.TrackerName = trackerName;
ueAttribution.Network = network;
ueAttribution.Campaign = campaign;
ueAttribution.Adgroup = adgroup;
ueAttribution.Creative = creative;
ueAttribution.ClickLabel = clickLabel;

if (callback) {
callback(ueAttribution);
}
});
}

- (void)adjustEventTrackingSucceeded:(ADJEventSuccess *)eventSuccessResponseData {
if (_eventSuccessCallback == nil) {
return;
}

FAdjustEventSuccess ueEventSuccess;
ueEventSuccess.Message = *FString(eventSuccessResponseData.message);
ueEventSuccess.Timestamp = *FString(eventSuccessResponseData.timestamp);
ueEventSuccess.Adid = *FString(eventSuccessResponseData.adid);
ueEventSuccess.EventToken = *FString(eventSuccessResponseData.eventToken);
ueEventSuccess.CallbackId = *FString(eventSuccessResponseData.callbackId);
if (eventSuccessResponseData.jsonResponse != nil)
{
FString message = *FString(eventSuccessResponseData.message);
FString timestamp = *FString(eventSuccessResponseData.timestamp);
FString adid = *FString(eventSuccessResponseData.adid);
FString eventToken = *FString(eventSuccessResponseData.eventToken);
FString callbackId = *FString(eventSuccessResponseData.callbackId);

FString jsonResponseString;
if (eventSuccessResponseData.jsonResponse != nil) {
NSData *dataJsonResponse = [NSJSONSerialization dataWithJSONObject:eventSuccessResponseData.jsonResponse options:0 error:nil];
NSString *stringJsonResponse = [[NSString alloc] initWithBytes:[dataJsonResponse bytes]
length:[dataJsonResponse length]
encoding:NSUTF8StringEncoding];
ueEventSuccess.JsonResponse = *FString(stringJsonResponse);
NSString *stringJsonResponse = [[NSString alloc] initWithData:dataJsonResponse encoding:NSUTF8StringEncoding];
jsonResponseString = *FString(stringJsonResponse);
}
_eventSuccessCallback(ueEventSuccess);

auto callback = _eventSuccessCallback;
AsyncTask(ENamedThreads::GameThread, [message, timestamp, adid, eventToken, callbackId, jsonResponseString, callback]() {
FAdjustEventSuccess ueEventSuccess;
ueEventSuccess.Message = message;
ueEventSuccess.Timestamp = timestamp;
ueEventSuccess.Adid = adid;
ueEventSuccess.EventToken = eventToken;
ueEventSuccess.CallbackId = callbackId;
ueEventSuccess.JsonResponse = jsonResponseString;

if (callback) {
callback(ueEventSuccess);
}
});
}

- (void)adjustEventTrackingFailed:(ADJEventFailure *)eventFailureResponseData {
if (_eventFailureCallback == nil) {
return;
}

FAdjustEventFailure ueEventFailure;
ueEventFailure.Message = *FString(eventFailureResponseData.message);
ueEventFailure.Timestamp = *FString(eventFailureResponseData.timestamp);
ueEventFailure.Adid = *FString(eventFailureResponseData.adid);
ueEventFailure.EventToken = *FString(eventFailureResponseData.eventToken);
ueEventFailure.CallbackId = *FString(eventFailureResponseData.callbackId);
ueEventFailure.WillRetry = eventFailureResponseData.willRetry;
if (eventFailureResponseData.jsonResponse != nil)
{
FString message = *FString(eventFailureResponseData.message);
FString timestamp = *FString(eventFailureResponseData.timestamp);
FString adid = *FString(eventFailureResponseData.adid);
FString eventToken = *FString(eventFailureResponseData.eventToken);
FString callbackId = *FString(eventFailureResponseData.callbackId);
bool willRetry = eventFailureResponseData.willRetry;

FString jsonResponseString;
if (eventFailureResponseData.jsonResponse != nil) {
NSData *dataJsonResponse = [NSJSONSerialization dataWithJSONObject:eventFailureResponseData.jsonResponse options:0 error:nil];
NSString *stringJsonResponse = [[NSString alloc] initWithBytes:[dataJsonResponse bytes]
length:[dataJsonResponse length]
encoding:NSUTF8StringEncoding];
ueEventFailure.JsonResponse = *FString(stringJsonResponse);
NSString *stringJsonResponse = [[NSString alloc] initWithData:dataJsonResponse encoding:NSUTF8StringEncoding];
jsonResponseString = *FString(stringJsonResponse);
}
_eventFailureCallback(ueEventFailure);

auto callback = _eventFailureCallback;
AsyncTask(ENamedThreads::GameThread, [message, timestamp, adid, eventToken, callbackId, willRetry, jsonResponseString, callback]() {
FAdjustEventFailure ueEventFailure;
ueEventFailure.Message = message;
ueEventFailure.Timestamp = timestamp;
ueEventFailure.Adid = adid;
ueEventFailure.EventToken = eventToken;
ueEventFailure.CallbackId = callbackId;
ueEventFailure.WillRetry = willRetry;
ueEventFailure.JsonResponse = jsonResponseString;

if (callback) {
callback(ueEventFailure);
}
});
}

- (void)adjustSessionTrackingSucceeded:(ADJSessionSuccess *)sessionSuccessResponseData {
if (_sessionSuccessCallback == nil) {
return;
}

FAdjustSessionSuccess ueSessionSuccess;
ueSessionSuccess.Message = *FString(sessionSuccessResponseData.message);
ueSessionSuccess.Timestamp = *FString(sessionSuccessResponseData.timestamp);
ueSessionSuccess.Adid = *FString(sessionSuccessResponseData.adid);
if (sessionSuccessResponseData.jsonResponse != nil)
{
FString message = *FString(sessionSuccessResponseData.message);
FString timestamp = *FString(sessionSuccessResponseData.timestamp);
FString adid = *FString(sessionSuccessResponseData.adid);

FString jsonResponseString;
if (sessionSuccessResponseData.jsonResponse != nil) {
NSData *dataJsonResponse = [NSJSONSerialization dataWithJSONObject:sessionSuccessResponseData.jsonResponse options:0 error:nil];
NSString *stringJsonResponse = [[NSString alloc] initWithBytes:[dataJsonResponse bytes]
length:[dataJsonResponse length]
encoding:NSUTF8StringEncoding];
ueSessionSuccess.JsonResponse = *FString(stringJsonResponse);
NSString *stringJsonResponse = [[NSString alloc] initWithData:dataJsonResponse encoding:NSUTF8StringEncoding];
jsonResponseString = *FString(stringJsonResponse);
}
_sessionSuccessCallback(ueSessionSuccess);

auto callback = _sessionSuccessCallback;
AsyncTask(ENamedThreads::GameThread, [message, timestamp, adid, jsonResponseString, callback]() {
FAdjustSessionSuccess ueSessionSuccess;
ueSessionSuccess.Message = message;
ueSessionSuccess.Timestamp = timestamp;
ueSessionSuccess.Adid = adid;
ueSessionSuccess.JsonResponse = jsonResponseString;

if (callback) {
callback(ueSessionSuccess);
}
});
}

- (void)adjustSessionTrackingFailed:(ADJSessionFailure *)sessionFailureResponseData {
if (_sessionFailureCallback == nil) {
return;
}

FAdjustSessionFailure ueSessionFailure;
ueSessionFailure.Message = *FString(sessionFailureResponseData.message);
ueSessionFailure.Timestamp = *FString(sessionFailureResponseData.timestamp);
ueSessionFailure.Adid = *FString(sessionFailureResponseData.adid);
ueSessionFailure.WillRetry = sessionFailureResponseData.willRetry;
if (sessionFailureResponseData.jsonResponse != nil)
{
FString message = *FString(sessionFailureResponseData.message);
FString timestamp = *FString(sessionFailureResponseData.timestamp);
FString adid = *FString(sessionFailureResponseData.adid);
bool willRetry = sessionFailureResponseData.willRetry;

FString jsonResponseString;
if (sessionFailureResponseData.jsonResponse != nil) {
NSData *dataJsonResponse = [NSJSONSerialization dataWithJSONObject:sessionFailureResponseData.jsonResponse options:0 error:nil];
NSString *stringJsonResponse = [[NSString alloc] initWithBytes:[dataJsonResponse bytes]
length:[dataJsonResponse length]
encoding:NSUTF8StringEncoding];
ueSessionFailure.JsonResponse = *FString(stringJsonResponse);
NSString *stringJsonResponse = [[NSString alloc] initWithData:dataJsonResponse encoding:NSUTF8StringEncoding];
jsonResponseString = *FString(stringJsonResponse);
}
_sessionFailureCallback(ueSessionFailure);

auto callback = _sessionFailureCallback;
AsyncTask(ENamedThreads::GameThread, [message, timestamp, adid, willRetry, jsonResponseString, callback]() {
FAdjustSessionFailure ueSessionFailure;
ueSessionFailure.Message = message;
ueSessionFailure.Timestamp = timestamp;
ueSessionFailure.Adid = adid;
ueSessionFailure.WillRetry = willRetry;
ueSessionFailure.JsonResponse = jsonResponseString;

if (callback) {
callback(ueSessionFailure);
}
});
}

- (BOOL)adjustDeferredDeeplinkReceived:(NSURL *)deeplink {
if (_deferredDeeplinkCallback == nil) {
return YES;
}

NSString *url = [deeplink absoluteString];
FString ueDeeplink = *FString(url);
_deferredDeeplinkCallback(ueDeeplink);
FString ueDeeplink = *FString([deeplink absoluteString]);

auto callback = _deferredDeeplinkCallback;
AsyncTask(ENamedThreads::GameThread, [ueDeeplink, callback]() {
if (callback) {
callback(ueDeeplink);
}
});

return _shouldOpenDeferredDeeplink;
}

Expand Down
Binary file modified Adjust/Source/ThirdParty/IOS/AdjustSdk.framework.zip
Binary file not shown.
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
### Version 5.0.1 (17th February 2025)
#### Added
- Added sending of the additional parameter to improve troubleshooting of `SKAdNetwork` related issues.

#### Fixed
- Fixed occasional occurrences in which ATT waiting interval timer was not being started.
- Fixed occasional NPE occurrences when app was entering background (https://github.com/adjust/android_sdk/issues/630).

#### Changed
- Updated logic so that Unreal C++ callbacks are getting triggered inside of the `ENamedThreads::GameThread` (as they are on the Android platform).

#### Native SDKs
- [[email protected]][android_sdk_v5.1.0]
- [[email protected]][ios_sdk_v5.1.0]

---

### Version 5.0.0 (30th January 2025)

We're excited to release our major new SDK version (v5). Among many internal improvements, our spoofing protection solution is now included out of the box, reinforcing our commitment to accurate, actionable, and fraud-free data.
Expand Down Expand Up @@ -65,8 +82,10 @@ If you are a current Adjust client and have questions about SDK v5, please email
[android_sdk_v4.17.0]: https://github.com/adjust/android_sdk/tree/v4.17.0
[android_sdk_v4.18.1]: https://github.com/adjust/android_sdk/tree/v4.18.1
[android_sdk_v4.26.2]: https://github.com/adjust/android_sdk/tree/v4.26.2
[android_sdk_v5.1.0]: https://github.com/adjust/android_sdk/tree/v5.1.0

[ios_sdk_v4.17.1]: https://github.com/adjust/ios_sdk/tree/v4.17.1
[ios_sdk_v4.18.3]: https://github.com/adjust/ios_sdk/tree/v4.18.3
[ios_sdk_v4.26.1]: https://github.com/adjust/ios_sdk/tree/v4.26.1
[ios_sdk_v4.28.0]: https://github.com/adjust/ios_sdk/tree/v4.28.0
[ios_sdk_v5.0.1]: https://github.com/adjust/ios_sdk/tree/v5.0.1
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
5.0.0
5.0.1

0 comments on commit 214a8e5

Please sign in to comment.