Обработка намерения в Xamarin - PullRequest
0 голосов
/ 03 декабря 2018

Я застрял в этой проблеме довольно давно, и я не знаю, как продолжить ..

Я интегрирую аутентификацию Auth0 в свое приложение Xamarin: Ссылка на учебник Xamarin Auth0, над которым я работаюс

Я создал интерфейс и реализовал его в проекте .Android.Затем я использовал службы зависимостей для вызова метода login ().

Затем я добавил фильтр намерений в класс, где я реализовал метод login для управления обратным вызовом.

Проблема в том, что я застрял в своей реализации Android и не знаю, как вернуться в свой проект шарда.Могу ли я использовать намерение, чтобы перенаправить меня туда?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Auth0.OidcClient;
using Ester.MobileApp.DependencySvcAuth;
using Ester.MobileApp.Droid.DependencySvcAuth;

[assembly: Xamarin.Forms.Dependency(typeof(Auth_Android))]

namespace Ester.MobileApp.Droid.DependencySvcAuth
{

    [Activity(Label = "Login Activity", MainLauncher = true, Icon = "@drawable/icon",
        LaunchMode = LaunchMode.SingleTask)]

    [IntentFilter(
        new[] { Intent.ActionView },
        Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
        DataScheme = "---",
        DataHost = "---",
        DataPathPrefix = "---")]
        


    class Auth_Android : Activity , IAuth
    {

        public async Task login()
        {
            
            var client = new Auth0Client(new Auth0ClientOptions
            {
                Domain = "---",
                ClientId = "---"
            });


            var loginResult = await client.LoginAsync();

            
        }
     }
}

1 Ответ

0 голосов
/ 03 декабря 2018
  • Прежде всего, откройте файл MainActivity.cs и добавьте в него следующие фильтры намерений:

    [Activity(Label = "AndroidSample", MainLauncher = true, Icon = "@drawable/icon",
    LaunchMode = LaunchMode.SingleTask)]
    [IntentFilter(
     new[] { Intent.ActionView },
     Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
     DataScheme = "YOUR_ANDROID_PACKAGE_NAME",
     DataHost = "YOUR_AUTH0_DOMAIN",
     DataPathPrefix = "/android/YOUR_ANDROID_PACKAGE_NAME/callback")]
     public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    

    Замените YOUR_ANDROID_PACKAGE_NAME в приведенном выше примере кода на фактический пакетИмя для вашего приложения, например com.mycompany.myapplication.Также убедитесь, что весь текст для DataScheme, DataHost и DataPathPrefix в нижнем регистре.Кроме того, установите LaunchMode = LaunchMode.SingleTask для Activity, в противном случае система будет создавать новый экземпляр активности при каждом вызове URL обратного вызова.

  • Затем напишите код длясправиться с намерением.Вы можете сделать это, переопределив метод OnNewIntent.Внутри метода вам необходимо вызвать метод Send в ActivityMediator для завершения цикла аутентификации:

     protected override async void OnNewIntent(Intent intent)
    {
       base.OnNewIntent(intent);
    
       Auth0.OidcClient.ActivityMediator.Instance.Send(intent.DataString);
    }
    
  • Затем добавьте поле Auth0Client в свой класс MainActivity:

    public Auth0Client client;
    
  • Затем инициализируйте этот клиент примерно так в вашем MainActivity OnCreate:

    client = new Auth0Client(new Auth0ClientOptions
        {
            Domain = //**yourDomain**
            ClientId = //**clientID**
            Scope = //**Auth0Scope** //Optional
        });
    
  • В вашем общем проекте добавьте следующий интерфейс следующим образом:

     public interface IAuthLogin
     {
         bool Auth0Login();               
     }
    

    Метод интерфейса Auth0Login Тип возвращаемого значения может быть изменен на что угодно, также вы можете добавить аргументы метода при необходимости.

  • Затем Добавитькласс с именем Auth0Login.cs:

    [assembly: Dependency(typeof(AnalyticsManager))]
    namespace Ester.MobileApp.Droid.DependencySvcAuth
    public class Auth0Login: IAuthLogin
    {
       public async bool Auth0Login()
       {
    
       }           
    }
    
  • Затем добавьте Плагин CurrentActivity от James Montemagno

  • Затем вВаш метод Auth0Login:

    var currentActivity= CrossCurrentActivity.Current.Activity as MainActivity;
    var loginResult = await currentActivity.client.LoginAsync();
    if (loginResult.IsError)
        {
          return false;  // Login Failure 
        }
    else
        {
          return true; // Login Sucess
        }
    
  • Затем вызовите этот метод из вашего общего проекта следующим образом:

     var authLoginManager= DependencyService.Get<IAuthLogin>();
     authLoginManager.Auth0Login();
    

Надеюсь, это работает хорошодля вас

Возврат в случае запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...