using System; using System.Collections; using System.Text; using AppleAuth; using AppleAuth.Enums; using AppleAuth.Extensions; using AppleAuth.Interfaces; using AppleAuth.Native; using Newtonsoft.Json; using UnityEngine; using UnityEngine.Networking; 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(); } public void SignInWithAppleButtonPressed2() { this.SignInWithApple(); } public void SignInWithAppleButtonPressedDelete() { this.DeleteSignInWithApple(); } 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); this.onAppleData(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); this.onAppleData(credential.User, credential); }, error => { var authorizationErrorCode = error.GetAuthorizationErrorCode(); Debug.LogWarning("Sign in with Apple failed " + authorizationErrorCode.ToString() + " " + error.ToString()); this.SetupLoginMenuForSignInWithApple(); }); } private void DeleteSignInWithApple() { var loginArgs = new AppleAuthLoginArgs(LoginOptions.IncludeEmail | LoginOptions.IncludeFullName); this._appleAuthManager.LoginWithAppleId( loginArgs, credential => { var appleIdCredential = credential as IAppleIDCredential; if (appleIdCredential.AuthorizationCode != null) { var authorizationCode = Encoding.UTF8.GetString(appleIdCredential.AuthorizationCode, 0, appleIdCredential.AuthorizationCode.Length); Debug.Log("delete===authorizationCode======= " + authorizationCode.Substring(0, 45)); StartCoroutine(DdeleteUserByApple(authorizationCode, (res) => { Debug.Log($"DdeleteUserByApple service rescode {res.code}, msg {res.msg}"); if (res.code == 0) { Debug.Log("删除成功"); this.SetupLoginMenuForSignInWithApple(); PlayerPrefs.DeleteKey(AppleUserIdKey); } })); } }, error => { var authorizationErrorCode = error.GetAuthorizationErrorCode(); Debug.LogWarning("Sign in with Apple failed " + authorizationErrorCode.ToString() + " " + error.ToString()); this.SetupLoginMenuForSignInWithApple(); }); } public void onAppleData(string appleUserId, ICredential receivedCredential) { var appleIdCredential = receivedCredential as IAppleIDCredential; if (appleIdCredential != null) { if (appleIdCredential.IdentityToken != null) { var identityToken = Encoding.UTF8.GetString(appleIdCredential.IdentityToken, 0, appleIdCredential.IdentityToken.Length); Debug.Log("11===identityToken======= " + identityToken); } if (appleIdCredential.AuthorizationCode != null) { var authorizationCode = Encoding.UTF8.GetString(appleIdCredential.AuthorizationCode, 0, appleIdCredential.AuthorizationCode.Length); Debug.Log("22===authorizationCode======= " + authorizationCode.Substring(0, 45)); } string _email = ""; if (appleIdCredential.Email != null) { _email = appleIdCredential.Email; } Debug.Log("33===Email======= " + _email); string _fullName = ""; if (appleIdCredential.FullName != null) { var fullName = appleIdCredential.FullName; if (appleIdCredential.FullName.PhoneticRepresentation != null) { var phoneticName = appleIdCredential.FullName.PhoneticRepresentation; //phoneticName.ToLocalizedString() } _fullName = fullName.ToLocalizedString(); } Debug.Log("44===FullName======= " + appleIdCredential.FullName); var _identityToken = Encoding.UTF8.GetString(appleIdCredential.IdentityToken, 0, appleIdCredential.IdentityToken.Length); StartCoroutine(LoginByApple(_identityToken, _email, _fullName, (res) => { Debug.Log($"LoginByApple service rescode {res.code}, msg {res.msg}"); if (res.code == 0) { Debug.Log("LoginByApple 登录"); } else { this.SetupLoginMenuForSignInWithApple(); PlayerPrefs.DeleteKey(AppleUserIdKey); } })); } else { this.SetupLoginMenuForSignInWithApple(); PlayerPrefs.DeleteKey(AppleUserIdKey); } } public IEnumerator LoginByApple(string identityToken, string email, string fullName, Action callback) { string url = "http://192.168.0.112:11432/SmartBowBusinessServer/gameLogin/loginByApple"; WWWForm form = new WWWForm(); form.AddField("identityToken", identityToken); form.AddField("email", email); form.AddField("fullName", fullName); form.AddField("serverIndex", 0); using (UnityWebRequest request = UnityWebRequest.Post(url, form)) { request.timeout = 10; yield return request.SendWebRequest(); RequestResult requestResult = new RequestResult(); if (request.result == UnityWebRequest.Result.Success) { requestResult = JsonConvert.DeserializeObject(request.downloadHandler.text); } if (callback != null) callback(requestResult); } } public IEnumerator DdeleteUserByApple(string identityToken, Action callback) { string url = "http://192.168.0.112:11432/SmartBowBusinessServer/gameLogin/deleteUserByApple"; WWWForm form = new WWWForm(); form.AddField("identityToken", identityToken); using (UnityWebRequest request = UnityWebRequest.Post(url, form)) { request.timeout = 10; yield return request.SendWebRequest(); RequestResult requestResult = new RequestResult(); if (request.result == UnityWebRequest.Result.Success) { requestResult = JsonConvert.DeserializeObject(request.downloadHandler.text); } if (callback != null) callback(requestResult); } } public class RequestResult { public int code = -9999; public object data; public string msg; } }