iOS: доступ к файлу, доступ к которому был предоставлен с расширением, запрещен на устройстве

#ios #file-sharing #ios-extensions

Вопрос:

Моя цель-создать расширение общего доступа iOS (через Xamarin), которое позволит пользователю загружать аудио-или видеофайл через мое приложение на мой сервер через меню общего доступа iOS. Рабочий процесс будет выглядеть так:

  • пользователь открывает аудио-или видеофайл (например, из приложения «Файлы»)
  • нажмите на значок «Поделиться»
  • откроется меню «Поделиться», в котором отображается значок моего приложения в списке
  • пользователь нажимает на значок моего приложения
  • приложение откроется с видом для загрузки содержимого, чтобы пользователь мог настроить некоторые метаданные и, наконец, загрузить файл

Я уже добился этого, сразу открыв Динамическую ссылку из расширения. Ссылка содержит путь к файлу, поэтому основное приложение знает, какой файл загрузить. Это код для получения пути к файлу:

 private async Task<string> GetFileUrlAsync()
{
    var attachment = ExtensionContext
        .InputItems
        .Where(x => x.Attachments != null)
        .SelectMany(x => x.Attachments)
        .First();
        
    var nsUrl = (NSUrl) await attachment.LoadItemAsync(UTType.FileURL, null);
    return nsUrl.Path;
}
 

В симуляторе загрузка работает довольно хорошо по следующему пути:

 /Users/tobiasbuchholz/Library/Developer/CoreSimulator/Devices/4FE06C03-50D2-4613-892B-5A2EA611D26A/data/Containers/Shared/AppGroup/834E4479-1A30-474B-B3EA-1840D14BE4DC/File Provider Storage/sample.mp3
 

С другой стороны, на устройстве я получаю исключение со следующим сообщением:

 System.UnauthorizedAccessException: Access to the path "/private/var/mobile/Containers/Shared/AppGroup/A4F8EE6A-A229-4869-81AE-36FE96F9B5FA/File Provider Storage/ABLAZE/sample.mp3" is denied.
 

Итак, наконец, мой вопрос: есть ли способ обойти эту ошибку на устройстве? Например, параметр Info.plist или что-то в этом роде, которого мне не хватает. Или мне нужно создать группу приложений, скопировать файл с помощью моего расширения в это место и получить доступ к нему в главном приложении оттуда? (что довольно хреново, учитывая дисковое пространство пользователя)