#c# #ios #xamarin.ios #blazor
Вопрос:
Предыстория Работы над гибридным приложением Blazor, которое использует мобильные привязки Blazor для распространения в качестве приложения для Android и iOS. Основная функциональность приложения работает и была протестирована путем развертывания приложения в службе приложений Azure для его тестирования в качестве веб-приложения, а также загрузки в Google Play Store для внутреннего тестирования.
Постановка проблемы Приложение может успешно скомпилироваться и успешно работать в Android, однако при попытке отладки на эмуляторе iOS мы получаем пустое представление. Запуск соответствует тестовым проектам, которые я видел, и соответствует рабочему шаблону привязок для мобильных устройств Blazor. Вот пример мобильного проекта привязки Blazor для iOS
Детали проекта
- Цель развертывания iOS 8.0
- Мобильная библиотека классов C# , построенная с использованием стандарта .NET 2.1
- При запуске приложения должен отображаться экран входа в систему, и для входа используется Azure AD B2C для обеспечения безопасности входа и регистрации.
Подробности проблемы iOS Запуск приложения довольно прост и соответствует стандартной настройке проекта для мобильного проекта Blazor Bindings. Main.cs совпадает с исходным шаблоном. Существует отличие от проекта шаблона в AppDelegate.cs, чтобы разрешить MSAL для аутентификации в функции openURL, изменение можно увидеть в строке 29.
AppDelegate.cs
// The UIApplicationDelegate for the application. This class is responsible for launching the
// User Interface of the application, as well as listening (and optionally responding) to
// application events from iOS.
[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
//
// This method is invoked when the application has loaded and is ready to run. In this
// method you should instantiate the window, load the UI into it and then make the window
// visible.
//
// You have 17 seconds to return from this method, or iOS will terminate your application.
//
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
// For iOS, wrap inside a navigation page, otherwise the header looks wrong
var formsApp = new App();
formsApp.MainPage = new NavigationPage(formsApp.MainPage);
LoadApplication(formsApp);
return base.FinishedLaunching(app, options);
}
public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
if (AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url))
{
return true;
}
return base.OpenUrl(app, url, options);
}
}
App.cs
public App(IFileProvider fileProvider = null)
{
HttpClient httpClient = new HttpClient();
var hostBuilder = MobileBlazorBindingsHost.CreateDefaultBuilder()
.ConfigureServices((hostContext, services) =>
{
// ... IOC Configuration
// ...
})
.UseWebRoot("wwwroot");
if (fileProvider != null)
{
hostBuilder.UseStaticFiles(fileProvider);
}
else
{
hostBuilder.UseStaticFiles();
}
var host = hostBuilder.Build();
MainPage = new ContentPage { Title = "Pronto Pay" };
host.AddComponent<Main>(parent: MainPage);
}