diff --git a/Assets/AppleAuth/Runtime/Native/iOS/AppleAuthManager.m b/Assets/AppleAuth/Runtime/Native/iOS/AppleAuthManager.m index 235dffa..2e1bcfd 100644 --- a/Assets/AppleAuth/Runtime/Native/iOS/AppleAuthManager.m +++ b/Assets/AppleAuth/Runtime/Native/iOS/AppleAuthManager.m @@ -50,7 +50,7 @@ API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0), visionos(1.0)) @property (nonatomic, strong) ASAuthorizationAppleIDProvider *appleIdProvider; @property (nonatomic, strong) ASAuthorizationPasswordProvider *passwordProvider; @property (nonatomic, strong) NSObject *credentialsRevokedObserver; -@property (nonatomic, strong) NSMutableDictionary *authorizationsInProgress; +@property (nonatomic, strong) NSMapTable *authorizationsInProgress; @end #endif @@ -78,7 +78,7 @@ API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0), visionos(1.0)) { _appleIdProvider = [[ASAuthorizationAppleIDProvider alloc] init]; _passwordProvider = [[ASAuthorizationPasswordProvider alloc] init]; - _authorizationsInProgress = [NSMutableDictionary dictionary]; + _authorizationsInProgress = [NSMapTable mapTableWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsStrongMemory]; } #endif } @@ -267,8 +267,8 @@ API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0), visionos(1.0)) - (void) performAuthorizationRequestsForController:(ASAuthorizationController *)authorizationController withRequestId:(uint)requestId API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0), visionos(1.0)) { - NSValue *authControllerAsKey = [NSValue valueWithNonretainedObject:authorizationController]; - [[self authorizationsInProgress] setObject:@(requestId) forKey:authControllerAsKey]; + // 使用强引用 NSMapTable 保存 ASAuthorizationController,避免其被提前释放导致 delegate 回调不触发 + [[self authorizationsInProgress] setObject:@(requestId) forKey:authorizationController]; [authorizationController setDelegate:self]; [authorizationController setPresentationContextProvider:self]; @@ -280,8 +280,7 @@ API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0), visionos(1.0)) - (void) authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0), visionos(1.0)) { - NSValue *authControllerAsKey = [NSValue valueWithNonretainedObject:controller]; - NSNumber *requestIdNumber = [[self authorizationsInProgress] objectForKey:authControllerAsKey]; + NSNumber *requestIdNumber = [[self authorizationsInProgress] objectForKey:controller]; if (requestIdNumber) { NSDictionary *appleIdCredentialDictionary = nil; @@ -301,15 +300,14 @@ API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0), visionos(1.0)) [self sendNativeMessageForDictionary:responseDictionary forRequestId:[requestIdNumber unsignedIntValue]]; - [[self authorizationsInProgress] removeObjectForKey:authControllerAsKey]; + [[self authorizationsInProgress] removeObjectForKey:controller]; } } - (void) authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0), visionos(1.0)) { - NSValue *authControllerAsKey = [NSValue valueWithNonretainedObject:controller]; - NSNumber *requestIdNumber = [[self authorizationsInProgress] objectForKey:authControllerAsKey]; + NSNumber *requestIdNumber = [[self authorizationsInProgress] objectForKey:controller]; if (requestIdNumber) { NSDictionary *errorDictionary = [AppleAuthSerializer dictionaryForNSError:error]; @@ -319,7 +317,7 @@ API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0), visionos(1.0)) [self sendNativeMessageForDictionary:responseDictionary forRequestId:[requestIdNumber unsignedIntValue]]; - [[self authorizationsInProgress] removeObjectForKey:authControllerAsKey]; + [[self authorizationsInProgress] removeObjectForKey:controller]; } } diff --git a/Assets/Scripts/Managers/FirebaseAuthManager.cs b/Assets/Scripts/Managers/FirebaseAuthManager.cs index 390ea1c..843eb80 100644 --- a/Assets/Scripts/Managers/FirebaseAuthManager.cs +++ b/Assets/Scripts/Managers/FirebaseAuthManager.cs @@ -122,9 +122,12 @@ namespace Kill.Managers loginArgs, credential => { + Debug.Log($"[AppleAuth] 登录成功回调触发, credential类型: {credential?.GetType().Name}"); var appleIdCredential = credential as IAppleIDCredential; if (appleIdCredential == null) { + var passwordCredential = credential as IPasswordCredential; + Debug.LogWarning($"[AppleAuth] credential 不是 AppleIDCredential, 实际类型: {credential?.GetType().Name}, PasswordCredential: {passwordCredential != null}"); MainThread.Enqueue(() => onError?.Invoke("未获取到 Apple ID 凭证")); return; } @@ -132,6 +135,8 @@ namespace Kill.Managers var identityToken = Encoding.UTF8.GetString(appleIdCredential.IdentityToken); var authorizationCode = Encoding.UTF8.GetString(appleIdCredential.AuthorizationCode); + Debug.Log($"[AppleAuth] identityToken长度: {identityToken?.Length}, authorizationCode长度: {authorizationCode?.Length}"); + if (string.IsNullOrEmpty(identityToken)) { MainThread.Enqueue(() => onError?.Invoke("Apple identity token 为空")); @@ -142,6 +147,7 @@ namespace Kill.Managers }, error => { + Debug.LogError($"[AppleAuth] 登录失败回调触发: {error?.LocalizedDescription}"); MainThread.Enqueue(() => onError?.Invoke($"Apple 登录失败: {error.LocalizedDescription}")); }); #else