Содержание
Отправка 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 осуществляется с использованием одного из клиентов, установленных на устройстве.