UPF/Assets/AppleAuthSample/MainMenu.cs
2023-02-24 22:14:55 +05:30

209 lines
8.0 KiB
C#
Executable File

using AppleAuth;
using AppleAuth.Enums;
using AppleAuth.Extensions;
using AppleAuth.Interfaces;
using AppleAuth.Native;
using UnityEngine;
public class MainMenu : MonoBehaviour
{
private const string AppleUserIdKey = "AppleUserId";
private IAppleAuthManager _appleAuthManager;
public LoginMenuHandler LoginMenu;
public GameMenuHandler GameMenu;
private void Start()
{
// If the current platform is supported
if (AppleAuthManager.IsCurrentPlatformSupported)
{
// Creates a default JSON deserializer, to transform JSON Native responses to C# instances
var deserializer = new PayloadDeserializer();
// Creates an Apple Authentication manager with the deserializer
this._appleAuthManager = new AppleAuthManager(deserializer);
}
this.InitializeLoginMenu();
}
private void Update()
{
// Updates the AppleAuthManager instance to execute
// pending callbacks inside Unity's execution loop
if (this._appleAuthManager != null)
{
this._appleAuthManager.Update();
}
this.LoginMenu.UpdateLoadingMessage(Time.deltaTime);
}
public void SignInWithAppleButtonPressed()
{
this.SetupLoginMenuForAppleSignIn();
this.SignInWithApple();
}
private void InitializeLoginMenu()
{
this.LoginMenu.SetVisible(visible: true);
this.GameMenu.SetVisible(visible: false);
// Check if the current platform supports Sign In With Apple
if (this._appleAuthManager == null)
{
this.SetupLoginMenuForUnsupportedPlatform();
return;
}
// If at any point we receive a credentials revoked notification, we delete the stored User ID, and go back to login
this._appleAuthManager.SetCredentialsRevokedCallback(result =>
{
Debug.Log("Received revoked callback " + result);
this.SetupLoginMenuForSignInWithApple();
PlayerPrefs.DeleteKey(AppleUserIdKey);
});
// If we have an Apple User Id available, get the credential status for it
if (PlayerPrefs.HasKey(AppleUserIdKey))
{
var storedAppleUserId = PlayerPrefs.GetString(AppleUserIdKey);
this.SetupLoginMenuForCheckingCredentials();
this.CheckCredentialStatusForUserId(storedAppleUserId);
}
// If we do not have an stored Apple User Id, attempt a quick login
else
{
this.SetupLoginMenuForQuickLoginAttempt();
this.AttemptQuickLogin();
}
}
private void SetupLoginMenuForUnsupportedPlatform()
{
this.LoginMenu.SetVisible(visible: true);
this.GameMenu.SetVisible(visible: false);
this.LoginMenu.SetSignInWithAppleButton(visible: false, enabled: false);
this.LoginMenu.SetLoadingMessage(visible: true, message: "Unsupported platform");
}
private void SetupLoginMenuForSignInWithApple()
{
this.LoginMenu.SetVisible(visible: true);
this.GameMenu.SetVisible(visible: false);
this.LoginMenu.SetSignInWithAppleButton(visible: true, enabled: true);
this.LoginMenu.SetLoadingMessage(visible: false, message: string.Empty);
}
private void SetupLoginMenuForCheckingCredentials()
{
this.LoginMenu.SetVisible(visible: true);
this.GameMenu.SetVisible(visible: false);
this.LoginMenu.SetSignInWithAppleButton(visible: true, enabled: false);
this.LoginMenu.SetLoadingMessage(visible: true, message: "Checking Apple Credentials");
}
private void SetupLoginMenuForQuickLoginAttempt()
{
this.LoginMenu.SetVisible(visible: true);
this.GameMenu.SetVisible(visible: false);
this.LoginMenu.SetSignInWithAppleButton(visible: true, enabled: false);
this.LoginMenu.SetLoadingMessage(visible: true, message: "Attempting Quick Login");
}
private void SetupLoginMenuForAppleSignIn()
{
this.LoginMenu.SetVisible(visible: true);
this.GameMenu.SetVisible(visible: false);
this.LoginMenu.SetSignInWithAppleButton(visible: true, enabled: false);
this.LoginMenu.SetLoadingMessage(visible: true, message: "Signing In with Apple");
}
private void SetupGameMenu(string appleUserId, ICredential credential)
{
this.LoginMenu.SetVisible(visible: false);
this.GameMenu.SetVisible(visible: true);
this.GameMenu.SetupAppleData(appleUserId, credential);
}
private void CheckCredentialStatusForUserId(string appleUserId)
{
// If there is an apple ID available, we should check the credential state
this._appleAuthManager.GetCredentialState(
appleUserId,
state =>
{
switch (state)
{
// If it's authorized, login with that user id
case CredentialState.Authorized:
this.SetupGameMenu(appleUserId, null);
return;
// If it was revoked, or not found, we need a new sign in with apple attempt
// Discard previous apple user id
case CredentialState.Revoked:
case CredentialState.NotFound:
this.SetupLoginMenuForSignInWithApple();
PlayerPrefs.DeleteKey(AppleUserIdKey);
return;
}
},
error =>
{
var authorizationErrorCode = error.GetAuthorizationErrorCode();
Debug.LogWarning("Error while trying to get credential state " + authorizationErrorCode.ToString() + " " + error.ToString());
this.SetupLoginMenuForSignInWithApple();
});
}
private void AttemptQuickLogin()
{
var quickLoginArgs = new AppleAuthQuickLoginArgs();
// Quick login should succeed if the credential was authorized before and not revoked
this._appleAuthManager.QuickLogin(
quickLoginArgs,
credential =>
{
// If it's an Apple credential, save the user ID, for later logins
var appleIdCredential = credential as IAppleIDCredential;
if (appleIdCredential != null)
{
PlayerPrefs.SetString(AppleUserIdKey, credential.User);
}
this.SetupGameMenu(credential.User, credential);
},
error =>
{
// If Quick Login fails, we should show the normal sign in with apple menu, to allow for a normal Sign In with apple
var authorizationErrorCode = error.GetAuthorizationErrorCode();
Debug.LogWarning("Quick Login Failed " + authorizationErrorCode.ToString() + " " + error.ToString());
this.SetupLoginMenuForSignInWithApple();
});
}
private void SignInWithApple()
{
var loginArgs = new AppleAuthLoginArgs(LoginOptions.IncludeEmail | LoginOptions.IncludeFullName);
this._appleAuthManager.LoginWithAppleId(
loginArgs,
credential =>
{
// If a sign in with apple succeeds, we should have obtained the credential with the user id, name, and email, save it
PlayerPrefs.SetString(AppleUserIdKey, credential.User);
this.SetupGameMenu(credential.User, credential);
},
error =>
{
var authorizationErrorCode = error.GetAuthorizationErrorCode();
Debug.LogWarning("Sign in with Apple failed " + authorizationErrorCode.ToString() + " " + error.ToString());
this.SetupLoginMenuForSignInWithApple();
});
}
}