Содержание
Отправка SMS, с учётом развития различных приложений для отправки сообщений типа WhatsApp и Telegram, не столь важна для коммуникации, однако, в .NET MAUI предусмотрена и такая возможность. Поэтому в этой части мы, опираясь на уже созданное приложение по работе с контактами и набору телефонного номера, разберемся с тем как в приложениях .NET MAUI организовать отправку сообщений абонентам.
Интерфейс ISms
Как и интерфейс IPhoneDialer, интерфейс ISms предназначен для открытия приложения по умолчанию для отправки сообщений с уже набранным текстом сообщения и номерами получателей.
Этот интерфейс предоставляет нам одно свойство:
public bool IsComposeSupported { get; }
определяющее доступна ли отправка SMS с этого устройства и один метод:
public Task ComposeAsync(SmsMessage? message);
который открывает клиент для отправки сообщения. При этом, класс SmsMessage, объект которого используется в параметрах метода, содержит следующие свойства:
| Свойство | Тип | Описание |
Body |
string? |
Текст сообщения |
Recipients |
List<String> |
Получатели сообщения (номера телефонов) |
Таким образом, для отправки сообщения, мы должны сформировать объект типа SmsMessage и вызвать метод ComposeAsync(). Реализация интерфейса ISms по умолчанию содержится в свойстве Default статического класса Sms. Доработаем наше приложения для того, чтобы по выбранному номеру абонента можно было отправлять SMS.
Отправка SMS в .NET MAUI
Изменение манифеста приложения
Так как наше приложение будет взаимодействовать с клиентом по отправке сообщений, то необходимо внести изменения в манифест приложения также, как мы это делали в предыдущей части. На данный момент манифест приложения должен выглядеть следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<queries>
<intent>
<action android:name="android.intent.action.DIAL" />
<data android:scheme="tel"/>
</intent>
</queries>
</manifest>
Изменим файл следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<queries>
<intent>
<action android:name="android.intent.action.DIAL" />
<data android:scheme="tel"/>
</intent>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="smsto"/>
</intent>
</queries>
</manifest>
для того, чтоб наше приложение могло взаимодействовать с приложениями для отправки сообщений мы добавили в манифест ещё одно требование к видимости пакета:
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="smsto"/>
</intent>
Теперь воспользуемся реализацией интерфейса ISms по умолчанию для отправки сообщений.
Команда для отправки SMS абоненту
Изменим модель представления ContactsViewModel, добавив в немм новую команду для отправки SMS абоненту:
public class ContactsViewModel: INotifyPropertyChanged
{
...
public ICommand SendSmsCommand { get; set; }
public ContactsViewModel()
{
SendSmsCommand = new Command(async()=>
{
if ((Sms.Default.IsComposeSupported) && (SelectedPhone != null))
{
var message = await AppShell.Current.CurrentPage.DisplayPromptAsync("Текст SMS", "Введите текст сообщения");
SmsMessage sms = new SmsMessage(message,SelectedPhone.PhoneNumber);
await Sms.Default.ComposeAsync(sms);
}
});
...
}
...
}
Здесь мы проверяем возможность отправки SMS с устройства и выбран ли какой-либо телефон для отправки. После чего, используя метод DisplayPromptAsync() класса Page, просим пользователя ввести сообщение. Так как метод ComposeAsync() допускает null в тексте сообщения, то дополнительную проверку текста сообщения мы не производим, а сразу открываем клиент для отправки сообщений.
Теперь добавим на страницу MainPage новую кнопку:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MauiPhone.ViewModels"
xmlns:model="clr-namespace:Microsoft.Maui.ApplicationModel.Communication;assembly=Microsoft.Maui.Essentials"
x:Class="MauiPhone.MainPage"
x:DataType="local:ContactsViewModel">
<ScrollView>
<VerticalStackLayout
Padding="30,0"
Spacing="25">
...
<Button Text="Отправить сообщение" Command="{Binding SendSmsCommand}" />
</VerticalStackLayout>
</ScrollView>
</ContentPage>
Проверим работу приложения. После того, как вы загрузите список контактов или выдерите контакт из адресной книги, выберите номер телефона абонента и нажмите кнопку «Отправить сообщение». Вы увидите следующее сообщение:
Набрав текст сообщения и нажав кнопку «OK» вы увидите список приложений для отправки SMS, установленных на устройстве
После выбора клиента для отправки сообщений откроет его окно с уже набранным текстом SMS и адресатом:
Итого
Для отправки SMS абонентам в .NET MAUI используется интерфейс ISms реализация которого по умолчанию содержится в свойстве Default статического класса Sms. Отправка SMS осуществляется с использованием одного из клиентов, установленных на устройстве.
