Асинхронные вызовы в приложении .Net-8.0 MAUI Blazor не работают на платформе iOS, работают на Android и Windows - проблема OpenAppPackageFileAsync() на iOS

Создание приложения в .NET (8) MAUI BLAZOR HYBRID

Работа инициализируется на Android, Windows и iOS. Однако данные извлекаются и отображаются только в Windows и Android. платформа iOS не получает данные. Он отображает страницу без данных и не перезагружает ее (очевидно, данные все равно не извлекаются). Я поставил точку останова, она не выполняется и не доходит до следующей строки кода:

SharedData.SharedDataBundle = Global.DataBundleCollelction;

Проблема

Наблюдение заключается в том, что приведенный ниже асинхронный вызов не соблюдается на платформе iOS. Windows и Android ждут завершения асинхронного вызова и продолжают обработку данных.

Не знаю, как это исправить, я пробовал много способов его вызова, но async-await Task.Run() или Task.WhenAll(), похоже, не работает на iOS.

Стартовый код

Код в App.Xaml.cs выглядит следующим образом:

    public partial class App : Application
    {
        [Inject] SharedDataService sharedDataService { get; set; }

        public App()
        {
            InitializeComponent();
            sharedDataService = new SharedDataService();
            
            var tasks = new List<Task>
            {
                Task.Run(async () =>
                {
                    Global.DataBundleCollelction = await sharedDataService.UpdateSharedWeatherData(new List<int> { 1, 2, 4, 25, 26, 91 });
                    SharedData.SharedDataBundle = Global.DataBundleCollelction;
                }),
                Task.Run(async () =>
                {
                    var bundle = Global.DataBundleCollelction;
                    var weatherSettingsService = new WeatherSettingsService(bundle);
                    var weatherSettings = await weatherSettingsService.LoadSettingsAsync();
                })
            };

            Task.WhenAll(tasks).Wait();
            MainPage = new MainPage();
        }
    }

Пожалуйста, подскажите мне, что мне не хватает?

ОБНОВЛЯТЬ:

Я использую следующий метод для чтения файлов JSON из /Resources/Raw/MyJson.json (MauiAsset)

public async Task<ObservableCollection<T>> ReadJsonDataAsync<T>(string jsonDataFileName)
{
    ObservableCollection<T>? genericTypeList = new();
    var isExist = await FileSystem.AppPackageFileExistsAsync(jsonDataFileName);
    if (isExist)
    {
        var stream = await FileSystem.Current.OpenAppPackageFileAsync(jsonDataFileName);
        var reader = new StreamReader(stream);
        var contents = await reader.ReadToEndAsync();
        genericTypeList = JsonSerializer.Deserialize<ObservableCollection<T>>(contents);
    }
    return genericTypeList!;
}

Наблюдение/Ответ

Приведенная выше функция считывает файл JSON как MauiAsset. Этот путь к файлу был указан как «Resources/Raw/MyJsonFile.json» — этот путь отлично работал для Android и Windows, но не понравился iOS.

Теперь это работает, ссылка, которой поделился (@Alexandar May - MSFT) в комментариях ниже, привела меня к решению.

1. Вы тестируете на симуляторе или на реальном устройстве? 2. Что такое SharedDataService, SharedData, Global и что WeatherSettingsService вы используете, узнайте, как создать Минимальный воспроизводимый пример и добавьте его в свой пост.

Alexandar May - MSFT 01.07.2024 11:11

@AlexandarMay-MSFT (1). Симулятор (2). Я переименовал некоторые переменные и удалил несколько строк кода, чтобы сохранить конфиденциальность. (3). SharedDataService предоставляет общие данные между различными проектами (хранящиеся в формате JSON). Отсюда поступают основные данные. Эти данные подвергаются дальнейшей обработке, прежде чем они будут показаны. (4). WeatherSettingsService — это сервис, который используется для настроек приложения. Пока это можно игнорировать.

wafers 01.07.2024 14:28

Я заменил две задачи простой функцией журнала, запускаемой в симуляторе iOS. Он может выполнить функцию и добраться до точки останова. Я думаю, это связано с сервисом, который вы написали в Задачах. Также sharedDataService(должен быть общедоступным).

Alexandar May - MSFT 02.07.2024 09:13

@AlexandarMay-MSFT Я также пробовал просто асинхронные вызовы, даже var file = await FileSystem.AppPackageFileExistsAsync("Resources/Raw/parts.js‌​on"); с await или без него... не работает на iOS. Все остальное работало и работает на Windows и Android. Пробовал на разных симуляторах iOS. читайте об await...async не работает для iOS, и они используют .Result, что абсурдно! Только для iOS я уничтожу производительность на других платформах?! Я уверен, что должен быть другой способ обработки асинхронных вызовов для платформ iOS.

wafers 03.07.2024 16:09

Неработающий FileSystem.AppPackageFileExistsAsync("Resources/Raw/parts.js‌​on") может быть связан с github.com/dotnet/maui/issues/12635, вы можете следить за этим.

Alexandar May - MSFT 04.07.2024 10:45

@AlexandarMay-MSFT Ссылка, предоставленная вами выше, привела меня к решению. Файлы JSON не были прочитаны iOS, и причина была той же, что и в ссылке, предоставленной вами выше. Пожалуйста, сделайте это ответом на вопрос, и я отмечу его как ответ.

wafers 06.07.2024 00:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
130
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это известная проблема, отслеживаемая на Github: AppPackageFileExistsAsync не работает со связанным файлом с активами MAUI № 12635.

Чтобы это исправить, вы можете написать ссылку на ресурсы в своем csproj файле, например:

 <MauiAsset Include = "Resources\Raw\**" LogicalName = "%(RecursiveDir)%(Filename)%(Extension)" />

Затем вы можете прочитать файл следующим образом:

var isExist = await FileSystem.Current.AppPackageFileExistsAsync("MyJsonFile.json");

На самом деле, эта линия является ключевой. <MauiAsset Include = "Resources\Raw\**" LogicalName = "%(RecursiveDir)%(Filename)%(Extension)" />, после в коде просто укажите файл как.... var isExist = await FileSystem.Current.AppPackageFileExistsAsync("MyJsonFile.jso‌​n"); - обратите внимание, что нет упоминания «Raw/». Это нужно сделать таким образом, если вы хотите, чтобы он работал на платформе iOS. @Alexandar May - MSFT, пожалуйста, обновите ответ. это несколько неправильно и вводит в заблуждение.

wafers 08.07.2024 12:18

@wafers Готово, спасибо за исправление. :)

Alexandar May - MSFT 09.07.2024 02:47

Другие вопросы по теме