Here’s the function code, where we hit
StoreV2_QueryOffers: Subsystem->GetStoreV2Interface() Store was invalid."));:
Proceeding to make a small test project repro…
bool UStoreSubsystem::StoreV2_QueryOffers()
{
TArray<FString> OfferIds;
OffersByCheckoutId.GenerateKeyArray(OfferIds);
const IOnlineSubsystem* Subsystem = Online::GetSubsystem(GetWorld());
if (!Subsystem)
{
UE_LOG(LogStore, Log, TEXT("TRACE StoreV2_QueryOffers: Subsystem was invalid."));
}
if (Subsystem)
{
UE_LOG(LogStore, Log, TEXT("TRACE StoreV2_QueryOffers: proceeding."));
const IOnlineStoreV2Ptr Store = Subsystem->GetStoreV2Interface();
if (!Store.IsValid())
{
UE_LOG(LogStore, Log, TEXT("TRACE StoreV2_QueryOffers: Subsystem->GetStoreV2Interface() Store was invalid."));
}
const IOnlineIdentityPtr IdentityInterface = Subsystem->GetIdentityInterface();
if (!IdentityInterface.IsValid())
{
UE_LOG(LogStore, Log, TEXT("TRACE StoreV2_QueryOffers: Subsystem->GetIdentityInterface() IdentityInterface was invalid."));
}
if (Store.IsValid() && IdentityInterface.IsValid())
{
UE_LOG(LogStore, Log, TEXT("TRACE StoreV2_QueryOffers: Store + IdentityInterface were valid."));
auto AccountId = IdentityInterface->GetUniquePlayerId(0);
if (!AccountId.IsValid())
{
UE_LOG(LogStore, Log, TEXT("TRACE StoreV2_QueryOffers: AccountId was invalid."));
AccountId = FUniqueNetIdString::EmptyId();
}
UE_LOG(LogStore, Log, TEXT("TRACE StoreV2_QueryOffers: Query about to begin."));
Store->QueryOffersById(*AccountId, OfferIds,
FOnQueryOnlineStoreOffersComplete::CreateUObject(
this, &UStoreSubsystem::StoreV2_OnQueryOffersComplete));
UE_LOG(LogStore, Log, TEXT("QUERY: Query started."));
return true;
}
}
UE_LOG(LogStore, Log, TEXT("QUERY: No store on this platform."));
bIsQueryOffersComplete = true;
OnQueryOffersComplete.Broadcast();
return false;
}