Mobile

13 fev, 2019

O X do Xamarin Forms – Abrindo um aplicativo externo

Publicidade

Fala, galera! Tudo beleza?

Muitas vezes precisamos abrir aplicativos de terceiros (ou alguns que nós mesmos fizemos), e cada plataforma abre um aplicativo de uma forma diferente. No Android, por exemplo, temos o conceito de Intent, que é diferente do iOS.

Mas e no Xamarin Forms? Tem como? Sim, e eu vou mostrar maneiras diferentes!

Abrindo com OpenUri

A primeira delas é a forma mais simples do Xamarin Forms: basta uma simples implementação do OpenUri:

 Device.BeginInvokeOnMainThread(() =>
 {
    Xamarin.Forms.Device.OpenUri(new Uri("skype://"));
 });

Simples, né?

Porém, existem casos (principalmente no iOS) que existem ressalvas. Você, por exemplo, pode querer saber qual App atende determinada solicitação.

Felizmente, graças ao nosso amigo DependencyService, isso é fácil.

Aviso: Se você não o conhece, clique aqui.

Implementando o Launch App

Vamos começar implementando a interface necessária para a ação:

public interface IAppHandler
{
  Task<bool> LaunchApp(string uri);
}

Agora devemos fazer a implementação por plataforma.

iOS

 public class OpenAppiOS : IAppHandler
    {
        public Task<bool> LaunchApp(string uri)
        {
            try
            {
                var canOpen = UIApplication.SharedApplication.CanOpenUrl(new NSUrl(uri));

                if (!canOpen)
                    return Task.FromResult(false);

                return Task.FromResult(UIApplication.SharedApplication.OpenUrl(new NSUrl(uri)));

            }
            catch (Exception ex)
            {
                return Task.FromResult(false);
            }
        }

    }

É necessário realizar uma configuração também, no info.plist do iOS adicione o seguinte trecho:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>skype</string>
    <string>sip</string>
</array>

Android

 [Activity(Label = "OpenAppAndroid")]
    public class OpenAppAndroid : Activity, IAppHandler
    {
        public Task<bool> LaunchApp(string uri)
        {
            bool result = false;

            try
            {
                var aUri = Android.Net.Uri.Parse(uri.ToString());
                var intent = new Intent(Intent.ActionView, aUri);
                Xamarin.Forms.Forms.Context.StartActivity(intent);
                result = true;
            }
            catch (ActivityNotFoundException)
            {
                result = false;
            }

            return Task.FromResult(result);
        }
    }

Com isso creio que seja possível abrir qualquer app.

Vamos para o terceiro método!

Utilizando o Xamarin.Essentials

O último exemplo é com Xamarin.Essentials. Para ver como configurá-lo, consulte meu outro artigo:

Em seguida, basta implementar a chamada:

var appname = "skype://";
var supportsUri = await Launcher.CanOpenAsync(appname);

if (supportsUri)
  await Launcher.OpenAsync(appname);

Eu sempre digo que o Xamarin.Essentials deveria vir por padrão em projeto Forms.

No final, em nossa tela de exemplo teremos três implementações:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Essentials;
using Xamarin.Forms;

namespace ExemploAbrindoApp
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        public void skypeForms_Clicked(object sender, EventArgs e)
        {
            Device.BeginInvokeOnMainThread(() =>
            {
                Xamarin.Forms.Device.OpenUri(new Uri("skype://"));
            });
        }

        public async void dependencyService_Clicked(object sender, EventArgs e)
        {
            var appname = "skype://";
            var exists = await DependencyService.Get<IAppHandler>().LaunchApp(appname);

            //Você pode ver que existe e abrir a store correspondente
            if (!exists)
            {
                string url = Device.RuntimePlatform == Device.iOS ? "https://itunes.apple.com/br/app/skype-para-iphone/id304878510?mt=8" 
                : "https://play.google.com/store/apps/details?id=com.skype.raider&hl=pt_BR";
                Device.OpenUri(new Uri(url));
            }
        }

        public async void xamarinEssentials_Clicked(object sender, EventArgs e)
        {
            var appname = "skype://";
            var supportsUri = await Launcher.CanOpenAsync(appname);

            if (supportsUri)
                await Launcher.OpenAsync(appname);
        }

Agora vamos rodar!

Ajuda muito, hein?

Existem alguns links úteis que podem ajudar:

Espero ter ajudado. Aquele abraço!