Перенос приложений iOS, использующих Microsoft Authenticator, из ADAL.NET в MSAL.NET
Вы уже использовали библиотеку проверки подлинности Azure Active Directory для .NET (ADAL.NET) и брокера iOS. Теперь пора перейти на библиотеку проверки подлинности Майкрософт для .NET (MSAL.NET), которая поддерживает брокер в iOS начиная с выпуска 4.3 и далее.
С чего начать? Эта статья поможет вам перенести приложение Xamarin на платформе iOS из ADAL в MSAL.
Необходимые компоненты
В этой статье предполагается, что у вас уже есть приложение Xamarin, интегрированное с брокером iOS. В противном случае перейдите непосредственно к MSAL.NET и начните реализацию брокера. Сведения о том, как вызвать брокер iOS в MSAL.NET для нового приложения, см. в этой документации.
Общие сведения
Что такое брокеры?
Брокеры — это приложения, предоставляемые корпорацией Майкрософт в Android и iOS. (См. приложение Microsoft Authenticator в iOS и Android, а также приложение «Корпоративный портал Intune» на Android.)
- Единый вход.
- Идентификацию устройства, необходимую для некоторых политик условного доступа. Дополнительные сведения см. в разделе Управление устройствами.
- Проверку идентификации приложения, которая также необходима в некоторых корпоративных сценариях. Дополнительные сведения см. в статье Управление мобильными приложениями Intune (MAM).
Перенос данных из ADAL в MSAL
Шаг 1. Включение брокера
| Текущий код ADAL: | Аналог в MSAL: |
| В ADAL.NET поддержка брокера была включена для каждого контекста проверки подлинности. По умолчанию он отключен. Вам пришлось установить |
флажок useBroker для вызова брокера в значение «Да» в конструкторе PlatformParameters :
public PlatformParameters( UIViewController callerViewController, bool useBroker)
Кроме того, в зависящем от платформы коде этого примера, в модуле отрисовки страниц для iOS установите флажок useBroker в значение «Да»:
page.BrokerParameters = new PlatformParameters( this, true, PromptBehavior.SelectAccount);
Затем включите параметры в вызов токена получения:
AuthenticationResult result = await AuthContext.AcquireTokenAsync( Resource, ClientId, new Uri(RedirectURI), platformParameters) .ConfigureAwait(false);
параметр WithBroker() (по умолчанию имеет значение true), чтобы вызвать брокер:
var app = PublicClientApplicationBuilder .Create(ClientId) .WithBroker() .WithReplyUri(redirectUriOnIos) .Build();
В вызове запроса маркера:
result = await app.AcquireTokenInteractive(scopes) .WithParentActivityOrWindow(App.RootViewController) .ExecuteAsync();
Шаг 2. Установка UIViewController()
В ADAL.NET вы ознакомились с UIViewController в качестве части PlatformParameters . (См. пример на шаге 1.) В MSAL.NET для предоставления разработчикам большей гибкости используется окно объекта, но оно не является обязательным для обычного использования iOS. Чтобы использовать брокер, задайте окно объекта для отправки и получения ответов от брокера.
| Текущий код ADAL: | Аналог в MSAL: |
| UiViewController передается в |
PlatformParameters на платформе iOS.
page.BrokerParameters = new PlatformParameters( this, true, PromptBehavior.SelectAccount);
- В AppDelegate.cs задайте App.RootViewController в новое UIViewController() . Это назначение гарантирует наличие UIViewController с вызовом брокера. Если значения заданы неправильно, может появиться следующее сообщение об ошибке: «uiviewcontroller_required_for_ios_broker»:»UIViewController is null, so MSAL.NET cannot invoke the iOS broker. See https://aka.ms/msal-net-ios-broker» .
- При вызове AcquireTokenInteractive используйте .WithParentActivityOrWindow(App.RootViewController) и передайте ссылку на окно объекта, которое вы будете использовать.
Пример.
public static object RootViewController
LoadApplication(new App()); App.RootViewController = new UIViewController();
В вызове запроса маркера:
result = await app.AcquireTokenInteractive(scopes) .WithParentActivityOrWindow(App.RootViewController) .ExecuteAsync();
Шаг 3. Обновление AppDelegate для обработки обратного вызова
И ADAL, и MSAL вызывают брокер, а брокер, в свою очередь, обращается к приложению через метод OpenUrl класса AppDelegate . Дополнительные сведения см. в этой документации.
В данном случае изменений между ADAL.NET и MSAL.NET не существует.
Шаг 4. Регистрация схемы URL-адреса
ADAL.NET и MSAL.NET используют URL-адреса для вызова брокера и возврата ответа брокера обратно в приложение. Зарегистрируйте схему URL-адресов в файле приложения Info.plist следующим образом.
| Текущий код ADAL: | Аналог в MSAL: |
| Схема URL-адресов уникальна для вашего приложения. | Токен |
Имя CFBundleURLSchemes должно включать
в качестве префикса, за которым следует CFBundleURLName .
CFBundleURLTypes CFBundleTypeRole Editor CFBundleURLName com.yourcompany.xforms CFBundleURLSchemes msauth.com.yourcompany.xforms
Эта схема URL-адресов становится частью URI перенаправления, который является уникальным идентификатором приложения при получении ответа брокера.
Шаг 5. Добавление идентификатора брокера в раздел LSApplicationQueriesSchemes
Как ADAL.NET, так и MSAL.NET используют -canOpenURL: чтобы проверить, установлен ли брокер на устройстве. Добавьте правильный идентификатор для брокера iOS в раздел LSApplicationQueriesSchemes файла info.plist следующим образом.
| Текущий код ADAL: | Аналог в MSAL: |
| Использует |
LSApplicationQueriesSchemes msauth
LSApplicationQueriesSchemes msauthv2 msauthv3
Шаг 6. Зарегистрируйте URI перенаправления через портал Azure
ADAL.NET и MSAL.NET добавляют дополнительные требования к URI перенаправления, когда он берет в цель брокера. Зарегистрируйте URI перенаправления в приложении через портал Azure.
public static string redirectUriOnIos = «msauth.com.yourcompany.XForms://auth»;
Дополнительные сведения о регистрации URI перенаправления в портал Azure см. в разделе Шаг 7. Добавление URI перенаправления в регистрацию приложения.
Шаг 7. Настройка Entitlements.plist
Включите доступ к цепочке ключей в файле прав Entitlements.plist:
keychain-access-groups $(AppIdentifierPrefix)com.microsoft.adalcache
Дополнительные сведения о включении доступа к цепочке ключей см. в разделе Включение доступа к цепочке ключей.
Использование Microsoft Authenticator или корпоративного портала Intune в приложениях Xamarin
В Android и iOS такими брокерами, как Microsoft Authenticator и корпоративный портал Microsoft Intune для Android, обеспечивается:
- Единый вход (SSO). Пользователям не потребуется входить в каждое приложение.
- Идентификация устройства. Брокер получает доступ к сертификату устройства. Этот сертификат создается на устройстве при его подключении к рабочей области.
- Проверка идентификации приложения. Когда приложение вызывает брокер, ему передается URL-адрес перенаправления. Брокер выполняет проверку URL-адреса.
Чтобы включить одну из этих функций, используйте параметр WithBroker() при вызове метода PublicClientApplicationBuilder.CreateApplication . Для параметра .WithBroker() по умолчанию задается значение true.
Настройка проверки подлинности через брокер в библиотеке проверки подлинности Майкрософт для .NET (MSAL.NET) зависит от платформы:
Проверка подлинности через брокер для iOS
Чтобы разрешить взаимодействие приложения Xamarin.iOS с приложением Microsoft Authenticator, выполните следующие действия. Если вы ориентируетесь на iOS 13, рекомендуем ознакомиться с критическими изменениями API компании Apple.
Шаг 1. Включение поддержки брокера
Необходимо включить поддержку брокера для отдельных экземпляров PublicClientApplication . По умолчанию поддержка отключена. При создании PublicClientApplication с помощью PublicClientApplicationBuilder используйте параметр WithBroker() , как показано в следующем примере. Для параметра WithBroker() по умолчанию задается значение true.
var app = PublicClientApplicationBuilder .Create(ClientId) .WithBroker() .WithReplyUri(redirectUriOnIos) // $"msauth.://auth" (see step 6 below) .Build();
Шаг 2. Разрешение доступа к цепочке ключей
Чтобы разрешить доступ к цепочке ключей, необходимо иметь группу доступа к цепочке ключей для приложения. При создании приложения можно использовать API WithIosKeychainSecurityGroup() для настройки группы доступа к цепочке ключей:
var builder = PublicClientApplicationBuilder .Create(ClientId) .WithIosKeychainSecurityGroup("com.microsoft.adalcache") .Build();
Дополнительные сведения см. в разделе Разрешение доступа к цепочке ключей.
Шаг 3. Обновление AppDelegate для обработки обратного вызова
Когда MSAL.NET вызывает брокер, он отправляет обратный вызов в приложение с помощью метода OpenUrl класса AppDelegate . Так как MSAL ожидает ответ от брокера, приложение должно взаимодействовать для отправки обратного вызова в MSAL.NET. Для обеспечения такого взаимодействия обновите файл AppDelegate.cs, чтобы переопределить следующий метод.
public override bool OpenUrl(UIApplication app, NSUrl url, string sourceApplication, NSObject annotation) < if (AuthenticationContinuationHelper.IsBrokerResponse(sourceApplication)) < AuthenticationContinuationHelper.SetBrokerContinuationEventArgs(url); return true; >else if (!AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url)) < return false; >return true; >
Этот метод вызывается при каждом запуске приложения. Его использование дает возможность обработать ответ от брокера и завершить процесс проверки подлинности, запущенный MSAL.NET.
Шаг 4. Настройка UIViewController()
Находясь в файле AppDelegate.cs, установите окно объекта. Обычно для Xamarin iOS устанавливать окно объекта не требуется, но оно необходимо для отправки и получения ответов от брокера.
Чтобы настроить окно объекта, выполните следующие действия:
- В файле AppDelegate.cs задайте App.RootViewController в новом UIViewController() . Это назначение гарантирует включение UIViewController в вызов брокеру. Если этот параметр назначен неправильно, может появиться следующее сообщение об ошибке: «uiviewcontroller_required_for_ios_broker»:»UIViewController is null, so MSAL.NET cannot invoke the iOS broker. See https://aka.ms/msal-net-ios-broker»
- В вызове AcquireTokenInteractive используйте .WithParentActivityOrWindow(App.RootViewController) , а затем передайте ссылку в окно объекта, которое вы будете использовать. В App.cs:
public static object RootViewController
В AppDelegate.cs:
LoadApplication(new App()); App.RootViewController = new UIViewController();
В вызове AcquireToken :
result = await app.AcquireTokenInteractive(scopes) .WithParentActivityOrWindow(App.RootViewController) .ExecuteAsync();
Шаг 5. Регистрация схемы URL-адресов
MSAL.NET использует URL-адреса для вызова брокера и для последующего возврата ответа брокера в приложение. Чтобы завершить круговой путь, зарегистрируйте схему URL-адресов для приложения в файле Info.plist.
Имя CFBundleURLSchemes должно включать msauth. в качестве префикса. После префикса используйте CFBundleURLName .
В схеме URL-адресов BundleId является уникальным идентификатором приложения: $»msauth.(BundleId)» . Таким образом, если для BundleId задано значение com.yourcompany.xforms , то схема URL-адресов будет msauth.com.yourcompany.xforms .
Эта схема URL-адресов становится частью URI перенаправления, который является уникальным идентификатором вашего приложения при получении ответа брокера.
CFBundleURLTypes CFBundleTypeRole Editor CFBundleURLName com.yourcompany.xforms CFBundleURLSchemes msauth.com.yourcompany.xforms
Шаг 6. Добавление идентификатора брокера в раздел LSApplicationQueriesSchemes
MSAL использует –canOpenURL: для проверки того, установлен ли брокер на устройстве. В iOS 9 компания Apple заблокировала схемы, которые может запрашивать приложение.
Добавьте msauthv2 в раздел LSApplicationQueriesSchemes файла Info.plist, как показано в следующем примере:
LSApplicationQueriesSchemes msauthv2 msauthv3
Шаг 7. Добавление URI перенаправления в регистрацию приложения
Действия, описанные в этой статье, могут немного отличаться на портале, с который вы начинаете работу.
При использовании брокера к URI перенаправления выдвигается дополнительное требование. URI перенаправления должен иметь следующий формат:
$"msauth.://auth"
public static string redirectUriOnIos = "msauth.com.yourcompany.XForms://auth";
Обратите внимание, что URI перенаправления совпадает с именем CFBundleURLSchemes , включенным в файл Info.plist.
Добавьте URI перенаправления в регистрацию приложения. Чтобы создать правильный формат URI перенаправления, используйте Регистрация приложений для создания URI перенаправления через брокер из идентификатора пакета.
Для создания URI перенаправления выполните следующие действия:

- Войдите в Центр администрирования Microsoft Entra как минимум облачные приложения Администратор istrator.
- Перейдите к приложениям>удостоверений>Регистрация приложений.
- Найдите и выберите приложение.
- Выберите Проверка подлинности>Добавить платформу>iOS / macOS.
- Введите идентификатор пакета и нажмите Настроить. Скопируйте созданный URI перенаправления, который отображается в текстовом поле URI перенаправления, для включения в код:
- Нажмите Готово, чтобы завершить создание URI перенаправления.
Проверка подлинности через брокер для Android
Шаг 1. Включение поддержки брокера
Поддержка брокера включается отдельно для каждого PublicClientApplication . По умолчанию он отключен. При создании IPublicClientApplication с помощью PublicClientApplicationBuilder используйте параметр WithBroker() (по умолчанию ему задано значение true).
var app = PublicClientApplicationBuilder .Create(ClientId) .WithBroker() .WithRedirectUri(redirectUriOnAndroid) // See step #4 .Build();
Шаг 2. Обновление основного действия для обработки обратного вызова
Когда MSAL.NET вызывает брокер, тот, в свою очередь, отправляет обратный вызов в приложение с использованием метода OnActivityResult() . Так как MSAL будет ждать ответ от брокера, приложению необходимо направить результат в MSAL.NET.
Направьте результат в метод SetAuthenticationContinuationEventArgs(int requestCode, Result resultCode, Intent data) , переопределив метод OnActivityResult() , как показано ниже:
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
Этот метод вызывается каждый раз при запуске приложения брокера, и его использование дает возможность обработки ответа от брокера и завершения процесса проверки подлинности, запущенного MSAL.NET.
Шаг 3. Задание действия
Чтобы включить проверку подлинности через брокер, настройте действие таким образом, чтобы MSAL могла отправлять и получать ответ от брокера. Для этого укажите действие (обычно MainActivity ) для родительского объекта WithParentActivityOrWindow(object parent) .
Например, в вызове для AcquireTokenInteractive() :
result = await app.AcquireTokenInteractive(scopes) .WithParentActivityOrWindow((Activity)context)) .ExecuteAsync();
Шаг 4. Добавление URI перенаправления в регистрацию приложения
MSAL использует URL-адреса для вызова брокера и для последующего возврата ответа в приложение. Чтобы завершить это круглое путешествие, зарегистрируйте универсальный код ресурса (URI перенаправления) для приложения.
Формат URI перенаправления для приложения зависит от сертификата, используемого для подписи APK. Например:
msauth://com.microsoft.xforms.testApp/hgbUYHVBYUTvuvT&Y6tr554365466=
Последняя часть URI, hgbUYHVBYUTvuvT&Y6tr554365466= — это версия сигнатуры в кодировке Base64, с помощью которой подписывается APK. Если при разработке приложения в Visual Studio отладка кода осуществляется без подписи APK с помощью определенного сертификата, Visual Studio подписывает для вас APK в целях отладки. Когда Visual Studio подписывает APK для вас таким способом, компьютеру, на котором выполняется его сборка, предоставляется уникальная подпись. Таким образом, каждый раз, когда вы создаете приложение на другом компьютере, необходимо обновить URI перенаправления в коде приложения и регистрации приложения для проверки подлинности с помощью MSAL.
При отладке можно столкнуться с исключением MSAL (или сообщением журнала), сообщающим, что указанный URI перенаправления неверен. Исключение или сообщение журнала также указывает URI перенаправления, который следует использовать с компьютером, где в данный момент выполняется отладка. Вы можете использовать предоставленный URI перенаправления для продолжения разработки приложения до тех пор, пока вы обновляете URI перенаправления в коде и добавляете предоставленный URI перенаправления в регистрацию приложения.
Когда вы будете готовы завершить код, обновите URI перенаправления в коде и регистрацию приложения, чтобы использовать подпись сертификата, с которым вы подписываете APK.
На практике это означает, что следует добавить URI перенаправления для каждого члена вашей команды разработчиков, а также URI перенаправления для версии APK, подписанной для рабочей среды.
Вы можете вычислить подпись самостоятельно аналогично тому, как это делает MSAL:
private string GetRedirectUriForBroker() < string packageName = Application.Context.PackageName; string signatureDigest = this.GetCurrentSignatureForPackage(packageName); if (!string.IsNullOrEmpty(signatureDigest)) < return string.Format(CultureInfo.InvariantCulture, ":///", RedirectUriScheme, packageName.ToLowerInvariant(), signatureDigest); > return string.Empty; > private string GetCurrentSignatureForPackage(string packageName) < PackageInfo info = Application.Context.PackageManager.GetPackageInfo(packageName, PackageInfoFlags.Signatures); if (info != null && info.Signatures != null && info.Signatures.Count >0) < // First available signature. Applications can be signed with multiple signatures. // The order of Signatures is not guaranteed. Signature signature = info.Signatures[0]; MessageDigest md = MessageDigest.GetInstance("SHA"); md.Update(signature.ToByteArray()); return Convert.ToBase64String(md.Digest(), Base64FormattingOptions.None); // Server side needs to register all other tags. ADAL will // send one of them. >>
Вы также можете получить подпись для пакета, используя keytool с помощью следующих команд:
keytool.exe -list -v -keystore "%LocalAppData%\Xamarin\Mono for Android\debug.keystore" -alias androiddebugkey -storepass android -keypass android
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
Шаг 5 (необязательно). Возврат в системный браузер
Если MSAL настроен для использования брокера, но брокер не установлен, MSAL вернется к использованию веб-представления (браузера). MSAL попытается пройти проверку подлинности с помощью системного браузера по умолчанию на устройстве, что завершится ошибкой, так как URI перенаправления настроен для использования брокера, а системному браузеру не известно, как использовать его для возврата в MSAL. Чтобы избежать этой ошибки, можно настроить фильтр намерений с помощью URI перенаправления брокера, который использовался на шаге 4.
Измените манифест приложения, чтобы добавить фильтр намерений:
Например, если у вас есть URI перенаправления для msauth://com.microsoft.xforms.testApp/hgbUYHVBYUTvuvT&Y6tr554365466= , манифест должен выглядеть как следующий фрагмент кода XML.
Перед подписью в значении android:path требуется косая черта ( / ).
Дополнительные сведения о настройке приложения для системного браузера и поддержки Android 11 см. в разделе Обновление манифеста Android для поддержки системного браузера.
В качестве альтернативы можно настроить MSAL для возврата во встроенный браузер, который не зависит от URI перенаправления:
.WithUseEmbeddedWebUi(true)
Советы по устранению неполадок при проверке подлинности через брокер в Android
Ниже приведены несколько советов по предотвращению проблем при внедрении проверки подлинности через брокер в Android:
- Универсальный код ресурса (URI перенаправления) — добавление URI перенаправления в регистрацию приложения. Отсутствующий или неверный URI перенаправления является распространенной проблемой, с которой сталкиваются разработчики.
- Версия брокера: установите минимально необходимую версию приложений брокера. Для проверки подлинности через брокер в Android можно использовать одно из этих двух приложений.
- Корпоративный портал Intune (версия 5.0.4689.0 или более поздняя)
- Microsoft Authenticator (версия 6.2001.0140 или более поздняя).
- Нажмите кнопку меню в правом верхнем углу приложения.
- Выберите Отправить отзыв>Возникли проблемы?.
- Под вопросом Что вы пытаетесь сделать? выберите вариант и добавьте описание.
- Чтобы отправить журналы, нажмите стрелку в правом верхнем углу приложения.
После отправки журналов в диалоговом окне отобразится идентификатор инцидента. Запишите идентификатор инцидента и укажите его, обращаясь за помощью.
- Нажмите кнопку меню в левом верхнем углу приложения.
- Выберите Справка>Написать в поддержку.
- Чтобы отправить журналы, выберите Отправить только журналы.
После отправки журналов в диалоговом окне отобразится идентификатор инцидента. Запишите идентификатор инцидента и укажите его, обращаясь за помощью.
Vacancy has been moved to archive
Наш клиент — ведущий брокер строящейся недвижимости, лидер по продажам квартир и объемам ипотечных сделок. Компания предлагает квартиры только от надежных застройщиков – это самый широкий выбор жилья в строящихся домах во всех районах Санкт-Петербурга и в Ленинградской области. Большинство объектов компания реализует на эксклюзивных условиях. В связи с расширением в команду требуется Разработчик Xamarin.
Требования:
- Уверенное владение C#, .NET Core, .NET Framework, Xamarin Forms;
- Понимание принципов построения гибридных приложений на платформе Xamarin , умение комбинировать нативный и кроссплатформенный код;
- Знание особенностей платформ iOS и Android;
- Знание принципов REST, ООП, паттернов проектирования (MVC/MVP/MVVM);
- Умение следовать human interface guidelines/material design.
Обязанности:
Разработка и сопровождение мобильного приложения на базе платформы Xamarin.
Условия:
- Официальное оформление по ТК РФ;
- Полностью «белая» заработная плата;
- 8 часовой рабочий день (возможно гибкое начало и окончание рабочего дня);
- Место работы — Московский пр-кт 212, 3 минуты пешком от м. «Московская». Весной 2020 г. – переезд в собственный новый офис класса А на Ушаковской набережной, ст. м. «Черная речка»;
- После 1 года работы в компании — ДМС;
- Корпоративные скидки на недвижимость, фитнес, бассейны, изучение английского языка;
- Развитая корпоративная культура;
- Уровень дохода обсуждается по итогам собеседования.
Xamarin: Удобный REST для Xamarin-приложений
Пятая статья в цикле “Рецепты для Xamarin-разработчиков”.
Refit для удобного описания клиента REST API
Самым популярным в настоящее время протоколом для общения мобильных приложений с сервером является REST в связке с Json. Поэтому наше сегодняшнее знакомство начнем с библиотеки Refit.
Refit позволяет описать спецификации для работы с REST-сервисом в виде простого Interface с понятным набором входных и выходных параметров, включая возможность манипулировать HTTP-заголовками для отдельных запросов. Для примера возьмем демо-API сервиса httpbin.org:
[Headers("Accept: application/json")]
public interface IHttpbinApi
[Get("/basic-auth//")]
Task BasicAuth(string username, string password, [Header("Authorization")] string authToken, CancellationToken ctx); [Get("/cache")]
Task CheckIfModified([Header("If-Modified-Since")] string lastUpdateAtString, CancellationToken ctx); [Post("/post")]
Task FormPost([Body(BodySerializationMethod.UrlEncoded)] FormData data, CancellationToken ctx);
>После описания данного интерфейса, он подается на вход для Refit:
var client = new HttpClient(new NativeMessageHandler())
BaseAddress = new Uri("http://httpbin.org")
>;
_httpbinApiService = RestService.For(client);Сами данные можно при необходимости (конвертации camel case или snake eyes, преобразование из множества в строковые значения) можно расширить аттрибутами из библиотеки Json.net, так как именно она используется в Refit:
public class AuthResult
[JsonProperty("authenticated")]
public bool IsAuthenticated < get; set; > [JsonProperty("user")]
public string Login < get; set; >
>В Refit в качестве выходного значения можно получить уже преобразованные объекты DTO или HttpResponseMessage. Последний позволяет получить информацию о запросе и ответе, что может быть полезно при отладке. При желании также может использоваться ModernHttpClient при создании HttpClient. В целом, Refit — достаточно удобный и универсальный инструмент для Xamarin-разработчиков в том числе.
Примечание 1: для установки Refit 3.0 в PCL-проект Xamarin.Forms потребуется перевести проект на .NET Standard.
Примечание 2: в документации Refit нет упоминания на использование CancelationToken для отмены активных операций, но данный механизм работает и описан в тикете.
Polly
При разработке мобильных приложений часто приходится учитывать фактор нестабильности сигнала в сотовых сетях, поэтому при выполнении сетевых запросов часто возникает необходимости делать повторные попытки. Это позволяет не отвлекать лишний раз пользователя просьбой повторить запрос.
Интересный подход по использованию Refit и Polly описал Rob Gibbens в своем блоге (дополнительно там показан пример приоретизацией сетевых запросов с помощью Fusillade).
Вот так мы совершаем запрос:
protected async Task MakeRequest(Func
loadingFunction, CancellationToken cancellationToken) try
Exception exception = null;
var result = default(T);
result = await Policy.Handle().Or()
.WaitAndRetryAsync(3, i => TimeSpan.FromMilliseconds(300), (ex, span) => exception = ex)
.ExecuteAsync(loadingFunction, cancellationToken);
>
catch (Exception e)
// Сюда приходят ошибки вроде отсутствия интернет-соединения или неправильной работы DNS
exception = e;
>
//TODO: Обработать исключения или передать их дальше
return result;
>Вместо loadingFunction необходимо передать ваш код обращения к Refit:
var authToken = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes($":"));
return await MakeRequest(ct => _httpbinApiService.BasicAuth(username, password, authToken, ct), cancellationToken);Итак, мы интегрировали Refit, Polly и ModernHttpClient.
И в завершении статьи можно рассмотреть использование кэша при работе с сетью. Xamarin-разработчику доступны все возможности целевых платформ, поэтому для реализации кэша можно использовать различные СУБД. Одним из самых популярных кэшеров выступает Akavache, работающий поверх SQLite.
var cache = BlobCache.LocalMachine;
var cachedObjects = cache.GetAndFetchLatest("objects", GetRemoteObjectAsync,
offset =>
TimeSpan elapsed = DateTimeOffset.Now - offset;
return elapsed > new TimeSpan(hours: 0, minutes: 30, seconds: 0);
>);Также можно использовать для реализации кэша очень удобную мобильную СУБД Realm. Ниже представлен пример кэшера на базе Realm:
public static class LocalCache
private class CachedObject : RealmObject
[PrimaryKey]
public string Key < get; set; >
public string Value < get; set; >
public DateTimeOffset UpdatedAt < get; set; >
>
private static readonly RealmConfiguration Configuration = new RealmConfiguration("cache.realm", true);
private static Realm Db => Realm.GetInstance(Configuration);
public static async Task WriteToCache(string key, T data, DateTimeOffset timeStamp)
if (String.IsNullOrEmpty(key) || data == null || timeStamp == DateTimeOffset.MinValue) return;
var currentValue = Db.All().Where(o => o.Key == key).ToList().FirstOrDefault();
if (currentValue == null)
await Db.WriteAsync(db =>
var newValue = db.CreateObject();
newValue.Key = key;
newValue.UpdatedAt = timeStamp;
newValue.Value = JsonConvert.SerializeObject(data);
>);
else
using (var transaction = Db.BeginWrite())
currentValue.Value = JsonConvert.SerializeObject(data);
currentValue.UpdatedAt = timeStamp;
transaction.Commit();
>
> public static DateTimeOffset CacheLastUpdated(string key)
if (String.IsNullOrEmpty(key)) return DateTimeOffset.MinValue;
var currentValue = Db.All().Where(o => o.Key == key).ToList().FirstOrDefault();
return currentValue?.UpdatedAt ?? DateTimeOffset.MinValue;
> public static void RemoveCache(string key)
if (String.IsNullOrEmpty(key)) return;
var currentValue = Db.All().Where(o => o.Key == key).ToList().FirstOrDefault();
if (currentValue == null) return;
using (var transaction = Db.BeginWrite())
Db.Remove(currentValue);
transaction.Commit();
>
> public static T GetFromCache(string key)
if (String.IsNullOrEmpty(key)) return default(T);
var currentValue = Db.All().Where(o => o.Key == key).ToList().FirstOrDefault();
return currentValue?.Value == null ? default(T) : JsonConvert.DeserializeObject(currentValue.Value);
> public static void ClearCache()
Realm.DeleteRealm(Configuration);
>
>Заключение
Итак, сегодня мы рассмотрели использование Refit, Json.net, ModernHttpClient, Polly и Realm при интеграции с REST API.