Since Xamarin published the Xamarin 3 I have been playing with this.
Normally I develop apps for Windows Phone and Windows Store and when I started to use some libraries related with Xamarin, I found some libraries that don´t use the async/await and for me it is fundamental.
One library that I think should use asyn/await but that I saw does not use it is Xamarin.Auth!
For uisng Xamarin.Auth.OAuth2Authenticator for authentication I recommend the following solution.
For Xamarin.Android
- public async Task<Account> LoginAsync(Activity activity, bool allowCancel)
- {
- var auth = new OAuth2Authenticator(
- clientId: "<scopes here>",
- scope: "<scopes here>",
- authorizeUrl: new Uri("<url here>"),
- redirectUrl: new Uri("<url here>"))
- {
- AllowCancel = allowCancel
- };
-
- var tcs1 = new TaskCompletionSource<AuthenticatorCompletedEventArgs>();
- EventHandler<AuthenticatorCompletedEventArgs> d1 =
- (o, e) =>
- {
- try
- {
- tcs1.TrySetResult(e);
- }
- catch (Exception ex)
- {
- tcs1.TrySetResult(new AuthenticatorCompletedEventArgs(null));
- }
- };
- try
- {
- auth.Completed += d1;
- var intent = auth.GetUI(activity);
- activity.StartActivity(intent);
- var result= await tcs1.Task;
- return result.Account;
- }
- catch (Exception)
- {
-
- return null;
- }
- finally
- {
- auth.Completed -= d1;
- }
- }
And then we need to call it this way:
- var authService = new AuthService();
- var result = await authService.LoginAsync(this, allowCancel);
For Xamarin.IOS
- public async Task<Account> LoginAsync(DialogViewController dialog, bool allowCancel)
- {
- var auth = new OAuth2Authenticator(
- clientId: "<scopes here>",
- scope: "<scopes here>",
- authorizeUrl: new Uri("<url here>"),
- redirectUrl: new Uri("<url here>"))
- {
- AllowCancel = allowCancel
- };
-
-
- var tcs1 = new TaskCompletionSource<AuthenticatorCompletedEventArgs>();
- EventHandler<AuthenticatorCompletedEventArgs> d1 =
- (o, e) =>
- {
- try
- {
- tcs1.TrySetResult(e);
- }
- catch (Exception ex)
- {
- tcs1.TrySetResult(new AuthenticatorCompletedEventArgs(null));
- }
- };
- try
- {
- auth.Completed += d1;
- var vc = auth.GetUI();
- dialog.PresentViewController(vc, true, null);
- var result= await tcs1.Task;
- return result.Account;
- }
- catch (Exception)
- {
-
- return null;
- }
- finally
- {
- auth.Completed -= d1;
- }
- }
And then we need to call it this way:
- var authService = new AuthService();
- var result = await authService.LoginAsync(dialog, allowCancel);
In conclusion, I think it is very simple to use and I think it should be added to the
Xamarin.Auth.I added the sample to:
https://github.com/saramgsilva/Xamarin.Auth/tree/master/samples and will do a pull request for the original repository.