Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Version 5.0.1 #11

Merged
merged 2 commits into from
Feb 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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