这对我来说是这样的:
using GIDSignIn = Google.SignIn.SignIn;
static async Task<SignInDelegateEventArgs> GoogleSignInAsync()
{
var tcs = new TaskCompletionSource<SignInDelegateEventArgs>();
void Handler(object sender, SignInDelegateEventArgs args) => tcs.SetResult(args);
var vc = UIApplication.SharedApplication.KeyWindow?.RootViewController ?? throw new Exception("ViewController not found");
GIDSignIn.SharedInstance.PresentingViewController = vc;
GIDSignIn.SharedInstance.Disconnected += Handler;
GIDSignIn.SharedInstance.SignedIn += Handler;
try
{
GIDSignIn.SharedInstance.SignInUser();
return await tcs.Task;
}
finally
{
GIDSignIn.SharedInstance.SignedIn -= Handler;
GIDSignIn.SharedInstance.Disconnected -= Handler;
}
}
由于这是事件驱动的,所以我放了一个TaskCompletionSource
周围,这样您就可以轻松等待结果(加上 Firebase 的奖励代码):
var signInResult = await GoogleSignInAsync();
Console.WriteLine($@"{signInResult.Error} {signInResult.User?.Profile.Email}");
if (signInResult.Error != null || signInResult.User == null)
throw new GoogleSignInCanceledException(signInResult.Error.ToString());
// ReSharper disable once HeuristicUnreachableCode
var credential = GoogleAuthProvider.GetCredential(signInResult.User.Authentication.IdToken, signInResult.User.Authentication.AccessToken);
var authResult = await Auth.DefaultInstance.SignInWithCredentialAsync(credential);
AuthToken = await authResult.User.GetIdTokenAsync();
将此包含在AppDelegate.FinishedLaunching()
:
var googleServiceDictionary = NSDictionary.FromFile("GoogleService-Info.plist");
GIDSignIn.SharedInstance.ClientId = googleServiceDictionary["CLIENT_ID"].ToString();
将此包含在Info.plist
:
<!-- Google Sign-in Section -->
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<!-- Copied from GoogleService-Info.plist key REVERSED_CLIENT_ID -->
<string>com.googleusercontent.apps.123-321</string>
</array>
</dict>
</array>
<!-- End of the Google Sign-in Section -->
有什么改进吗?我很高兴收到你的来信。或者您正在寻找安卓实现 https://stackoverflow.com/a/73296776/1855801?