Как открыть ссылку mailto: address@domain.tld на adress@domain.tld вместо //domain.tld в Xamarin.Forms? - PullRequest
0 голосов
/ 29 октября 2019

Начальная информация

Использование Xamarin.Forms в сообществе Visual Studio 2019 в Windows 10.

В моем приложении есть страница О программе, которая ссылается на адрес клиента, номер телефона и адрес электронной почты.

Я - новичок в разработке мобильных приложений. Я создал только одно более или менее идентичное приложение до этого и до предстоящего обновления.

До:

Я использовал Device.OpenUri(new System.Uri(url)) до того, как все ссылки работали нормально, т.е. ,вышеупомянутые ссылки открываются в Google Maps, Phone Caller App и Gmail соответственно.

Начиная с версии Xamarin.Forms 4.3.0 Device.OpenUri устарела.

Перемещение между ними:

Я заменил Device.OpenUri на Launcher.TryOpenAsync из Xamarin.Essentials.

Ни одна из ссылок ничего не сделала.

Сейчас:

Вместо этого я заменилэто с Browser.OpenAsync(new System.Uri(url), BrowserLaunchMode.SystemPreferred)

Ссылка на адрес goo.gl/maps открывает приложение Карты по правильному адресу. Хорошо.

Ссылка на "тел: +99912345678" открывает звонящего по правильному номеру телефона. Хорошо.

Ссылка на "mailto: address@domain.tld" открывает Gmail (хорошо), но получатель //domain.tld вместо address@domain.tld. Плохо.

Код:

AboutViewModel.cs

using System;
using System.Windows.Input;
using Xamarin.Forms;
using Xamarin.Essentials;

namespace Domain.ViewModels
{
    public class AboutViewModel : BaseViewModel
    {
        public AboutViewModel()
        {
            Title = "About";
        }
        public ICommand ClickCommand => new Command<string>((url) =>
        {
            //Device.OpenUri(new System.Uri(url));
            //Launcher.TryOpenAsync(new System.Uri(url));
            Browser.OpenAsync(new System.Uri(url), BrowserLaunchMode.SystemPreferred);
        });
    }
}

AboutPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:vm="clr-namespace:Domain.ViewModels"
             mc:Ignorable="d"
             x:Class="Domain.Views.AboutPage"
             Title="{Binding Title}">

    <ContentPage.BindingContext>
        <vm:AboutViewModel />
    </ContentPage.BindingContext>
        ...
        <Label Grid.Row="0" Grid.Column="1"
                VerticalOptions="CenterAndExpand" >
            <Label.FormattedText>
                <FormattedString>
                    <FormattedString.Spans>
                        <Span Text="Street" >
                            <Span.GestureRecognizers>
                                <TapGestureRecognizer Command="{Binding ClickCommand}"
                                                      CommandParameter="https://goo.gl/maps/xxxxxxxxxxxxxxxxx" />
                            </Span.GestureRecognizers>
                        </Span>
                    </FormattedString.Spans>
                </FormattedString>
            </Label.FormattedText>
        </Label>
        ...
        <Label Grid.Row="1" Grid.Column="1"
                VerticalOptions="CenterAndExpand" >
            <Label.FormattedText>
                <FormattedString>
                    <FormattedString.Spans>
                        <Span Text="+999 (0)12 345 678" >
                            <Span.GestureRecognizers>
                                <TapGestureRecognizer Command="{Binding ClickCommand}"
                                                      CommandParameter="tel:0099912345678" />
                            </Span.GestureRecognizers>
                        </Span>
                    </FormattedString.Spans>
                </FormattedString>
            </Label.FormattedText>
        </Label>
        ...
        <Label Grid.Row="2" Grid.Column="1"
                VerticalOptions="CenterAndExpand" >
            <Label.FormattedText>
                <FormattedString>
                    <FormattedString.Spans>
                        <Span Text="address@domain.tld" >
                            <Span.GestureRecognizers>
                                <TapGestureRecognizer Command="{Binding ClickCommand}"
                                                      CommandParameter="mailto:address@domain.tld" />
                            </Span.GestureRecognizers>
                        </Span>
                    </FormattedString.Spans>
                </FormattedString>
            </Label.FormattedText>
        </Label>
        ...

AboutPage.xaml.cs

using System.ComponentModel;
using Xamarin.Forms;

namespace Domain.Views
{
    // Learn more about making custom code visible in the Xamarin.Forms previewer
    // by visiting https://aka.ms/xamarinforms-previewer
    [DesignTimeVisible(false)]
    public partial class AboutPage : ContentPage
    {
        public AboutPage()
        {
            InitializeComponent();
        }
    }
}

Вопрос

В чем моя ошибка?

1 Ответ

1 голос
/ 29 октября 2019
 public class AboutViewModel
{
    public string Title { get; set; }

    public AboutViewModel()
    {
        Title = "About";
    }
    public ICommand ClickCommand => new Command<string>((url) =>
    {
        //Device.OpenUri(new System.Uri(url));
        //Launcher.TryOpenAsync(new System.Uri(url));
        if (!url.Contains("mailto"))
        {
            Browser.OpenAsync(new System.Uri(url), BrowserLaunchMode.SystemPreferred);
        }
        else
        {
            _ = SendEmail("Test mail subject", "This is tesing mail body ", new List<string>() { url });
        }
    });


    public async Task SendEmail(string subject, string body, List<string> recipients)
    {
        try
        {
            var message = new EmailMessage
            {
                Subject = subject,
                Body = body,
                To = recipients,
                //Cc = ccRecipients,
                //Bcc = bccRecipients
            };
            await Email.ComposeAsync(message);
        }
        catch (FeatureNotSupportedException fbsEx)
        {
            // Email is not supported on this device
        }
        catch (Exception ex)
        {
            // Some other exception occurred
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...