Skip to content
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
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,15 @@

## Unreleased

### Features

- Add runtime API to query user consent requirement ([#1139](https://github.com/getsentry/sentry-unreal/pull/1139))

### Fixes

- No more warnings in UE 5.7 caused by deprecated API usage ([#1152](https://github.com/getsentry/sentry-unreal/pull/1152))
- Custom tags are now correctly included in Android NDK crash events ([#1160](https://github.com/getsentry/sentry-unreal/pull/1160))
- Fix compatibility issues with Cocoa SDK 9.0.0 ([#1149](https://github.com/getsentry/sentry-unreal/pull/1149))

### Dependencies

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,12 @@ EUserConsent FAndroidSentrySubsystem::GetUserConsent() const
return EUserConsent::Unknown;
}

bool FAndroidSentrySubsystem::IsUserConsentRequired() const
{
UE_LOG(LogSentrySdk, Log, TEXT("IsUserConsentRequired is not supported on Android. Returning default `false` value."));
return false;
}

TSharedPtr<ISentryTransaction> FAndroidSentrySubsystem::StartTransaction(const FString& name, const FString& operation, bool bindToScope)
{
TSharedPtr<FAndroidSentryTransactionOptions> transactionOptionsAndroid = MakeShareable(new FAndroidSentryTransactionOptions());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class FAndroidSentrySubsystem : public ISentrySubsystem
virtual void GiveUserConsent() override;
virtual void RevokeUserConsent() override;
virtual EUserConsent GetUserConsent() const override;
virtual bool IsUserConsentRequired() const override;
virtual TSharedPtr<ISentryTransaction> StartTransaction(const FString& name, const FString& operation, bool bindToScope) override;
virtual TSharedPtr<ISentryTransaction> StartTransactionWithContext(TSharedPtr<ISentryTransactionContext> context, bool bindToScope) override;
virtual TSharedPtr<ISentryTransaction> StartTransactionWithContextAndTimestamp(TSharedPtr<ISentryTransactionContext> context, int64 timestamp, bool bindToScope) override;
Expand Down
6 changes: 3 additions & 3 deletions plugin-dev/Source/Sentry/Private/Apple/AppleSentryLog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ FAppleSentryLog::FAppleSentryLog()
LogApple.traceId = [[SENTRY_APPLE_CLASS(SentryId) alloc] init];
LogApple.body = @"";
LogApple.attributes = @{};
LogApple.level = SentryStructuredLogLevelDebug;
LogApple.level = SentryLogLevelDebug;
}

FAppleSentryLog::FAppleSentryLog(SentryLog* log)
Expand Down Expand Up @@ -56,10 +56,10 @@ FString FAppleSentryLog::GetBody() const

void FAppleSentryLog::SetLevel(ESentryLevel level)
{
LogApple.level = FAppleSentryConverters::SentryStructuredLogLevelToNative(level);
LogApple.level = FAppleSentryConverters::SentryLogLevelToNative(level);
}

ESentryLevel FAppleSentryLog::GetLevel() const
{
return FAppleSentryConverters::SentryStructuredLogLevelToUnreal(LogApple.level);
return FAppleSentryConverters::SentryLogLevelToUnreal(LogApple.level);
}
14 changes: 8 additions & 6 deletions plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ void FAppleSentrySubsystem::InitWithSettings(const USentrySettings* settings, US
options.maxBreadcrumbs = settings->MaxBreadcrumbs;
options.sendDefaultPii = settings->SendDefaultPii;
options.maxAttachmentSize = settings->MaxAttachmentSize;
options.experimental.enableLogs = settings->EnableStructuredLogging;
options.enableLogs = settings->EnableStructuredLogging;
#if SENTRY_UIKIT_AVAILABLE
options.attachScreenshot = settings->AttachScreenshot;
#endif
Expand All @@ -86,10 +86,6 @@ void FAppleSentrySubsystem::InitWithSettings(const USentrySettings* settings, US
{
[options addInAppInclude:it->GetNSString()];
}
for (auto it = settings->InAppExclude.CreateConstIterator(); it; ++it)
{
[options addInAppExclude:it->GetNSString()];
}
options.enableAppHangTracking = settings->EnableAppNotRespondingTracking;
if (settings->EnableTracing && settings->SamplingType == ESentryTracesSamplingType::UniformSampleRate)
{
Expand Down Expand Up @@ -415,6 +411,12 @@ EUserConsent FAppleSentrySubsystem::GetUserConsent() const
return EUserConsent::Unknown;
}

bool FAppleSentrySubsystem::IsUserConsentRequired() const
{
UE_LOG(LogSentrySdk, Log, TEXT("IsUserConsentRequired is not supported on Mac/iOS. Returning default `false` value."));
return false;
}

TSharedPtr<ISentryTransaction> FAppleSentrySubsystem::StartTransaction(const FString& name, const FString& operation, bool bindToScope)
{
id<SentrySpan> transaction = [SENTRY_APPLE_CLASS(SentrySDK) startTransactionWithName:name.GetNSString() operation:operation.GetNSString() bindToScope:bindToScope];
Expand Down Expand Up @@ -499,7 +501,7 @@ void FAppleSentrySubsystem::UploadAttachmentForEvent(TSharedPtr<ISentryId> event

SentryId* id = StaticCastSharedPtr<FAppleSentryId>(eventId)->GetNativeObject();

SentryEnvelopeHeader* envelopeHeader = [[SENTRY_APPLE_CLASS(SentryEnvelopeHeader) alloc] initWithId:id sdkInfo:nil traceContext:nil];
SentryEnvelopeHeader* envelopeHeader = [[SENTRY_APPLE_CLASS(SentryEnvelopeHeader) alloc] initWithId:id traceContext:nil];

SentryEnvelope* envelope = [[SENTRY_APPLE_CLASS(SentryEnvelope) alloc] initWithHeader:envelopeHeader singleItem:envelopeItem];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class FAppleSentrySubsystem : public ISentrySubsystem
virtual void GiveUserConsent() override;
virtual void RevokeUserConsent() override;
virtual EUserConsent GetUserConsent() const override;
virtual bool IsUserConsentRequired() const override;
virtual TSharedPtr<ISentryTransaction> StartTransaction(const FString& name, const FString& operation, bool bindToScope) override;
virtual TSharedPtr<ISentryTransaction> StartTransactionWithContext(TSharedPtr<ISentryTransactionContext> context, bool bindToScope) override;
virtual TSharedPtr<ISentryTransaction> StartTransactionWithContextAndTimestamp(TSharedPtr<ISentryTransactionContext> context, int64 timestamp, bool bindToScope) override;
Expand All @@ -54,7 +55,7 @@ class FAppleSentrySubsystem : public ISentrySubsystem
virtual FString GetScreenshotPath() const;
virtual FString GetLatestScreenshot() const;
virtual FString GetGameLogPath() const { return FString(); };
virtual FString GetLatestGameLog() const { return FString(); };
virtual FString GetLatestGameLog() const { return FString(); }

protected:
bool isScreenshotAttachmentEnabled = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,26 +35,26 @@ SentryLevel FAppleSentryConverters::SentryLevelToNative(ESentryLevel level)
return nativeLevel;
}

SentryStructuredLogLevel FAppleSentryConverters::SentryStructuredLogLevelToNative(ESentryLevel level)
SentryLogLevel FAppleSentryConverters::SentryLogLevelToNative(ESentryLevel level)
{
SentryStructuredLogLevel nativeLevel = SentryStructuredLogLevelDebug;
SentryLogLevel nativeLevel = SentryLogLevelDebug;

switch (level)
{
case ESentryLevel::Debug:
nativeLevel = SentryStructuredLogLevelDebug;
nativeLevel = SentryLogLevelDebug;
break;
case ESentryLevel::Info:
nativeLevel = SentryStructuredLogLevelInfo;
nativeLevel = SentryLogLevelInfo;
break;
case ESentryLevel::Warning:
nativeLevel = SentryStructuredLogLevelWarn;
nativeLevel = SentryLogLevelWarn;
break;
case ESentryLevel::Error:
nativeLevel = SentryStructuredLogLevelError;
nativeLevel = SentryLogLevelError;
break;
case ESentryLevel::Fatal:
nativeLevel = SentryStructuredLogLevelFatal;
nativeLevel = SentryLogLevelFatal;
break;
default:
UE_LOG(LogSentrySdk, Warning, TEXT("Unknown Sentry level value used. Debug will be returned."));
Expand Down Expand Up @@ -183,26 +183,26 @@ ESentryLevel FAppleSentryConverters::SentryLevelToUnreal(SentryLevel level)
return unrealLevel;
}

ESentryLevel FAppleSentryConverters::SentryStructuredLogLevelToUnreal(SentryStructuredLogLevel level)
ESentryLevel FAppleSentryConverters::SentryLogLevelToUnreal(SentryLogLevel level)
{
ESentryLevel unrealLevel = ESentryLevel::Debug;

switch (level)
{
case SentryStructuredLogLevelTrace:
case SentryStructuredLogLevelDebug:
case SentryLogLevelTrace:
case SentryLogLevelDebug:
unrealLevel = ESentryLevel::Debug;
break;
case SentryStructuredLogLevelInfo:
case SentryLogLevelInfo:
unrealLevel = ESentryLevel::Info;
break;
case SentryStructuredLogLevelWarn:
case SentryLogLevelWarn:
unrealLevel = ESentryLevel::Warning;
break;
case SentryStructuredLogLevelError:
case SentryLogLevelError:
unrealLevel = ESentryLevel::Error;
break;
case SentryStructuredLogLevelFatal:
case SentryLogLevelFatal:
unrealLevel = ESentryLevel::Fatal;
break;
default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class FAppleSentryConverters
public:
/** Conversions to native Mac/iOS types */
static SentryLevel SentryLevelToNative(ESentryLevel level);
static SentryStructuredLogLevel SentryStructuredLogLevelToNative(ESentryLevel level);
static SentryLogLevel SentryLogLevelToNative(ESentryLevel level);
static NSDictionary* StringMapToNative(const TMap<FString, FString>& map);
static NSArray* StringArrayToNative(const TArray<FString>& array);
static NSData* ByteDataToNative(const TArray<uint8>& array);
Expand All @@ -27,7 +27,7 @@ class FAppleSentryConverters

/** Conversions from native Mac/iOS types */
static ESentryLevel SentryLevelToUnreal(SentryLevel level);
static ESentryLevel SentryStructuredLogLevelToUnreal(SentryStructuredLogLevel level);
static ESentryLevel SentryLogLevelToUnreal(SentryLogLevel level);
static TMap<FString, FString> StringMapToUnreal(NSDictionary* dict);
static TArray<FString> StringArrayToUnreal(NSArray* array);
static TArray<uint8> ByteDataToUnreal(NSData* data);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -749,6 +749,11 @@ EUserConsent FGenericPlatformSentrySubsystem::GetUserConsent() const
}
}

bool FGenericPlatformSentrySubsystem::IsUserConsentRequired() const
{
return sentry_user_consent_is_required() == 1;
}

TSharedPtr<ISentryTransaction> FGenericPlatformSentrySubsystem::StartTransaction(const FString& name, const FString& operation, bool bindToScope)
{
TSharedPtr<ISentryTransactionContext> transactionContext = MakeShareable(new FGenericPlatformSentryTransactionContext(name, operation));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class FGenericPlatformSentrySubsystem : public ISentrySubsystem
virtual void GiveUserConsent() override;
virtual void RevokeUserConsent() override;
virtual EUserConsent GetUserConsent() const override;
virtual bool IsUserConsentRequired() const override;
virtual TSharedPtr<ISentryTransaction> StartTransaction(const FString& name, const FString& operation, bool bindToScope) override;
virtual TSharedPtr<ISentryTransaction> StartTransactionWithContext(TSharedPtr<ISentryTransactionContext> context, bool bindToScope) override;
virtual TSharedPtr<ISentryTransaction> StartTransactionWithContextAndTimestamp(TSharedPtr<ISentryTransactionContext> context, int64 timestamp, bool bindToScope) override;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ class ISentrySubsystem
virtual void GiveUserConsent() = 0;
virtual void RevokeUserConsent() = 0;
virtual EUserConsent GetUserConsent() const = 0;
virtual bool IsUserConsentRequired() const = 0;
virtual TSharedPtr<ISentryTransaction> StartTransaction(const FString& name, const FString& operation, bool bindToScope) = 0;
virtual TSharedPtr<ISentryTransaction> StartTransactionWithContext(TSharedPtr<ISentryTransactionContext> context, bool bindToScope) = 0;
virtual TSharedPtr<ISentryTransaction> StartTransactionWithContextAndTimestamp(TSharedPtr<ISentryTransactionContext> context, int64 timestamp, bool bindToScope) = 0;
Expand Down
12 changes: 12 additions & 0 deletions plugin-dev/Source/Sentry/Private/SentrySubsystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -624,6 +624,18 @@ EUserConsent USentrySubsystem::GetUserConsent() const
return SubsystemNativeImpl->GetUserConsent();
}

bool USentrySubsystem::IsUserConsentRequired() const
{
check(SubsystemNativeImpl);

if (!SubsystemNativeImpl || !SubsystemNativeImpl->IsEnabled())
{
return false;
}

return SubsystemNativeImpl->IsUserConsentRequired();
}

USentryTransaction* USentrySubsystem::StartTransaction(const FString& Name, const FString& Operation, bool BindToScope)
{
check(SubsystemNativeImpl);
Expand Down
2 changes: 1 addition & 1 deletion plugin-dev/Source/Sentry/Public/SentrySettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ class SENTRY_API USentrySettings : public UObject
TArray<FString> InAppInclude;

UPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = "General|Mobile",
Meta = (DisplayName = "In-app excludes (for Android/Apple only)", Tooltip = "A list of string prefixes of module names that don't belong to the app."))
Meta = (DisplayName = "In-app excludes (for Android only)", Tooltip = "A list of string prefixes of module names that don't belong to the app."))
TArray<FString> InAppExclude;

UPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = "General|Mobile",
Expand Down
10 changes: 10 additions & 0 deletions plugin-dev/Source/Sentry/Public/SentrySubsystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,16 @@ class SENTRY_API USentrySubsystem : public UEngineSubsystem
UFUNCTION(BlueprintCallable, Category = "Sentry")
EUserConsent GetUserConsent() const;

/**
* Returns if user consent is required for crash upload.
*
* @return True if user consent is required; otherwise false.
*
* @note This method is currently only relevant on Windows and Linux; other platforms will default to `false`.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
bool IsUserConsentRequired() const;

/**
* Starts a new transaction.
*
Expand Down