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:
- Schemas registrados para chamar
- Como configurar um APP iOS com Url customizada
- Código utilizado no exemplo
- Outros artigos sobre Xamarin
Espero ter ajudado. Aquele abraço!