新しい権限の同意をリクエストする
**(これはロードマップ機能でありまだ展開していなく、APIドキュメントでは実験的と記載されています) **
子供がゲームをプレイする許可を得た後、特定の機能が無効になっていて、その機能のmanagedByフィールドがGUARDIANに設定されている場合、プレイヤーはその機能の同意をリクエストすることが可能です。この場合、/session/upgrade APIを呼び出してConsent Challengeを作成し、保護者のメールアドレス、QRコード、およびワンタイムパスワード(OTP)を入力するチャレンジウィンドウを表示する必要があります。保護者はファミリーポータルで機能へのアクセスリクエストを受け取ります。プレイヤーが機能の有効化のみをリクエストしているが、ゲームのプレイは許可されている場合、リクエストがアクティブな間、QRコード、OTP、メールアドレス入力フィールドを表示するフローティングウィンドウやウィジェットを使用し、プレイを続行するオプションがあります。別のオプションとしては、プレイをブロックしつつも、保護者からの同意を求める代わりにダイアログを閉じることをプレイヤーに許可する方法もあります。
Upgrading a Session with Unreal C++
// Creates a new consent challenge if the Permission is managed by GUARDIAN, and if successful,
// calls the EnableFeature callback parameter, which can then turn on the feature in the game
void UKidWorkflow::UpgradeSession(const FString &FeatureName, TFunction<void()> EnableFeature)
{
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());
JsonObject->SetStringField(TEXT("sessionId"), SessionInfo->GetStringField(TEXT("sessionId")));
TSharedPtr<FJsonObject> PermJsonObject = MakeShareable(new FJsonObject());
PermJsonObject->SetStringField(TEXT("name"), FeatureName);
TArray<TSharedPtr<FJsonValue>> JsonArray;
JsonArray.Add(MakeShareable(new FJsonValueObject(PermJsonObject)));
JsonObject->SetArrayField(TEXT("requestedPermissions"), JsonArray);
FString ContentJsonString;
TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&ContentJsonString);
FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer);
HttpRequestHelper::PostRequestWithAuth(BaseUrl + TEXT("/session/upgrade"), ContentJsonString, AuthToken,
[this, EnableFeature, FeatureName](FHttpResponsePtr Response, bool bWasSuccessful)
{
if (bWasSuccessful)
{
TSharedPtr<FJsonObject> JsonResponse;
TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(Response->GetContentAsString());
if (FJsonSerializer::Deserialize(Reader, JsonResponse))
{
if (JsonResponse->HasField(TEXT("challenge")))
{
TSharedPtr<FJsonObject> Challenge = JsonResponse->GetObjectField(TEXT("challenge"));
FString ChallengeId = Challenge->GetStringField(TEXT("challengeId"));
FString OneTimePassword = Challenge->GetStringField(TEXT("oneTimePassword"));
FString QRCodeUrl = Challenge->GetStringField(TEXT("url"));
SaveChallengeId(ChallengeId);
ShowConsentChallenge(ChallengeId, ConsentTimeoutSeconds, OneTimePassword, QRCodeUrl,
[this, EnableFeature, FeatureName](bool bConsentGranted, const FString &SessionId)
{
ClearChallengeId();
if (bConsentGranted)
{
GetSessionPermissions(SessionId, TEXT(""));
EnableFeature();
}
else
{
// request to turn on feature was denied, don't do anything
UE_LOG(LogTemp, Warning, TEXT("Feature request denied for feature %s."), *FeatureName);
}
});
}
else if (JsonResponse->HasField(TEXT("session")))
{
SessionInfo = JsonResponse->GetObjectField(TEXT("session"));
SaveSessionInfo();
EnableFeature();
}
}
}
});
}