209 lines
8.0 KiB
C#
Executable File
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();
|
|
});
|
|
}
|
|
}
|